DIV指令:
div 指令是8086汇编中的除法运算指令,它的结果不是浮点数,而是两个整数:商和余数。
A / B
其中,A 是被除数,B 是除数 ,
除数B有 8位和16位两种,保存在一个 reg寄存器 里 或是 内存单元 中 ,
被除数 A 默认存放在 AX 中(16位以内)
或 AX 和 DX 中(32位,DX存放高16位,AX存放低16位)
结果:
如果除数 B 是8位,那么除法的结果AL保存商,AH保存余数,
如果除数 B 是16位,那么除法的结果 AX保存商,DX保存余数。
例如:
div byte ptr ds:[0] 含义: (al)=(ax)/((ds)*16+0) 的商 (ah)=(ax)/((ds)*16+0) 的余数
div word ptr es:[0] (高十六位)+(低十六位) 含义: (ax)=[(dx)*10000H+(ax)]/((es)*16+0) 的商 (dx)=[(dx)*10000H+(ax)]/((es)*16+0) 的余数
div byte ptr [bx+si+8] 含义: (al)=(ax)/((ds)*16+(bx)+(si)+8) 的商 (ah)=(ax)/((ds)*16+(bx)+(si)+8) 的余数
div word ptr [bx+si+8] (高十六位)+(低十六位) 含义: (ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 的商 (dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 的余数
运算要求:
除法指令正确执行是有条件的
这个条件是:被除数的高一半,必须小于除数 ,
如果数据不满足这样的条件,被除数的高一半大于或者等于除数,就会产生除法溢出,
若发生除法溢出,会自动触发0号中断 --- 除法溢出中断,
举个粟子:
被除数 1000 ,写成16进制格式是3E8H,
它的高一半(高8位)是03H,低一半(低8位)是0E8H ,
若以它作为被除数,则除数必须大于4(4>03H)才能正确执行 ,
这样,除得的商必然只有 8位,可以正确地保存在AL中 ,
若你的除数是3或更小的 2 、1 甚至 0 ,则在程序运行到这一条除法指令时会发生0号中断出错。
另外 如果做16位除法前需要现将 DX 清零,如:xor dx,dx