• 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

     

     

     

     

  • 相关阅读:
    Python基础教程:多线程运行带多个参数的函数
    Python基础教程:list相关操作
    python字典教程:setdefault方法和get方法
    Python 异常处理集合
    python基础教程:5个带key的python内置函数
    python操作Excel的5种方式
    Python3压缩和解压缩实现
    jenkins 分布式配置主从节点
    CentOS7 free字段含义
    nginx配置https
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11051758.html
Copyright © 2020-2023  润新知