【发布时间】:2012-01-02 01:37:46
【问题描述】:
我正在尝试计算跳转的正确操作码,我在其他线程中查看过,但我仍然不明白:
我以为公式是 desination - (from+5),但它只是不工作,它很遥远,这是我想要跳转到/从的地址:
FROM: 6259326B
TO: 02980000
CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266
所以我遇到了这个问题,感谢任何帮助。
【问题讨论】:
我正在尝试计算跳转的正确操作码,我在其他线程中查看过,但我仍然不明白:
我以为公式是 desination - (from+5),但它只是不工作,它很遥远,这是我想要跳转到/从的地址:
FROM: 6259326B
TO: 02980000
CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266
所以我遇到了这个问题,感谢任何帮助。
【问题讨论】:
您正在计算负 jmp!所以正确的公式是:
0 - (从 - 目的地) - 5
0 - ($6259326B - $02980000) - 5
等于 $A03ECD90(或 $90CD3EA0 的小端序)。
【讨论】:
to-5-from,它提供的输出与您的相同。我是否正确地说我的新代码将适用于所有 5 字节跳转?
公式很好(尽管提供的程序集和地址似乎不完全匹配:02980000 - 6259326b - 5 = c726cd90,颠倒字节顺序,它几乎匹配您正确的程序集,我假设其不适当的图像重定位等)。您确定您的数学运算正确并且颠倒了字节顺序以匹配相对 32 位跳转所需的编码(小端序)吗?
【讨论】:
公式是正确的,假设跳转指令正好有5个字节,FROM是这条跳转指令的地址。如果长度不是 5 或 FROM 不是 jmp 所在的位置,则不正确。
你得到模 232 算术:
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。
【讨论】: