我正在尝试计算跳转的正确操作码,我已经在其他线程中查看过这个,但我仍然不明白:
我认为该公式是desination - (from+5)
但它只是不起作用,它的方式,这是我想跳转到/从地址:
FROM: 6259326B
TO: 02980000
CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266
所以我遇到了这个问题,任何帮助表示赞赏。
您正在计算负 jmp!所以正确的公式是:
0 - (从 - 目的地) - 5
0 - ($6259326B - $02980000) - 5
等于$A03ECD90(或 $90CD3EA0 的小端序)。
公式是正确的,假设跳转指令正好有 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。
以前也有人问过类似的问题。
公式很好(尽管提供的程序集和地址似乎不完全匹配:02980000
- 6259326b
- 5
= c726cd90
,颠倒字节顺序,它几乎与您的正确程序集匹配,我假设它的图像重定位不正确等)。您确定您正确地进行了数学运算并颠倒了字节顺序以匹配相对 32 位跳转所需的编码(小端序)吗?