汇编idiv带符合除法指令。。。。

来源:互联网 发布:小米盒子 电视直播软件 编辑:程序博客网 时间:2024/06/07 00:32
汇编基础一日一学习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 。 

转自:http://hi.baidu.com/txuqbajotfnstvr/item/33f8249c3b6d1cb4cd80e5f7

这个博客里面的一些文章也可以都看一看,还不错

0 0
原创粉丝点击