菜鷄日記——《汇编与接口技术》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)=+15OF=04+11=15CF=0
    1000 0111B + 1111 0101B = 0111 1100B(-121)+(-11)=+124OF=1135+245=124CF=1
    0000 0111B + 1111 1011B = 0000 0010B(+7)+(-5)=+2OF=07+251=2CF=1
    0000 1001B + 0111 1100B = 1000 0101B(+9)+(+124)=-123OF=19+124=133CF=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标志外(硬件结构决定),均对标志位有影响

 

01
符号标志 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标志外(硬件结构决定),均对标志位有影响

 01
进位标志 CF被减数最高位没有向高位借位被减数最高位向高位借位
溢出标志 OF无溢出溢出
CMP指令对标志位的影响(CMP OPR1,OPR2)
操作数CFZFSFOF两操作数关系
有符号0100OPR1 = OPR2
-010OPR1 < OPR2
-000OPR1 > OPR2
-011负数减正数得正数溢出,此时OPR1 < OPR2
-001正数减负数得负数溢出,此时OPR1 > OPR2
无符号0100OPR1 = OPR2
10--OPR1 < OPR2
00--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)表示
MUL00乘积高一半(即AH或DX)为0
11乘积高一半不为0
IMUL00乘积高一半(即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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值