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

Posted HsinTsao

tags:

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

助记方法:

J:跳转
C: 进位位置位
N: 否
S: 符号位置位
o: 溢出位置位
Z: 零标志位置位
E: 等于
P:奇偶位置位
A: Above
B: Below
L: 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 >= b


条件跳转指令是根据标志寄存器中的相关标志位的值来进行跳转的,因此,条件跳转指令只能与那些能够影响标志寄存器的相关标志位的指令配合使用;
能够直接影响标志寄存器的相关标志位的指令有:
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"也可以根据标志寄存器的相关标志位进行转移;

测试:
jmp 无条件跳转


无符号
Je 等于跳转
Jne 不等于跳转
Ja = jnbe 大于跳转 = JNBE(不小于或等于跳转)
Jb= jnae 小于跳转 = JNAE(不大于或等于跳转)
Jna 不大于跳转 = JBE(小于或等于跳转)
Jnb 不小于跳转 = JAE(大于或等于跳转)

Js 为负跳转
Jz 为0跳转
Jc 进位跳转
Jo 溢出跳转
Jp 奇偶位置位 跳转


有符号
Jg 有符号大于 跳转 = JNLE
Jge 有符号大于等于 跳转 = JNL
Jl 有符号小于 跳转 = JNGE
Jle 有符号小于等于 跳转 = JNG

 

X86下   直接的jmp分3种 
Short Jump(短跳转)机器码 EB rel8 
只能跳转到256字节的范围内 
Near Jump(近跳转)机器码 E9 rel16/32 
可跳至同一个段的范围内的地址 
Far Jump(远跳转)机器码EA ptr 16:16/32 
可跳至任意地址,使用48位/32位全指针 

测试用例:

 

.386
.model  flat,c
.DATA
Temp db "hello",0

.CODE

;jmp 无条件跳转
Sub_1 PROC  
        push ebp
        mov  ebp,esp
        sub  esp,40h
        mov  eax,dword ptr[ebp+8h]
       ; jmp  @F
        push 0
        push offset Temp
        push offset Temp
        push 0
        call eax
@@:     mov eax,2
 
        add esp,40h
        pop ebp
        RET
Sub_1 ENDP

 

 

.386
.model  flat,c
.DATA
Temp db "hello",0

.CODE

;jmp 无条件跳转
Sub_1 PROC  
        push ebp
        mov  ebp,esp
        sub  esp,40h
        mov  eax,dword ptr[ebp+8h]
        jmp  @F
        push 0
        push offset Temp
        push offset Temp
        push 0
        call eax
@@:     mov eax,2
 
        add esp,40h
        pop ebp
        RET
Sub_1 ENDP

 

 

 

win10  vs2015  .asm 文件测试

 

以上是关于汇编:jmp系列跳转指令总结的主要内容,如果未能解决你的问题,请参考以下文章

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

汇编--控制转移指令 jmp

汇编指令JMP是啥意思?

汇编指令JMP是啥意思?

求助汇编语言中JMP和BR指令

汇编之函数