算术指令
有符号数算术运算与标志OF:
- 有符号数运算用补码表示,带符号运算
- 溢出时OF=1,不溢出时OF=0
- 两异号数加减无溢出,两同号数加减可能溢出
- An、Bn、Sn分别代表两加数和结果的符号位,则第3点的数学表示为:OF=(﹁An∧﹁Bn∧Sn)∨(An∧Bn∧﹁Sn)
- 溢出标志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 - 指令系统提供了溢出终端指令判断有无溢出,若溢出则调用终端服务程序
- 加法指令: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标志外(硬件结构决定),均对标志位有影响
CMP指令对标志位的影响(CMP OPR1,OPR2)
0 1 进位标志 CF 被减数最高位没有向高位借位 被减数最高位向高位借位 溢出标志 OF 无溢出 溢出
操作数 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