我正在尝试计算跳转的正确操作码,我在其他线程中看过这个并且我仍然不明白:
我认为这个公式是desination - (from+5)
,但它只是不起作用,它离开了,这里是我要跳转的地址:
FROM: 6259326B
TO: 02980000
CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266
所以我遇到了这方面的问题,感谢任何帮助。
答案 0 :(得分:5)
你正在计算负jmp!所以正确的公式是:
0 - (来自 - desination) - 5
0 - ($ 6259326B - $ 02980000) - 5
等于 $ A03ECD90 (或小端的$ 90CD3EA0)。
答案 1 :(得分:1)
公式很好(虽然似乎提供的程序集和地址不完全匹配:02980000
- 6259326b
- 5
= c726cd90
,反转字节顺序,它几乎匹配您正确的装配,Id假设其关闭图像重定位等)。你确定你正确地计算了数学和颠倒了字节顺序以匹配相对32位跳转所需的编码(小端)吗?
答案 2 :(得分:1)
公式是正确的,假设跳转指令恰好有5个字节,FROM
是该跳转指令的地址。如果长度不是5或FROM
不是jmp所在的位置,则不正确。
用你的模2进行 32 算术:
2980000H-(6259326BH + 5)= 0A03ECD90H。
如果你不理解2980000H-62593270H如何等于32位的0A03ECD90H,想象一下你从102980000H而不是2980000H减去,也就是说,你设置了第33位。然后你有102980000H - 62593270H = 0A03ECD90H。并且您可以验证102980000H = 62593270H + 0A03ECD90H。但由于你只有32位用于计算,所以33位,无论它是什么,都不会影响总和和差异。因此,您只需将这两个数字减去32位数字,并取结果的最低32位,忽略超出第32位的任何未完成的借位。
0A03ECD90H必须在从最低有效字节到最高有效字节的jmp指令中进行编码,因此您可以获得编码该指令的字节序列:
E9,90,CD,3E,A0。
之前已经问过similar question。