2011-11-19 68 views
4

我试图计算出正确的操作码的跳,我在其他线程看着这个和我还是不明白:计算JMP的操作码

我认为公式为desination - (from+5)但其只是不工作,它的方式了,这里就是我想跳到/从地址:

FROM: 6259326B 
TO: 02980000 

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

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

回答

5

你正在计算负面jmp!所以,正确的公式是:

0 - (从 - desination) - 5

0 - ($ 6259326B - $○二九八○○○○) - 5

什么等于$ A03ECD90(或$ 90小尾数的CD3EA0)。

+0

感谢您的回答,我现在使用的代码是'to-5-from',它给出了与您相同的输出。我是否正确地说我的新代码适用于所有5个字节的跳转? – Drahcir

+0

@Richard Livingston:是的,它应该适用于所有5个字节的操作码跳转。 –

1

的公式是罚款(虽然看似提供的组装和地址不准确匹配:02980000 - 6259326b - 5 = c726cd90,反向的字节顺序,它几乎你正确的组装相匹配,编号承担其关闭,由于图像搬迁等。 )。你确定你正确地做了数学运算颠倒了字节顺序以匹配相对32位跳转所需的编码(小尾数)?

1

该公式是正确的,假设跳转指令正好有5个字节,并且FROM是该跳转指令的地址。如果长度不是5或FROM不是jmp所在的位置,则不正确。

与您在模得到2 算术:

2980000H-(6259326BH + 5)= 0A03ECD90H。

如果你不知道如何2980000H - 62593270H等于0A03ECD90H在32位,想象你是从102980000H而不是2980000H减去了一下,那就是,你有33位设置。那么你有102980000H - 62593270H = 0A03ECD90H。你可以验证102980000H = 62593270H + 0A03ECD90H。但是因为你只有32位计算,所以第33位,不管它是什么,都不会影响总和和差异。所以你只需将这两个数字相减为32位数字,并取最不重要的32位结果,忽略32位以外的任何未完成借入。

而且0A03ECD90H在从最低显著字节到最显著字节JMP指令进行编码,让您获得编码的指令字节序列:

E9,90,CD,3E, A0。

A similar question已被询问过。