zoukankan      html  css  js  c++  java
  • 168.算术指令

    1 算术指令

     加法指令
    ADD、ADC、INC
     减法指令
    SUB、SBB、DEC、NEG、CMP
     乘法指令
    MUL、IMUL
     除法指令
    DIV、IDIV
     十进制调整指令
    DAA、DAS、
    AAA、AAS、AAM、AAD

    2 加法指令

    2.1指令

    加法指令: ADD DST, SRC
    执行操作: (DST) ← (SRC) + (DST)

    带进位加法指令: ADC DST, SRC
    执行操作: (DST) ← (SRC) + (DST) + CF

    加1指令: INC OPR
    执行操作: (OPR) ← (OPR) + 1

    注意:
    * 除INC指令不影响CF标志外,均对条件标志位有影响。

    2.2 加法指令对条件标志位的影响

    举例: n=8 bit 带符号数(-128~127) , 无符号数(0~255)

     

    例:双精度数的加法

    (DX) = 0002H (AX) = 0F365H
    (BX) = 0005H (CX) = 8100H

    指令序列 ADD AX, CX ; (1)
         ADC DX, BX ; (2)

    (1) 执行后,(AX) = 7465H
           CF=1 OF=1 SF=0 ZF=0
    (2) 执行后,(DX) = 0008H
           CF=0 OF=0 SF=0 ZF=0

    3减法指令

    3.1指令

    减法指令: SUB DST, SRC      (subtract)
    执行操作: (DST) ← (DST) - (SRC)

    带借位减法指令: SBB DST, SRC         (subtract with borrow)
    执行操作: (DST) ← (DST) - (SRC) - CF

    减1指令: DEC OPR     (decrement)
    执行操作: (OPR) ← (OPR) - 1

    求补指令: NEG OPR            (negate)
    执行操作: (OPR) ← - (OPR)            (OPR)← 0FFFF - (OPR)+ 2

    把操作数按位求反后末位加一

    比较指令: CMP OPR1, OPR2     (compare)
    执行操作: (OPR1) - (OPR2)

    注意:
    * 除DEC指令不影响CF标志外,均对条件标志位有影响。

    3.2对条件标志位(CF/OF/ZF/SF)的影响

    3.2.1减法指令对条件标志位(CF/OF/ZF/SF)的影响

     

    3.2.2NEG 指令对CF/OF的影响

     

    例:x、y、z 均为双精度数,分别存放在地址为X, X+2;Y, Y+2;Z, Z+2的存储单元中,

    用指令序列实现w ← x + y + 24 - z ,并用W, W+2单元存放w

    MOV  AX,  X
    MOV  DX,  X+2
    ADD  AX,  Y
    ADC  DX,  Y+2      ;  x+y
    ADD  AX,  24
    ADC  DX,  0        ;  x+y+24
    SUB  AX,  Z
    SBB  DX,  Z+2      ;  x+y+24-z
    MOV  W,   AX
    MOV  W+2, DX       ;  结果存入W, W+2单元

    4乘法指令

    4.1指令

    无符号数乘法指令: MUL SRC
    带符号数乘法指令: IMUL SRC

    执行操作:
    字节操作数 (AX) ← (AL) * (SRC)
    字操作数 (DX, AX) ← (AX) * (SRC)

    注意:
    * AL (AX) 为隐含的乘数寄存器。
    * AX (DX,AX) 为隐含的乘积寄存器。
    * SRC不能为立即数。
    * 除CF和OF外,对条件标志位无定义

     4.2乘法指令对 CF/OF 的影响

     

    例:(AX) = 16A5H,(BX) = 0611H

    (1) IMUL BL   ; (AX) ← (AL) * (BL)
            ; A5*11 =》 5B*11=060B =》 F9F5
            ; (AX) = 0F9F5H CF=OF=1

    (2) MUL BX    ; (DX, AX) ← (AX) * (BX)
            ; 16A5*0611=0089 5EF5
            ; (DX)=0089H (AX)=5EF5H CF=OF=1

     5.除法指令

     5.1指令

    无符号数除法指令: DIV SRC
    带符号数除法指令: IDIV SRC


    执行操作:
    字节操作 (AL) ← (AX) / (SRC) 的商
         (AH) ← (AX) / (SRC) 的余数

    字操作 (AX) ← (DX, AX) / (SRC) 的商
        (DX) ← (DX, AX) / (SRC) 的余数

    注意:

    * AX (DX,AX) 为隐含的被除数寄存器。
    * AL (AX) 为隐含的商寄存器。
    * AH (DX) 为隐含的余数寄存器。
    * SRC不能为立即数。
    * 对所有条件标志位均无定义。如何判别结果有效?

    例:x , y , z , v 均为16位带符号数,计算
    ( v - ( x*y + z – 540 ) ) / x

    MOV   AX, X 
    IMUL  Y          ;  x*y →(DX,AX)
    MOV   CX, AX
    MOV   BX, DX
    MOV   AX, Z
    CWD              ;Z →(DX,AX)
    ADD   CX, AX
    ADC   BX, DX     ;  x*y+z →(BX,CX)
    SUB   CX, 540 
    SBB   BX, 0      ;  x*y+z-540
    MOV   AX, V
    CWD              ;V →(DX,AX)
    SUB   AX, CX
    SBB   DX, BX     ;  v-(x*y+z-540)
    IDIV  X          ;  (v-(x*y+z-540))/x→(AX)
                                       余数→(DX)

     6.十进制调整指令

    6.1BCD码

    BCD码:用二进制编码的十进制数,又称二--十进制数  (binary code decimal)
    压缩的BCD码:用 4 位二进制数表示 1 位十进制数
           例:( 59 )10 =( 0101 1001 )BCD
    非压缩的BCD码:用 8 位二进制数表示 1 位十进制数
           例:( 59 )10 =( 0000 0101 0000 1001 )BCD

    数字的 ASCII 码是一种 非压缩的 BCD 码
    DIGIT ASCII BCD
    0 30H 0011 0000
    1 31H 0011 0001
    2 32H 0011 0010
    … … …
    9 39H 0011 1001

    例:写出( 3590 )10的压缩 BCD 码和非压缩BCD码,并分
    别 把它们存入数据区 PAKED 和 UNPAK

    压缩BCD: ( 3590 )10=( 0011 0101 1001 0000 )BCD

    非压缩BCD:
    ( 3590 )10=( 00000011 00000101 00001001 00000000 )BCD

     

    问题的提出:

    6.2指令

    (1)压缩的BCD码调整指令
    ● DAA 加法的十进制调整指令 (decimal adjust for addition)
    ● DAS 减法的十进制调整指令(decimal adjust for subtraction)


    (2)非压缩的BCD码调整指令
    ● AAA 加法的ASCII码调整指令 (ASCII adjust for addition)
    ● AAS 减法的ASCII码调整指令 (ASCII adjust for subtraction)
    ● AAM 乘法的ASCII码调整指令 (ASCII adjust for multiplication)
    ● AAD 除法的ASCII码调整指令 (ASCII adjust for devision)

    压缩BCD运算举例:
    (1)       MOV      AL, BCD1         ; BCD1=34H
               ADD       AL, BCD2         ; BCD2=59H,   (AL)=8DH
               DAA                        ;  8DH+06H=93H
               MOV      BCD3, AL          ; BCD3=93H
    (2)       MOV      AL, BCD1          ; BCD1=34H
               SUB        AL, BCD2        ; BCD2=59H ,   (AL)=0DBH
               DAS                        ;  0DBH-60H-06H=75H
               MOV      BCD3, AL          ; BCD3= 75 = - 25  (10^n’补码)
    非压缩BCD运算举例:
    (1) MUL      BL          ; (AX)=(AL)×(BL)=08 × 09
                 AAM          ; (AL)/0AH= 48H /0AH→ 07022)AAD                   ; (AX) →(AH) ×0AH+(AL)=48H
        DIV       BL         ; (AL) = (AX)/(BL)=48H/4=12H
        AAM                   ; (AL)/0AH=12H/0AH=0108

     

     

     

     

  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11051758.html
Copyright © 2011-2022 走看看