【问题标题】:Jump into the middle of instruction - in IA-32跳转到指令的中间——在 IA-32 中
【发布时间】:2011-03-03 13:15:47
【问题描述】:

为什么 IA-32 能让我们跳到指令的中间?

当我在 Assembler 中编写时,如何使用这种架构特性进行优化? (除了很明显的情况,我们喜欢将命令的编码保存在寄存器中,然后激活这个命令)?

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    由于历史原因,IA-32 允许跳转到指令中间。 x86 指令集是 8080 使用的指令集的连续层的结果,8080 是第一个“x86”的前身——这使我们回到了 70 年代后期。那时,RAM 非常昂贵,指令尽可能短是值得的,即使这意味着所有指令的长度都不相同。现在,一条 IA-32 指令的长度可以在 1 字节到 12 字节之间。这意味着任何地址都可能是指令的开始(没有对齐要求),但许多地址指向指令中间的某个字节。跳转到指令的中间会指示 CPU 重新解释以跳转目标字节开头的机器码字节,从而产生完全不同的指令。

    为了优化,使用“跳到中间”功能的正确方法是使用它。 CPU 通过在内部将指令流转换为具有更规则结构的微指令序列来解码指令流,并对其进行处理以加快处理速度(并行执行、推测分支跟随等)。中间跳跃会对这些优化造成严重破坏。

    【讨论】:

    • x86 指令是 1 到 15 个字节,而不是 12 个
    • 好吧,我写了“超过 12”,我相信 15 确实是“超过 12”。由于每个新架构版本都引入了新的操作码,因此指令的最大长度并没有真正的界限。即使今天的 x86 上到 15 字节,后面的版本也可能会超过。
    【解决方案2】:

    更正确的说法是它不会强迫你只跳到指令的开头......

    处理器不知道指令从哪里开始。它只看到大量字节。你可以跳到你想要的任何字节。它将尝试从该点开始解码。

    跳到指令的中间似乎是个坏主意。我能看到的唯一非错误用途是跳入指令以避免前缀(例如LOCK)。不知道这会有什么实际用途。

    【讨论】:

    • 可能最常见的原因是混淆 - 使人们更难反汇编代码。
    猜你喜欢
    • 2014-06-27
    • 2023-03-05
    • 2014-09-17
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2014-11-27
    相关资源
    最近更新 更多