助記方法:
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 文件測試