计算JMP操作码

时间:2011-11-19 19:54:45

标签: assembly x86 opcode

我正在尝试计算跳转的正确操作码,我在其他线程中看过这个并且我仍然不明白:

我认为这个公式是desination - (from+5),但它只是不起作用,它离开了,这里是我要跳转的地址:

FROM: 6259326B
TO:   02980000

CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266

所以我遇到了这方面的问题,感谢任何帮助。

3 个答案:

答案 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