汇编语言--条件跳转指令

Posted talenth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言--条件跳转指令相关的知识,希望对你有一定的参考价值。

修改自: 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、sub、adc、sbb、inc、dec、neg、mul、div、imul、idiv,等等;
2、按位逻辑运算 : and、or、xor、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"也可以根据标志寄存器的相关标志位进行转移;

以上是关于汇编语言--条件跳转指令的主要内容,如果未能解决你的问题,请参考以下文章

ARM 汇编语言指令

x86汇编 条件跳转

汇编--控制转移指令 jmp

arm汇编指令速记

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )