【问题标题】:Calculate the JMP opcodes计算 JMP 操作码
【发布时间】:2012-01-02 01:37:46
【问题描述】:

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

我以为公式是 desination - (from+5),但它只是不工作,它很遥远,这是我想要跳转到/从的地址:

FROM: 6259326B
TO:   02980000

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

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

【问题讨论】:

    标签: assembly x86 opcode


    【解决方案1】:

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

    0 - (从 - 目的地) - 5

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

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

    【讨论】:

    • 感谢您的回答,我现在使用的代码是to-5-from,它提供的输出与您的相同。我是否正确地说我的新代码将适用于所有 5 字节跳转?
    • @Richard Livingston:是的,它应该适用于所有 5 字节操作码跳转。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      公式是正确的,假设跳转指令正好有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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 2014-01-11
        • 2014-11-09
        • 2022-09-27
        相关资源
        最近更新 更多