div指令

div是除法指令,使用div做除法要注意以下问题:

(1)除数:有八位和十六位两种,在一个寄存器reg中或者在一个内存单元中。

(2)被除数:默认放在AX 或者 DX和AX中,如果除数为8位,被除数则为16位,默认被除数存放在AX中
如果除数为16位,则被除数为32位,被除数存放在DX和DX中(DX存放高16位,AX存放低16位)

(3)结果:如果除数为8位,则储存在AL中,余数储存在AH中
如果除数为16位,则AX储存,DX储存余数

不要强行记忆这些规则,去做题理解!

格式:
div 寄存器
(这里的八位寄存器包括:BL,CL,DL,DH,CH,BH)为什么没有al和ah?用去存放被除数了
div 内存单元

现在可以用多个方法来表示一个内存单元了:

mov ax,16
mov bl,3
div bl ; al = 5(商) , ah = 1(余数)
除数为八位,则al存放商,ah存放余数,被除数是存放在ax中的

假设db 16,0,0,3,0,0ffh,0ffh,0,0,0,0,0,0,0,0
mov ax,ds:[0] ;ax保存低16位
mov dx,ds:[2] ;dx存放高16位
mov bx,3
div bx ;ax=5(商),dl=1(余数)
或者 div word ptr ds:[4]

案例:
编程,利用除法指令计算100001/100.(这是一个十六位除法)
分析:
被除数100001超过了16位寄存器AX所能保存的最大值(FFFFH——》65535),所以不能用AX存放被除数,也就是说要进行16位除法。
除数100小于255,可以在一个八位寄存器中存放,但是因为被除数是32位的,除数也应该为16位,所以要用一个十六位寄存器来存放除数100。

被除数默认存放在AX中,或者存放在AX和DX中
如果除数为8位,被除数则为16位,默认存放在AX中——叫做8位除法(al存放商,ah存放余数)
如果除数为16位,被除数则为32位,DX存放高16位,AX存放在低16位——将16位除法(AX存放商,DX存放余数)

因为要分别为DX和AX赋予100001(186A1H)的高16位值(0001H)和低16位(86A1H)值
代码如下:

mov dx,1       ;将高16值0001H存放在DX
mov ax,86A1H   ;将低16位值86A1H存放在AX
mov bx,100     ;将除数100存放在一个十六位寄存器中
div bx         ; 结果应该是AX=03E8H(商),DX=1(余数)

编程,利用除法指令计算1001/100(这是一个八位除法)
分析:
被除数1001可以用ax存放,除数100可以用八位寄存器存放,也就是说要进行八位除法
代码如下:

mov ax,1001   ;被除数存放在AX
mov bl,100		;除数存放在一个八位寄存器中(bl,cl,dl...除了al)
div bl  ;程序执行后al=0AH(即10)为商,ah=1(为余数)

编程,利用除法指令计算1001/256(分析知道要用16位除法)
分析:被除数1001可以存放在十六位寄存器AX中,但是除数256不能存放在一个八位寄存器中(超过255),所有要将被除数1001存放在32位寄存器(也就是将高16位存放在DX,低16位存放在AX)
代码如下:

mov ax,1001
mov dx,0000
mov bx,256
div bx  ;程序执行后ax=0003H储存商,DX储存余数

版权声明:本文为Waffle666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。