blubiu

My Love

上网不网恋,简直浪费电.


汇编语言笔记(七)--DIV指令(除法指令)


前言:

DIV指令(除法指令)。


目录:


DIV指令:

div 指令是8086汇编中的除法运算指令,它的结果不是浮点数,而是两个整数:商和余数。

A / B 其中,A 是被除数,B 是除数 ,

除数B8位16位两种,保存在一个 reg寄存器 里 或是 内存单元 中 ,

被除数 A 默认存放在 AX 中(16位以内)

AXDX 中(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或更小的 21 甚至 0 ,则在程序运行到这一条除法指令时会发生0号中断出错。


另外 如果做16位除法前需要现将 DX 清零,如:xor dx,dx


总结

DIV指令(除法指令)。