指令如何适合 x86 上的指令寄存器?

How do instructions fit in the instruction register on x86?

我读到 x86 CPU 的可变指令长度为 1 到 15 个字节。另一方面,x86 字长也写为 32 位,这意味着所有寄存器,包括保存实际指令的指令寄存器,都是 32 位宽(4 字节)。

这意味着指令可以比指令寄存器更宽。这怎么合适?此外,我了解到在执行一条指令后,如果不跳转,指令计数器会增加 4。这意味着它在假设每条指令都是 4 个字节长的情况下运行。这怎么对?

我希望有人能为我澄清这一点。

x86 有一个相当复杂的多状态操作码解析器。首先,它会查找遗留前缀,如 REPLOCK、地址和操作数覆盖前缀,并且可能只是设置内部标志。然后它寻找 mandatory 和 rex 前缀,并可能设置其他内部标志。在此之后,解析器需要实际的指令……或更多指令的 0x0f 前缀。即使这个指令字节可能包含其他数据,e.g.registers 也可以在那里编码,因此根据指令的最高三位(0bxxx.....),解析器必须决定指令是否编码一个是否注册(例如 0b000xxx110: push xxx,其中 xxx 是 escsssds)。根据指令,解析器然后查找 ModR/M-field 并对其进行评估。当此 ModR/M-field 指示有一个 SIB 字段时,您猜怎么着?,它会评估 SIB 字段。根据指令,ModR/M-field 或 SIB 字段,可能会有一个立即偏移量 and/or 一个立即值在末尾。

我不知道,处理器实际上是如何存储这些东西的。也许有一个用于指令的寄存器,一个标志寄存器,一个存储目标寄存器号的寄存器,一个用于立即值的寄存器和某种已用地址的表示形式。

无论如何,RISC 处理器并没有你可能听说过的这种指令寄存器,即使只是因为通用寄存器的长度是 64 位,其他寄存器也不一定是这个大小。例如。 Streaming SIMD 扩展提供了 128 位大小的 xmm 寄存器。它们可以包含完整的 15 字节有效 x86 指令。

您可以找到 the structure of this parser on page 5 here.