[汇编]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 如下图所示
本文作者:乘舟凉
本文链接:https://www.cnblogs.com/czlnb/p/14618272.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步