汇编语言中常用指令对标志位寄存器的影响

参考了《汇编语言 基于x86处理器》第七版
转载请注明出处
如果有错误的地方请指正,谢谢。

文章目录

  • 算术运算(ADD/SUB)影响标志位
    • ADD指令
    • SUB指令
    • NEG指令
  • INC/DEC指令影响标志位
    • INC指令
    • DEC指令
  • 布尔指令影响标志位
    • AND指令
    • OR指令
    • NOT指令
    • XOR指令
    • TEST指令
  • 移位指令影响标志位
    • 逻辑移位(SHL/SHR)
    • 算术移位(SAL/SAR)
    • 循环移位(ROL/ROR)
    • 带进位的循环移位(RCL/RCR)
    • 双精度移位(SHLD/SHRD)
  • 乘/除法影响标志位
    • 无符号乘法(MUL)
    • 有符号乘法(IMUL)
      • 单操作数
      • 双操作数
      • 三操作数
  • 无符号除法(DIV)
  • 有符号除法(IDIV)

算术运算(ADD/SUB)影响标志位

ADD指令

  1. 有符号:
    两数相加,如果超过有符号数最大取值范围时(如8位有符号数大于127),OF置位。

  2. 无符号:
    两数相加,如果超过无符号数最大取值范围时(如8位无符号数最大取255)CF置位。

         根据目标操作数修改:OF/CF/ZF/SF/AF/PF

示例:-128-1执行后,CF标志位与OF标志位分别是多少? CF=0 OF=1

SUB指令

  1. 有符号:
    两数相减,如果超过有符号数最小取值范围时(如8位有符号数小于-128),OF置位。

  2. 无符号:
    两数相减,如果被减数小于减数,CF置位。

         根据目标操作数修改:OF/CF/ZF/SF/AF/PF

示例:-128+1执行后,CF标志位与OF标志位分别是多少? CF=0 OF=0

NEG指令

  • NEG是汇编指令中的求补指令,NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1。
  • 对任何非0的操作数使用NEG指令都将CF置位。
  • 根据目标操作数修改:CF/OF/ZF/SF/AF/PF

INC/DEC指令影响标志位

INC指令

  • 不影响进位标志位,根据目标操作数修改溢出标志位、符号标志位、奇偶标志位、零标志位,辅助进位标志位。 OF/SF/PF/ZF/AF

DEC指令

  • 不影响进位标志位,根据目标操作数修改溢出标志位、符号标志位、奇偶标志位、零标志位,辅助进位标志位。 OF/SF/PF/ZF/AF

布尔指令影响标志位

布尔指令:AND/OR/NOT/XOR/TEST

AND指令

  • 清除进位标志位和溢出标志位,根据目标操作数修改符号标志位、奇偶标志位、零标志位,辅助进位标志位无定义。 SF/PF/ZF

OR指令

  • 清除进位标志位和溢出标志位,根据目标操作数修改符号标志位、奇偶标志位、零标志位,辅助进位标志位无定义。 SF/PF/ZF

NOT指令

  • 不修改标志位

XOR指令

  • 清除进位标志位和溢出标志位,根据目标操作数修改符号标志位、奇偶标志位、零标志位,辅助进位标志位无定义。 SF/PF/ZF

TEST指令

  • 清除进位标志位和溢出标志位,根据目标操作数修改符号标志位、奇偶标志位、零标志位,辅助进位标志位无定义。 SF/PF/ZF

移位指令影响标志位

移位指令:逻辑移位(SHL/SHR)、算术移位(SAL/SAR)、循环移位(ROL/ROR)、带进位的循环移位(RCL/RCR)、双精度移位(SHLD/SHRD)

逻辑移位(SHL/SHR)

  • 进位标志位为移入CF的位
  • 根据目标操作数修改溢出标志位、符号标志位、零标志位、奇偶标志位,辅助进位标志位无定义。 CF/OF/SF/ZF/PF

算术移位(SAL/SAR)

  • 进位标志位为移入CF的位
  • 根据目标操作数修改溢出标志位、符号标志位、零标志位、奇偶标志位,辅助进位标志位无定义。 CF/OF/SF/ZF/PF

循环移位(ROL/ROR)

  • 进位标志位为移入CF的位
  1. 移位次数等于1时:
    如果移位后的符号与移位前的符号相反,溢出标志位置位。

  2. 移位次数大于1时:
    溢出标志位无定义。

  • 不修改符号标志位、零标志位、奇偶标志位、辅助进位标志位。

带进位的循环移位(RCL/RCR)

  • 进位标志位为移入CF的位
  1. 移位次数等于1时:
    如果移位后的符号与移位前的符号相反,溢出标志位置位。

  2. 移位次数大于1时:
    溢出标志位无定义。

  • 不修改符号标志位、零标志位、奇偶标志位、辅助进位标志位。

双精度移位(SHLD/SHRD)

  • 进位标志位为移入CF的位

  • 根据目标操作数修改溢出标志位、符号标志位、零标志位、奇偶标志位,辅助进位标志位无定义。
    CF/OF/SF/ZF/PF

乘/除法影响标志位

包括无符号乘法(MUL)、有符号乘法(IMUL)、无符号除法(DIV)、有符号除法(IDIV)

无符号乘法(MUL)

  • 如果乘积的高半部分不为0则进位标志位、溢出标志位置位。
    也就是说运算结果超过无符号数最大取值范围(如8位无符号数大于255),则进位标志位、溢出标志位置位。

  • 符号标志位、零标志位、辅助进位标志位、奇偶标志位无定义

有符号乘法(IMUL)

单操作数

  • 如果乘积的高半部分不是低半部分符号位的扩展,那么进位标志位、溢出标志位置位。
  • 也就是说运算结果不在8位有符号数取值范围内(如8位有符号数取值:-27 ~ 27-1),进位标志位、溢出标志位置位。
  • 符号标志位、零标志位、辅助进位标志位、奇偶标志位无定义

双操作数

  • 按照目标操作数的大小来截取乘积,如果被丢弃的是有效位,那么进位标志位、溢出标志位置位。
  • 也就是说运算结果不在8位有符号数取值范围内(如8位有符号数取值:-27 ~ 27-1),进位标志位、溢出标志位置位。
  • 符号标志位、零标志位、辅助进位标志位、奇偶标志位无定义

三操作数

同双操作数

无符号除法(DIV)

执行DIV或IDIV后,所有算术运算状态标志位的值都不确定。

有符号除法(IDIV)

执行DIV或IDIV后,所有算术运算状态标志位的值都不确定。

未完,有待添加

你可能感兴趣的:(MASM,汇编语言,重要的基础知识)