汇编--常用汇编指令与标志位关系

传送类指令 ---只有 SAHF、POPF 影响
通用数据传送指令(都不影响标志位)

  • MOV
  • PUSH/POP
  • XCHG

地址转送指令(LEA,LDS,LES,LFS,LGS,LSS)  都不影响标志位。

累加器专用传送指令    IN OUT XLAT   都不影响标志位。

类型转换指令(CBW,CWD/CWDE,CDQ,BSWAP) 全都不影响标志位。

标志寄存器操作 指令 LAHF、SAHF;PUSHF、POPF(LAHF、PUSHF 不影响;SAHF、POPF 影响)

因为 SAHF POPF 本身就是对标志寄存器做修改的,所以会影响;需要注意的是 SAHF LAHF 是字节操作,PUSHF POPF 是字操作

  •  查表指令 XLAT (不影响标志位)
  •  地址传送指令 近 LEA、远 LDS (不影响标志位)
  •  符号扩展指令 CBW、CWD (不影响标志位)
  •  输入/输出指令 IN、OUT (不影响标志位)
  •  串传送类指令 MOVSB、MOVSW、MOVS;LODSB、LODSW、LODS;STOSB、

STOSW、STOS (不影响标志位,但是受到方向标志位 DF 的影响)
运算类指令 ---这里面除了标志寄存器的位操作外,其他指令都不影响 D、I、T 三位

  •  逻辑运算  AND、OR、XOR、NOT、TEST(可以看到,DIT 三位不受影响,O、C 两个始终置零,A 也不受影响,符号位 S、标志 Z 和奇偶标志 P 受影响,不难理解) 标志寄存器的位操作 (Obviously,都影响)

 

  • 移位,循环

移位 SAL、SHL、SAR、SHR
(同样的,DIT 三位不受影响,A 也不受影响,其他的均受影响)
循环 ROL、ROR、RCL、RCR
(只有进位标志 C 和溢出标志 O 受影响,因为循环移位时用了 C)

 

基本的指令 ADD/ADC/SUB/SBB/NEG/CMP/  

串比较系列 CMPSB、CMPSW、CMPS/
串扫描系列 SCASB、SCASW、SCAS
  (以上的指令对于除 DIT 之外都影响)
  加一减一指令 INC、DEC
  (以上两条指令对除了 DIT 三位和进位标志 C 外其他都影响)


未组合 BCD 调整 加 AAA、减 AAS
(以上两条指令只影响辅助进位A和进位 C,因为在调整过程中要用到这两位)
组合 BCD 调整 加 DAA、减 DAS
(可以看到除了 DIT 三位和溢出位 O 不受影响)

  • 乘法 MUL、IMUL可以看到只影响溢出 O 与进位 C
  • 除法 DIV、IDIV     (可以看到都不受影响)

BCD 码调整 AAD、AAM
(符号位 S、零标志 Z、奇偶标志 P 受影响)
转移指令

  •  条件转移指令
  •  根据标志位的转移指令
  •  无符号数运算后的转移
  •  带符号数运算后的转移
  •  根据 CX 的值转移
  •  循环次数控制
  •  串操作次数控制前缀
  •  无条件转移指令
  •  调用指令
  •  返回指令
  •  中断指令

(这里面大部分不改变标志位,但受标志位影响,一般都是上一条是一个运算指令,经过运算标志位被改变了,跳转时就根据这时候的标志位来判断是否需要跳转)

 

处理器控制指令 ---应该也不影响

  •  空操作指令 NOP
  •  格式:NOP
  •  一条指令耗时 3T
  •  CPU 停等中断 HLT
  •  格式:HLT
  •  等待指令 WAIT

 

 

 

加法指令 ADD (addition)

指令对标志位的影响:

                     CF=1   最高有效位向高位有进位

                     CF=0   最高有效位向高位无进位

                     OF=1   两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反。

                     OF=0   两个不同符号数相加,或同符号数相加,结果符号与其相同。

 

带进位加法指令 ADC (add with carry)

指令对标志位的影响:

                     CF=1   最高有效位向高位有进位

                     CF=0   最低有效位相高位无进位

                     OF=1   两个同符号数相加,结果符号与其相反,

                     OF=0   两个同符号数相加,或同符号相加,结果符号与其相同

 

1指令 INC (increament)

指令对标志位的影响:

                     对CF无影响

                     OF=1   两个同符号数相加,结果符号与其相反,

                     OF=0   两个同符号数相加,或同符号相加,结果符号与其相同。

 

减法指令 SUB (subtract)

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

带借位减法指令 SBB (subtract with borrow)

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

1指令 DEC (decrement)

指令对标志位的影响:

 

                     对CF无影响

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

                   

比较指令 CMP (compare)

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

求补指令 NEG (negate)

指令对标志位的影响:

                     CF=1  不为0的操作数求补时

                     CF=0  为0的操作数求补时

                     OF=1    操作数为-128(字节运算)或操作数为-32768(字运算)

                     OF=0    当求补运算的操作数不为-128(字节)或-32768(字)时

 

无符号乘法指令 MUL (unsigned multiple)    有符号乘法指令 IMUL(signed muliple)

指令对标志位的影响:乘法指令只影响标志位CF和OF,其他条件码位无定义。

                     MUL指令的条件码设置为:

                     CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))

                     CF OF=1 1 乘积的高一半不为0

                     IMUL指令的条件码设置为:

                     CF OF=0 0 乘积的高一半为低一半的符号扩展.

                     CF OF=1 1 其他情况

 

无符号数除法 DIV (unsigned divide)     带符号数除法 IDIV (singed divide)

指令对标志位的影响:不影响条件码。   

 

逻辑与 AND (logic and)

指令对标志位的影响:

 

                     指令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑或 or (logic or)

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑非 NOT (logic not)

指令对标志位的影响:对标志位无影响

 

异或 XOR (exclusice or)

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

测试指令 TEST

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑左移 SHL (shift logical left)

指令对标志位的影响: CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

逻辑右移 SHR (shift logical right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

算术左移 SAL (shift arithmetic left)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

算术右移SAR (shift arithmetic right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

循环左移 ROL (rotate left)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

循环右移 ROR (rotate right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

带进位的循环左移 RCL (rotate left through carry)

指令对标志位的影响:CF=移入的数值。

                     OF=1 当cnt=1时,移动后最高位的值未发生变化。

                     OF=0 当cnt=1时,移动后最高位的值发生变化。

                     SF、ZF、PF标志位不受影响。

 

带进位的循环右移 RCR (rotate right through carry)

指令对标志位的影响:CF=移入的数值。

                     OF=1 当cnt=1时,操作数最高位的值未发生变化。

                     OF=0 当cnt=1时,操作数最高位的值发生变化。

                     SF、ZF、PF标志位不受影响。

 

串传送 MOVSB / MOVSW (move string byte/word)

指令对条件码的影响:不影响条件码。

 

存串 STOSB / STOSW (stroe from string byte/word)

指令对条件码的影响:不影响条件码。

 

取串LODSB / LODSW (load from string byte/word)

指令对条件码的影响:不影响条件码。

 

串比较 CMPSB / CMPSW (compare string byte/word)

指令对条件码的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

串扫描 SCASB / SCASW (scan string byte / word)

指令对条件码的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

条件转移指令

 

指令的汇编格式及功能    根据条件码的值转移:

49、JZ(JE) OPR         ZF=1

50、JNZ(JNE) OPR      ZF=0

51、JS OPR             SF=1

52、JNS OPR           SF=0

53、JO OPR             OF=1

54、JNO OPR          OF=0

55JP OPR             PF=1

56、JNP OPR           PF=0

57JC OPR             CF=1

58、JNC OPR           CF=0

 

比较两个无符号数,根据比较的结果转移

59JB(JNAE,JC)   OPR   CF=1            被减数小于减数则转移

60JNB(JAE,JNC) OPR    CF=0            被减数大于或等于减数则转移

61、JBE(JNA) OPR        CF或ZF=1       被减数小于或等于减数则转移

62、JNBE(JA) OPR        CF或ZF=0       被减数大于减数则转移

 

比较两个带符号数,根据比较结果转移

63JL/JNGE OPR       SF异或OF=1           被减数小于减数则转移   

64、JNL/JGE           SF异或OF=0               被减数不小于减数则转移

65、JLE/JNE           (SF异或OF)与ZF=1     被减数不大于减数则转移

66、JNLE/JG           (SF异或OF)与ZF=0     被减数大于减数则转移

 

根据CX寄存器的值转移

67JCXZ              (CX)=0               CX内容为零 则转移

你可能感兴趣的:(汇编--常用汇编指令与标志位关系)