intel x86 汇编:比较与跳转指令

x86标志位

CF(bit 0) [Carry flag] 这个标志指示无符号整型运算的溢出状态,若算术操作在最高有效位发生进位或借位则将其置1,反之清零
PF(bit 2) [Parity flag] 若结果的最低有效字节包含偶数个1位则该位置1,否则清零。
AF(bit 4) [Adjust flag] 若算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零
ZF(bit 6) [Zero flag] 若结果为0则将其置1,反之清零
SF(bit 7) [Sign flag] 该标志被设置为有符号整型的最高有效位。(0指示结果为正,反之则为负)
OF(bit 11) [Overflow flag] 带符号整型运算溢出时将该位置1,反之清零


比较与测试指令

对于比较指令 cmp oprd1, oprd2
比较方法为第一个操作数减去第二个操作数,但不影响第两个操作数的值
cmp指令可能会影响的flag有 CF, ZF, OF, AF, PF

执行指令后:
若 ZF=1 则说明两个数相等,因为zero为1说明结果为0
当无符号时:
若 CF=1 则说明了有进位或借位,cmp是进行的减操作,故为借位,所以,此时oprd1<oprd2;
若 CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若 SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以看出 oprd1>oprd2;
若 SF=1,OF=0 则说明了此时的值为负数,没有溢出,可以看出 oprd1<oprd2;
若 SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出 oprd1>oprd2;
若 SF=1,OF=1 则说明了此时的值为负数,有溢出,可以看出 oprd1>oprd2;
也即 SF!=OF 则oprd1<oprd2,SF==OF 则oprd1>oprd。。

对于位测试指令 test oprd1, oprd2
测试方法是对两个操作数按位相与
可能影响的flag有 CF, ZF, OF, SF, PF

执行指令后:
CF 与 OF 都会被设置为0;
SF 将会被设置为与操作后的最高有效位;
如果与操作结果为0,ZF 将会被设置为1,否则被设置为0;
PF 将会被设置为与操作结果的按位XNOR,如果有偶数个1,PF=1,否则PF=0.
test常被用于判断寄存器是否为空:
  test eax, eax
  jz somewhere

跳转指令

对于跳转指令,分为三种, 按标志位跳转,按无符号数比较结果跳转和按有符号数比较结果跳转。

按标志位跳转:

指 令 描 述 条 件 别 名 相 反 指 令
JC 如果进位位被置位则跳转 进位标志 CF=1 JB, JNAE JNC
JNC 如果进位位没有置位则跳转 进位标志 CF=0 JNB, JAE JC
JZ 如果0标志被置位则跳转 0标志 ZF=1 JE JNZ
JNZ 如果0标志没有置位则跳转 0标志 ZF=0 JNE JZ
JS 如果符号位被置位则跳转 符号标志 SF=1   JNS
JNS 如果符号位没有被置位则跳转 符号标志 SF=0   JS
JO 如果溢出标志置位则跳转 溢出标志 OF=1   JNO
JNO 如果溢出标志没有置位则跳转 溢出标志 OF=0    JO
JP 如果奇偶校验位被置位则跳转 奇偶校验标志 PF=1 JPE JNP, JPO
JNP 如果奇偶校验位没有被置位则跳转 奇偶校验标志 PF=0 JPO JP, JPE

按无符号数计算结果跳转:

指 令 描 述 条 件 别 名 相 反 指 令
JA 如果超过(>)则跳转 进位标志 CF=0,0标志 ZF=0 JNBE JNA
JNBE 如果不低于或等于(不 <=)则跳转 进位标志 CF=0,0标志 ZF=0 JA JBE
JAE 如果超过或等于(>=)则跳转 进位标志 CF=0 JNC,JNB JNAE
JNB 如果不低于则跳转(不 <) 进位标志 CF=0 JNC,JAE JB
JB 如果低于(<)则跳转 进位标志 CF=1 JC,JNAE JNB
JNAE 如果不超过或等于(不>=)则跳转 进位标志 CF=1 JC,JB JAE
JBE 如果低于或等于(<=)则跳转 进位标志 CF=1或0标志 ZF=1 JNA JNBE
JNA 如果不超过(不>)则跳转 进位标志 CF=1或0标志 ZF=1 JBE JA
JE 如果相等(=)则跳转 0标志 ZF=1 JZ JNE
JNE 如果不相等(<>)则跳转 0标志 ZF=0 JNZ JE

按有符号数计算结果跳转:

指 令 描 述 条 件 别 名 相 反 指 令
JG 如果大于(>)则跳转 符号标志 SF = 溢出标志 OF 或 0标志 ZF=0 JNLE JNG, JLE
JNLE 如果不小于或等于(<=)则跳转 符号标志 SF = 溢出标志 OF 或 0标志 ZF =0 JG JLE
JGE 如果大于或等于(>=)则跳转 符号标志 SF = 溢出标志 OF JNL JGE
JNL 如果不小于(不<)则跳转 符号标志 SF = 溢出标志 OF JGE JL
JL 如果小于(<)则跳转 符号标志 SF <> 溢出标志 OF JNGE JNL
JNGE 如果不大于或等于(>=)跳转 符号标志 SF <> 溢出标志 OF JL JGE
JLE 如果小于或等于(<=)跳转 符号标志 SF <> 溢出标志 OF 或 0标志 ZF = 1 JNG JNLE
JNG 如果不大于(不>)则跳转 符号标志 SF <> 溢出标志 OF 或 0标志 ZF = 1 JLE JG
JE 如果等于(=)则跳转 0标志 ZF = 1 JZ JNE
JNE 如果不等于(<>)则跳转 0标志 ZF = 0 JNZ JE

发表评论

电子邮件地址不会被公开。 必填项已用*标注