汇编语言中有很多跳转,简单总结一下,以备后用。
1. 相对跳转:
JMP远跳,CALL编译成字节码的方法:
jmp远跳与CALL指令都占5个字节
JMP 32位目标地址
E9 + (32位目标地址-下条指令地址) 或者说E9的下一条指令,加上 E9后面的值即为最终跳转目的地
E9 + (32位目标地址-(当前指令地址+5))
CALL 32位目标地址
E8 + (32位目标地址-下条指令地址)
E8 + (32位目标地址-(当前指令地址+5))
减法运算直接使用无符号运算,而且遵循结果高高低低的存储规则,CPU自己会把结果当作有符号数来认。
JMP近跳:
JMP近跳占2个字节
EB + (取低8位(32位目标地址-下条指令地址))
EB + (取低8位(32位目标地址-(当前指令地址+2)))
2. 绝对跳转:
<pre name="code" class="cpp">// x64
000007fe`ff35c4a7 90 nop
ADVAPI32!RegQueryValueExA:
000007fe`ff35c4a8 ff25e2a40500 jmp qword ptr [ADVAPI32!_