汇编idiv带符合除法指令。。。。
汇编基础⼀⽇⼀学习33
⼤家好,今天我们来学习下有符号整数除法指令 IDIV,此指令进⾏有符号的除法运算,使⽤的操作数格式与DIV指令格式相同。在进⾏8位除法之前,被除数(AX)必须进⾏符号扩展,余数的符号和被除数总是相同。
那么符号扩展顾名思义其实就是将它的符号位进⾏扩展,那么符号扩展有⽆相关的指令呢?当然有,那就是CBW CWD CDQ 指令。
⾸先看CBW指令,CBW指令是将(字节扩展⾄字)。我们从它后⾯的两个后缀就可以看的出来。B =byte - W = word 。这个指令将扩展al的符号位⾄ah中。
接着CWD指令,是将字符号扩展⾄双字。W = WORD , D = DWORD 。这样我们就不需要去记。看下就OK了。这个指令将扩展ax的符号位⾄dx中。
CDQ指令将双字符号扩展⾄8字节,指的是扩展eax的符号位⾄edx寄存器中。
1.举个例⼦ 10进制 -66。
-66 = -42h ;⼗六进制
去反码后 = 0BEh
mov al, -66
cbw
那么此刻al = 0BEh ,此刻执⾏cbw,刚刚说了cbw是将字节扩展⾄字。这个指令将al的符号为扩展⾄ah中。
⼤家猜测下cbw指令执⾏完, ax等于多少。。
我想⼤家不约⽽同会说等于FFBEh 。就是将我们的al符号位扩展⾄ah寄存器中。
2.
同样cwd也是⼀样的。只是cwd是将ax的符号位扩展⾄dx中。
举例
mov ax, 0FFEBh
cwd
此刻cwd质量将我们ax寄存器的符号位扩展⾄dx寄存器中,所以此刻执⾏完后。 dx = FFFFh ax= FFBEh
我就不举例cdq指令,很简单,⼤家⾃⼰想⼀下,就是将eax的符号位扩展⾄edx寄存器中。
介绍了上⾯的符号扩展我们现在来学习IDIV有符号除法指令,我们在进⾏有符号整数除法指令运算时候,⼀定要记得被除数进⾏符号扩展。余数的符号和被除数的符号相同。
1.举个例⼦
mov al, -66
cbw
mov bl, 5
idiv bl
很明显执⾏第⼀句指令的时候al = 0EBh, 此刻执⾏cbw扩展指令,此刻我们的ax = 0FFEBh,然后此刻
我们进⾏给bl传送⽴即数5,然后通过idiv 指令进⾏除法,⼤家是否还记得div指令操作8位除数的时候,商和除数保存在那⾥呢?呵呵商保存在al中,余数保存在ah中。
那么⼤家想象最后执⾏完后 al =? ah = ?
注意商和余数是正数还是负数,由于我们除后,我们的商还是负数 ,注意看上⾯说的,不管怎么样我们的余数的符号位和被除数的符号位是相同的,所以此时余数也是负数。
我们来计算下, al = -13 = -0dh ,ah = -01h
我们求反码。
-0d
15 - 0 = F
15 - D = 2
+1 = F3h
很明显al = F3h
-01
15 - 0 = F
15 - 1 = E
+1
ah = FF
最终我们可以计算出来ah = 0FFh
al = 0F3h
2.
mov ax, -6000
cwd
mov bx, 300
idiv bx
-6000 = -1770h
我们求反码
15 - 1 = E
15 - 7 = 8
15 - 7 = 8
15 - 0 = F
+1
= E890h
此刻ax = E890h
执⾏cwd指令后,我们的字扩展双字,ax = E890h dx = FFFFh
然后执⾏mov bx, 300
300转换16进制
汇编指令有多少个bx = 012ch
此刻我们在通过idiv指令进⾏除法运算。 16位我们的商是存在ax寄存器,余数在dx寄存器中。
我们计算下:
ax = -20
= -14h
我们取反码
15 - 1 = E
15 - 4 = B
EB + 1 = ECh
那么我们的ax =? 等于00EC? 当然不是了, 因为我们要保留符号位的,所以此刻ax = FFECh 。
余数由于是0,所以dx= 0000h 。
这个博客⾥⾯的⼀些⽂章也可以都看⼀看,还不错
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论