5:整数算术

来源:互联网 发布:网络下载速度慢怎么办 编辑:程序博客网 时间:2024/05/21 08:41

移位和循环移位指令

         逻辑移位和算术移位

                   逻辑移位即以0填充最后移除的位。

                   算术移位是以原来的符号为填充移除的位

 

         SHL指令

                   对操作数进行逻辑左移操作,最低位以0填充,移出的最高位送入进位标志(CF),原来进位标志的值将丢失

                   格式:        SHL            目的操作数,移位位数

ð  SHL    reg,imm8

ð  SHL    mem,imm8

ð  SHL    reg,CL

ð  SHL    mem,CL

 

Eg:   mov           b1,8Fh

         SHL            b1,1                             ;CF=1,b1=00011110b

                   快速乘法

                            使用SHL指令 可以进行2的次幂的高速乘法操作,任何操作数左移n位就是相当于乘以2n次幂

                            Eg                   mov           dl,10

                                               Shl             dl,2                              ;10*(22次方)

 

         SHR指令

                   对操作数进行逻辑右移操作,移出的数据位以0代替,最低位被复制到进位标志中,原来的进位标志将丢失

                            Eg         mov                    al,0D0h

                                     Shr                      al,1                              ;AL=01101000b,CF=0

                   快速除法

                            任何无符号操作数逻辑右移动n位就是相当于该操作数除以2n次幂

                            Eg:             mov           dl,32

                                               Shr            dl,2                              ;dl=32/2/2=8

         SALSAR指令

                   SAL指令和SHL相同,执行逻辑左移。SAR指令对目的操作数执行算术右移操作

                            Eg         mov           al,0f0h                                  ;al=11110000b-16

                                     SAR           al,1                                        ;al=11111000b-8,CF=0

                           

                            有符号数的除法

                                     使用SAR指令可以对有符号数进行除以2的次幂的快速操作

                                               Eg:   mov           dl,-128                        ;10000000b

                                                        Sar            dl,3                              ;11110000b

                            符号扩展AXEAX

                                     先左移EAX16位,在算术右移EAX16

                                     Eg         mov           ax,-128                                 ;????FF80h

                                               Shl             eax,16                                  ;FF800000h

                                               Sar            eax,16                                  ;FFFFFF80h

 

 

                   ROL指令

                            循环左移,移动后把最高位复制到进位标志中。数据从一段移走后会在另一段出现

                            Eg:   mov           al,40h                                   ;01000000b

                                     Rol            al,1                                       ;10000000b               ;CF=0

                                     Rol             al,1                                        ;00000001b               ;CF=1       

                                    

                   ROR指令

                            循环右移,移动后把最高位复制到进位标志中。数据从一段移走后会在另一段出现

                            Eg:   mov           al,40h                                   ;01000000b

                                     RoR           al,1                                       ;00100000b               ;CF=0

                                     RoR           al,1                                        ;00010000b               ;CF=0       

                                    

                   RCLRCR指令

                            RCL指令在每位左移一位后,把进位标志送到最低有效位中,把最高有效位复制到进位标志中。

                                     Eg         clc                                                   ;CF=0

                                               Mov                    bl,88h                ;CF=0,bl=10001000b

                                               Rcl                       bl,1                     ;CF=1,bl=00010000b

                                               Rcl                       bl,1                     ;CF=0,bl=00100001b

                            RCR指令在每位右移一位后,把进位标志送到最高有效位中,把最低有效位复制到进位标志中。

                                     Eg         clc                                                   ;CF=0

                                               Mov                    bl,88h                ;CF=0,bl=10001000b

                                               RcR                     bl,1                     ;CF=0,bl=01000100b

                                               Rc                        bl,1                     ;CF=0,bl=00100010b

                   符号溢出

                            。。。。。。。。。。。。。

 

                   SHLDSHRD指令

                            SHLD指令把目的操作数左移指定的位数,左移空出来的位用源操作数的高位来填充       

                                     格式:        SHLD         目的操作数,源操作数,移位位数

ð          SHLD          reg16,reg16,CL/imm8

ð          SHLD          mem16,reg16,CL/imm8

ð          SHLD          reg32,reg32,CL/imm8

ð          SHLD          mem32,reg32,CL/imm8

Eg:             .data                 

                   Wval         WORD      9ba6h

                   .code

                   Mov          ax,0ac36h

SHLD    wval,ax,4                              ;wal左移4位,把ax4位插入wval4

                            SHRD指令把目的操作数右移指定的位数,右移空出来的位用源操作数的低位来填充      

                                     格式:        SHRD        目的操作数,源操作数,移位位数

                           

                                               Egmov           ax,234bh

                                                        Mov          dx,7654h

Shrd     ax,dx,4                             ;ax右移4位,ax的高4位由dx4位填充

 

 

乘法和除法指令

         MUL指令 无符号乘法

                   格式:     MUL                   r/m8         操作数与AL相乘            积为AX

                                     MUL                   r/m16       操作数与AX相乘            积为DX:AX

                                     MUL                   r/m32       操作数与EAX相乘         积为EDX:EAX

 

                            注意:DXEDX存储结果时,如果DXEDX不为0则进位标志置位

 

                   Eg         mov           eax,12345h

                            Mov          ebx,10000h

                            Mul           ebx                                                 ;EDX:EAX=0000000012345000h,CF=0

         IMUL指令 有符号乘法

                   单操作数

                            单操作数格式把乘积存储在累加器(AX,DX:AX,EDX,EAX)

ð  IMUL                   r/m8

ð  IMUL                   r/m16

ð  IMUL                   r/m32

 

                            Eg:   mov           eax,4823424

                                     Mov          ebx,-423

                                     Imul          ebx                               ;EDX:EAX=FFFFFFFF86635D80h,OF=0

                   双操作数

                            乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器,内存操作数或立即数

ð  IMUL                   r16,r/m16

ð  IMUL                   r16,imm8

ð  IMUL                   r16,imm16

--------------------------------

ð  IMUL                   r32,r/m32

ð  IMUL                   r32,imm8

ð  IMUL                   r32,imm32

 

 

                            Eg:   mov           ax,-16

                                     Mov          bx,2

                                     Imul          bx,ax                           ;bx=-32

 

 

                   三操作数

                            乘积存储在第一个操作数中,一个16进制的寄存器可以被一个8位或16位的立即数乘。同理 一个32位的寄存器合一被一个8位或32位的寄存器乘

ð  IMUL                   r16,r/m16,imm8

ð  IMUL                   r16,r/m16,imm16

---------------------------------

ð  IMUL                   r32,r/m32,imm8

ð  IMUL                   r32,r/m32,imm32

 

Eg:   .data        

         Word1      SWORD    4

         Dword1    SDWORD 4

         .code

         Imul bx,word1,-16                               ;BX=-64

         Imul ebx,dword1,-16                          ;EBX=-64

         Imul ebx,dword1,-20000000            ;OF=1   溢出

 

         DIV指令

                   无符号除法,执行8位,16位或32位无符号整数除法。

 

                                                                           除数                                 余数

ð  DIV    r/m8                   r/m8                   AL              AH

ð  DIV  r/m16               r/m16                AX              DX

ð  DIV  r/m32               r/m32                EAX           EDX

 

Eg:   mov           dx,0

         Mov          ax,8003h

         Mov          cx,100h

         Div            cx                                 ;AX=0080h,CX=0003h

        

         有符号整数除法

                   符号扩展指令(CBW,CWD,CDQ)

                            CBW指令(字节符号扩展至字)扩展AL的符号位至AH中,保留数字的符号

                                     Eg:   mov           al,-101                        ;AL=9bh

                                              Cbw                                              ;AX=FF9bh

                            CWD指令(字符号扩展至双字)扩展AX符号至DX

                                     Eg:   mov           ax,FF9bh           ;AX=FF9Bh

                                               Cwd                                      ;DX:AX=FFFFFF9Bh

                            CDQ指令(双字节扩展至8字节)扩展EAX中的符号位至EDX

                                     Eg:   mov           eax,FFFFFF9Bh                             ;EAX=FFFFFF9Bh

                                               CDQ                                                                  ;EDX:EAX=FFFFFFFFFFFFFF9Bh

 

         IDIV指令

                   进行有符号整数的除法运算,格式和DIV一样,在进行计算前,需要进行符号扩展

                            Eg         .data

                                     wordVal   SWORD    -5000

                                     .code

                                     Mov          ax,wordVal

                                     Cwd

                                     Mov          bx,+256

                                     Idiv            bx                        ;AX=-9,余数DX=-136

 

         除法溢出

                   如果商太大,目的操作数不能容纳,那么会导致溢出。如果除数是0 也会溢出

 

 

扩展加法和减法

         任意尺寸大小数字的加减法

         ADC指令

                   该指令把源操作数、目的操作数以及进位标志相加,格式于Mov指令相同

                            Egmov           edx,0

                                     Mov          eax,0FFFFFFFFh

                                     Add         eax,0FFFFFFFFh

                                     Adc           eax,0                                   

 

         SBB指令

                   从目的操作数中减去源操作数和进位标志的值。指令允许的操作数与ADC一样

               

                               指令格式:sbb 操作对象1,操作对象2

                               功能:操作对象1=操作对象1-操作对象2-CF

 

原创粉丝点击