跳到指令的中间 - 在IA-32中

时间:2011-03-03 13:15:47

标签: assembly x86 ia-32

为什么IA-32使我们能够进入指令中间?

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

如果说它不会强迫你只跳到指令开头那就更正确了......

处理器不知道指令的起始位置。它只看到一大堆字节。你可以跳转到你想要的任何字节。它将尝试从那时开始解码。

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