4

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

我认为该公式是desination - (from+5)但它只是不起作用,它的方式,这是我想跳转到/从地址:

FROM: 6259326B
TO:   02980000

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

所以我遇到了这个问题,任何帮助表示赞赏。

4

3 回答 3

5

您正在计算负 jmp!所以正确的公式是:

0 - (从 - 目的地) - 5

0 - ($6259326B - $02980000) - 5

等于$A03ECD90(或 $90CD3EA0 的小端序)。

于 2011-11-19T20:36:51.413 回答
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。

以前也有人问过类似的问题。

于 2011-11-19T22:19:35.603 回答
1

公式很好(尽管提供的程序集和地址似乎不完全匹配:02980000- 6259326b- 5= c726cd90,颠倒字节顺序,它几乎与您的正确程序集匹配,我假设它的图像重定位不正确等)。您确定您正确地进行了数学运算颠倒了字节顺序以匹配相对 32 位跳转所需的编码(小端序)吗?

于 2011-11-19T20:19:51.833 回答