什么是解码形式的指令?

时间:2015-05-05 19:46:03

标签: assembly x86 x86-64 intel

我正在阅读Ulrich Drepper撰写的“每个计算机科学家应该了解的关于记忆的内容”。

在第6.2.2节中,它的内容为:

  

[...]指令必须先解码   他们可以执行,并加快这一点(重要的是   在x86和x86-64)上,指令实际上是缓存的   解码后的形式,而不是从中读取的字节/字形式   存储器中。

作者对指令的“解码”形式意味着什么?指令不是意味着他们自己的含义吗?例如“添加”是“添加”......

它的“解码”形式的代表是什么?他们为什么需要缓存它?它不是确定性的吗?是否需要时间来“解码”管道中的指令,为什么?

4 个答案:

答案 0 :(得分:3)

现代英特尔CPU实际上使用所谓的microcode实现了许多指令。微代码由用于实现高级指令的更简单的低级指令集编写的代码组成(例如,rep - 前缀指令可以实现为微编码循环)。因为这有效地要求CPU本身将输入指令流“编译”成微码,可以想象正在缓存这个微码(以避免重复编译它的开销)。

当然,缓存“解码”指令的确切细节因处理器而异,因此无法进行一般性陈述。

答案 1 :(得分:2)

您认为单个指令实际上对应于(可能)处理器上的整组不同电路。 "解码"意味着读取机器代码,并且现在存在选择适当电路的一些元数据或处理器状态。缓存比缓存代码更有效。

例如,加载指令可能使用一个实现进行偏移量寻址,并使用完全不同的电路进行立即寻址......

答案 2 :(得分:2)

这不是您在经典RISC管道中看到的那种解码步骤。在现代x86处理器中,指令在最终进入“生成控制信号”阶段之前经过几个解码步骤。它们是“预编码”(识别指令边界),解码为μops,然后缓冲,缓存和排队,直到它们最终到达“RISC类核心”,在那里它们被安排并放入预留站,并且只有在它们最终到达之后ALU(如果适用)。在大多数路线中,他们可能还没有在经典的RISC意义上解码为“变成实际控制信号”,这使得它们太宽而无法将1.5K的它们放入L1C。无论如何,前端产生的那些μops是“类似RISC的核心”的指令集,它们不是真正意义上的状态机中的真正微码,顺序产生一堆控制信号。它虽然可以比较。

至于μops实际上是什么样子,很难得到细节。可以根据指令生成的μops(以及它们到达的端口)的数量进行一些推断,找到表here。例如,读操作和读 - 修改 - 写指令被分成几部分。一些指令产生大量的μops,例如浮点超越,使得这些指令更像是一种可能在其他指令之上实现的内置函数。执行可变工作量的指令也会生成可变数量的μops,例如rep movs。所以μops看起来像RISC指令,但后来我们就知道了。

答案 3 :(得分:1)

CPU始终执行的3个步骤是:

  1. fetch(来自内存的指令);

  2. 解码(指令 - 你的问题);

  3. 执行(让电信号根据解码阶段在COU中行走)。

  4. 解码指令意味着CPU"解码器" - 这是CPU内部的硬件组件 - 对二进制指令进行解码,并根据指令决定如何处理电信号(指令)。

    换句话说:指令被转换为控制CPU其他部分的信号。