【问题标题】:How do instructions fit in the instruction register on x86?指令如何适应 x86 上的指令寄存器?
【发布时间】:2018-01-30 17:05:21
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您正在将 MIPS(或其他一些不错的 RISC)概念与 x86 混合,可能有一些相关的答案
  • 如果你能链接我这样的答案会很好^^。我试图在谷歌上搜索,但不知道要搜索哪个词。
  • x86 中没有保存指令的“指令寄存器”。
  • "x86 字长为 32 位" x86 字长为 16 位由于历史原因。请参阅英特尔手册中的 4.1 基本数据类型部分。

标签: x86 cpu-architecture


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的详细回答,尽管有些术语让我有点不知所措。所以简而言之,我的问题中有两个假设是错误的:1. x86 有一个指令寄存器(32 位)。 2. x86除了在指令计数器中简单的加4之外,还有不同的解析方式。我正在阅读 Douglas Corner 的计算机体系结构基础。我的错是我自动推断出书中所有内容都适用于 x86 CPU。
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多