菜鷄日記——《汇编与接口技术》第3-3章 80X86指令系统 之 算术指令 & 逻辑指令

算术指令

有符号数算术运算与标志OF:

  1. 有符号数运算用补码表示,带符号运算
  2. 溢出时OF=1,不溢出时OF=0
  3. 两异号数加减无溢出,两同号数加减可能溢出
  4. An、Bn、Sn分别代表两加数和结果的符号位,则第3点的数学表示为:OF=(﹁An∧﹁Bn∧Sn)∨(An∧Bn∧﹁Sn)
  5. 溢出标志OF与进位标志CF不同时使用,如下:
      带符号   无符号  
    0000 0100B + 0000 1011B = 0000 1111B (+4)+(+11)=+15 OF=0 4+11=15 CF=0
    1000 0111B + 1111 0101B = 0111 1100B (-121)+(-11)=+124 OF=1 135+245=124 CF=1
    0000 0111B + 1111 1011B = 0000 0010B (+7)+(-5)=+2 OF=0 7+251=2 CF=1
    0000 1001B + 0111 1100B = 1000 0101B (+9)+(+124)=-123 OF=1 9+124=133 CF=0
  6. 指令系统提供了溢出终端指令判断有无溢出,若溢出则调用终端服务程序
  • 加法指令:ADD、ADC、INC

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

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

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

除了INC指令不影响CF标志外(硬件结构决定),均对标志位有影响

 

0 1
符号标志 SF 结果为正 结果为负
零标志     ZF 结果为0 结果为0
进位标志 CF 最高有效位进位 最高有效位进位
溢出标志 OF 无溢出 溢出
  • 减法指令:SUB、SBB、DEC、NEG、CMP

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

带借位减法:SBB DST,SRC    执行操作:(DST)←(DST)-(SRC)-CF

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

取反指令:NEG OPR    执行操作:(OPR)← -(OPR)

                  也可以看成操作数带符号取反后末位+1,即 (OPR)←0FFFFH-(OPR)+1

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

                  注意:运算结果不储存,只是设置标志位

                  OPR1和OPR2可以是寄存器或存储器,但不能同时是存储器,OPR2还能是立即数

除了DEC指令不影响CF标志外(硬件结构决定),均对标志位有影响

  0 1
进位标志 CF 被减数最高位没有向高位借位 被减数最高位向高位借位
溢出标志 OF 无溢出 溢出
CMP指令对标志位的影响(CMP OPR1,OPR2)
操作数 CF ZF SF OF 两操作数关系
有符号 0 1 0 0 OPR1 = OPR2
- 0 1 0 OPR1 < OPR2
- 0 0 0 OPR1 > OPR2
- 0 1 1 负数减正数得正数溢出,此时OPR1 < OPR2
- 0 0 1 正数减负数得负数溢出,此时OPR1 > OPR2
无符号 0 1 0 0 OPR1 = OPR2
1 0 - - OPR1 < OPR2
0 0 - - OPR1 > OPR2
  • 乘法指令:MUL、IMUL

无符号数乘法指令:MUL SRC

有符号数乘法指令:IMUL SRC

执行操作都是:1)字节操作:AX←AL*(SRC)

                         2)字操作:(DX,AX)←AX*(SRC)

1)AL、AX为隐含的乘数寄存器,AX、(DX,AX)为隐含的乘积寄存器

2)SRC不能为立即数,因为位宽不确定

3)使用字节操作还是字操作取决于SRC位宽

4)乘法指令不会产生溢出和进位,此时CF和OF用于表示乘积有效长度

除CF和OF外,对标志位无定义

  (CF,OF) 表示
MUL 00 乘积高一半(即AH或DX)为0
11 乘积高一半不为0
IMUL 00 乘积高一半(即AH或DX)是低一半(即AL或AX)的符号扩展
11 乘积高一半不是低一半的符号扩展
  • 除法指令:DIV、IDIV
  • 十进制调整指令:DAA、DAS、AAA、AAS、AAM、AAD

逻辑指令

  • 逻辑运算指令:NOT、AND、OR、XOR、TEST

逻辑非:NOT OPR    执行操作:(OPR)←﹁(OPR)

               OPR不能为立即数,不影响标志位

逻辑与:AND DST,SRC    执行操作:(DST)←(DST)∧(SRC)

逻辑或:OR DST,SRC    执行操作:(DST)←(DST)∨(SRC)

异或:XOR DST,SRC    执行操作:(DST)←(DST)⊕(SRC)

测试指令:TEST OPR1,OPR2    执行操作:(OPR1)∧(OPR2)

最后4条指令:CF=0,OF=0,SF、ZF、PF根据结果设置,AF无定义

  • 移位指令:SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR

逻辑左移:SHL OPR,CNT

逻辑右移:SHR OPR,CNT

算术左移:SAL OPR,CNT

算术右移:SAR OPR,CNT

循环左移:ROL OPR,CNT

循环右移:ROR OPR,CNT

带进位循环左移:RCL OPR,CNT

带进位循环右移:RCR OPR,CNT 

执行操作如图:

1)OPR可用除立即数外的任何寻址方式

2)CNT=1时可以使用立即数表示,CNT>1时移位次数需先存放在CL中

3)CF=移入的数值,CNT=1且最高有效位值发生变化时OF=1,CNT=1但最高有效位值无变化时OF=0,CNT>1时                   OF无意义

4)对于移位指令,SF、ZF、PF根据移位结果设置,AF无意义

5)循环移位指令不影响SF、ZF、PF、AF

猜你喜欢

转载自blog.csdn.net/Wyatt__Liu/article/details/82964303