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

修改自: 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"也可以根据标志寄存器的相关标志位进行转移;

时间: 2024-11-06 07:24:54

汇编语言--条件跳转指令的相关文章

x86汇编 条件跳转

条件跳转表 汇编语言-条件跳转指令 直接转移指令 指令格式 机器码 测试标志 条件说明 符号  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     

linux平台学x86汇编(八):条件跳转

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在此之前我们使用的汇编代码示例都是从第一条指令开始,直到最后最后一条指令程序退出.但实际上和高级语言类似,汇编代码也提供指令来改变程序处理数据方式. 正常情况下,程序要执行要执行的下一条指令是在指令指针寄存器中,指令指针确定程序中哪条指令是应该执行的下一条指令. 当指令指针在程序指令中移动时,EIP寄存器会递增.指令长度可能是多个字节,所以指向下一条指令不仅仅是每次是指令指针

汇编:jmp系列跳转指令总结

助记方法: J:跳转C: 进位位置位N: 否S: 符号位置位o: 溢出位置位Z: 零标志位置位E: 等于P:奇偶位置位A: AboveB: BelowL: Less (Little的比较级)G: Greater (Great的比较级) (SF^OF)=1 --> SF=0, OF=1 --> a < b SF=1, OF=0 --> a < b (SF^OF)=0 --> SF=1, OF=1 --> a > b SF=0, OF=0--> a >

汇编-条件跳转与重复指令

条件跳转 速记方法: j(jmp) z(zero) n(not) e(equal) g(greater) l(less) a(above,无符号) b(below,无符号) 汇编指令x86下 指令+目的操作数+原操作数 比较是用目的操作数去和原操作数比较 jz loc 当cmp的两个值相等的时候跳转,否则继续执行下一条 jnz loc 当cmp的两个值不相等的时候跳转,否则继续执行下一条 je loc 当cmp的两个值相等的时候跳转,否则继续执行下一条 jne loc 当cmp的两个值不相等的时

跳转指令及其跳转条件

ja 跳转指令,条件:CF=0 和 ZF=0 jab 跳转指令,条件:CF=0 jb 跳转指令,条件:CF=1 jbe 跳转指令,条件:CF=1 或者 ZF=1 jc 跳转指令,条件:CF=1 jcxz 跳转指令,条件:CX=0 je 跳转指令,条件:ZF=1 jecxz 跳转指令,条件:ECX=0 jg 跳转指令,条件:ZF=0 和 SF=OF jge 跳转指令,条件:SF=OF jl 跳转指令,条件:SF!=OF jle 跳转指令,条件:ZF=1 和 SF!=OF jmp 跳转指令,条件:无

汇编中的跳转指令

能修改CS以及IP的指令都是转移指令.它分为段内转移,段间转移. 段内转移:只修改IP的值 段间转移:同时修改CS以及IP的值 段内转移根据转移的距离远近分为:短转移,近转移 短转移:转移范围为-128 – 127 近转移:转移范围为-32768 –32767 根据转移情况又分为: 无条件转移指令 条件转移指令 循环指令 过程 中断 <1> jmp short xxx(行号) 这个是短转移指令,实现段内的转移,在翻译成机器码的时候,码内并没有目标地址,有的只是转移位移,这样做的好处就是防止目标

ARM指令集——跳转指令

ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST或者TEQ指令中使用S后缀.这些比较指令总是会更新标志位. 在Thumb模式下,所有数据处理指令都更新CPSR中的标志位.有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行.参见

arm学习之汇编跳转指令总结

目前所知道的跳转指令有 b,bl,bep,bne.他们共同点是都是以b开头,首先从字面上分析:b:是Branch,表示分支.bl:是Branch Link表示带连接的分支.bep:Branch ,Equalbne:Branch ,Not Equal. B或BL指令引起处理器转移到"子程序名"处开始执行.两者的不同之处在于BL指令在转移到子程序执行之前将其下一条指令的地址拷贝到R14(LR,链接寄存器).由于BL指令保存了下条指令的地址因此使用指令"MOV PC,LR&qu

C编译器剖析_6.3.3 汇编代码生成_为跳转指令产生汇编代码

6.3.3        为跳转指令产生汇编代码 在这一小节中,我们要为"有条件跳转"."无条件跳转"和"间接跳转"产生相应的汇编指令.中间指令的四元式如下所示: <运算符opcode,目的操作数DST,源操作数SRC1,源操作数SRC2> (1) 有条件跳转,例如"if (a <= b) goto BB2;",四元式为: <JLE,BB2,a,b> ////////对应的汇编代码////////