汇编语⾔--条件跳转指令
修改⾃: bdxnote.blog.163/blog/static/84442352015327011988/
在此向原作者致敬, ⽹上⼤多数帖⼦都是拷贝⾃⼀个把跳转条件写错了的帖⼦, 害的我差点要怀疑⼈⽣了,-_-! .
本贴主要是把原作者的跳转条件改成C语⾔逻辑表达式的写法, 这样看着更舒服⼀些, ⽽且不会产⽣歧义
直接转移指令
指令格式机器码跳转条件条件说明符号
JO OPR70 OF==1结果有溢出
JNO OPR71 OF==0结果⽆溢出
JC OPR72 CF==1⼩于 <
JNC OPR73 CF==0⼤于或等于 >=
JZ/JE OPR74 ZF==1结果为0 ==
JNZ/JNE OPR75 ZF==0结果⾮0 !=
JS OPR78 SF==1结果为负 <0
JNS OPR79 SF==0结果为正 >0
JP/JPE OPR7A PF==1结果中1的个数为偶数
JNP/JPO OPR7B PF==0结果中1的个数为奇数
间接转移指令-⽆符号数
指令格式机器码测试标志条件说明符号
JB/JNAE OPR72 CF==1低于/不⾼于且不等于 <
JNB/JAE OPR73 CF==0不低于/⾼于或等于 >=
JBE/JNA OPR76 (CF==1) || (ZF==1)低于或等于/不⾼于 <=
JNBE/JA OPR77 (CF==0) && (ZF==0)不低于且不等于/⾼于 >
间接转移指令-有符号数
指令格式机器码测试标志条件说明符号
JL/JNGE OPR7C (SF^OF)==1⼩于/不⼤于且不等于 <
JNL/JGE OPR7D (SF^OF)==0不⼩于/⼤于或等于 >=
JLE/JNG OPR7E (SF^OF)==1 || (ZF==1)⼩于或等于/不⼤于 <=
汇编判断指令JNLE/JG OPR7F (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"也可以根据标志寄存器的相关标志位进⾏转移;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论