[汇编]JMP 指令 地址该写多少 2021.4.6
假如说要在00402000出写下跳转到00401000处用16进制该怎么写?
根据Intel x86 JMP指令的16进制为E9,所以地址为E9 XXXXXXXX,需要注意的是XXXXXXXX地址值不是要跳转的绝对地址值,而是从当前JMP命令到跳转位置的相对距离。
JMP指令转换为机器码时,需要计算当前EIP和目标地址的差,但是JMP指令占五个字节,JMP还没执行时,当前EIP的值是JMP指令首地址+5个字节。
因为 当前EIP+5+X = 目标地址
所以 X =目标地址 - 当前EIP -5
如果目标地址在当前地址后,那就简单了 比如 00401000 跳转到 00402000
直接 00402000-(00401000+5)=0000FFB
如果目标地址在当前地址前,比如 00402000 跳转到 00401000
就要 先跳转到结尾 FFFFFFFF-00402005
再跳转至开头 FFFFFFFF-00402005 +1
再跳转至目标 FFFFFFFF-00402005 +1 +00401000
== 100000000+00401000-00402005 因为进位法则
==00401000 - 00402005
== FFFFEFFB
== 目标地址 -(源地址 +5)
补充:
也许有人会觉得奇怪 从00402005 跳转到 00401000 为什么 是 FFFFEFFB 而不是 -00001005呢 往回跳1005不就好了 如下图示
可是二进制的世界里是没有正负之分的,要想从00402005 跳转到 00401000 就必须 先从00402005 跳转到FFFFFFFF再跳一步溢出到00000000 再跳转到00401000 如下图所示