修改自: http://bdxnote.blog.163.com/blog/static/84442352015327011988/

在此向原作者致敬, 网上大多数帖子都是拷贝自一个把跳转条件写错了的帖子, 害的我差点要怀疑人生了,-_-! .

本贴主要是把原作者的跳转条件改成C语言逻辑表达式的写法, 这样看着更舒服一些, 而且不会产生歧义

直接转移指令

指令格式

机器码

跳转条件

条件说明

符号

 JO       OPR

70

 OF==1

 结果有溢出

 

 JNO      OPR

71

 OF==0

 结果无溢出

 

 JC       OPR

72

 CF==1

 小于

 <

 JNC      OPR

73

 CF==0

 大于或等于

 >=

 JZ/JE    OPR

74

 ZF==1

 结果为0

 ==

 JNZ/JNE  OPR

75

 ZF==0

 结果非0

 !=

 JS       OPR

78

 SF==1

 结果为负

 <0

 JNS      OPR

79

 SF==0

 结果为正

 >0

 JP/JPE   OPR

7A

 PF==1

 结果中1的个数为偶数

 

 JNP/JPO  OPR

7B

 PF==0

 结果中1的个数为奇数

 

 

间接转移指令-无符号数

指令格式

机器码

测试标志

条件说明

符号

 JB/JNAE  OPR

72

 CF==1

 低于/不高于且不等于

 <

 JNB/JAE  OPR

73

 CF==0

 不低于/高于或等于

 >=

 JBE/JNA  OPR

76

 (CF==1) || (ZF==1)

 低于或等于/不高于

 <=

 JNBE/JA  OPR

77

 (CF==0) && (ZF==0)

 不低于且不等于/高于

 >

 

间接转移指令-有符号数

指令格式

机器码

测试标志

条件说明

符号

 JL/JNGE  OPR

7C

 (SF^OF)==1

 小于/不大于且不等于

 <

 JNL/JGE  OPR

7D

 (SF^OF)==0

 不小于/大于或等于

 >=

 JLE/JNG  OPR

7E

 (SF^OF)==1 || (ZF==1)

 小于或等于/不大于

 <=

 JNLE/JG  OPR

7F

 (SF^OF)==0 && (ZF==0)

 不小于且不等于/大于

 >


理解方法:
N: Not
E: Equal
A: Above
B: Below
L: Less    (Little的比较级)
G: Greater (Great的比较级)

条件跳转指令是根据标志寄存器中的相关标志位的值来进行跳转的,因此,条件跳转指令只能与那些能够影响标志寄存器的相关标志位的指令配合使用;
能够直接影响标志寄存器的相关标志位的指令有:
1、算术运算指令 : add、adc、inc、sub、sbb、dec、mul、imul、div、idiv、neg等等;
2、按位逻辑运算 : and、or、xor、not(not不影响)等等;
3、比较运算指令 : cmp(减法但不是修改操作数)、test(按位与, 但不修改操作数);
4、移位操作指令 : shr、shl、sar、sal、ror、rol、rcr、rcl;
5、BCD数调整指令: aaa、aas、daa、das、aam、aad;
6、标志处理指令 : clc、stc、cmc、cld、std、cli、sti;

下面一段没有验证,待学完汇编之后再来测试这一段

能够间接影响标志寄存器的相关标志位的指令序列有:
pushf --> pop eax --> modify eax --> push eax --> popf
即:
pushf
pop eax
modify eax
push eax
popf
jbe OPR
这样的一系列操作之后,条件转移指令"jbe OPR"也可以根据标志寄存器的相关标志位进行转移;