为什么x86 int寄存器的数量是8个?

问题描述 投票:0回答:3

最近开始学习x86汇编语言和CPU架构。我注意到 int 寄存器的总数是 8 个,但对于 x86-64 来说是 16 个。

为什么?一定有一些解释。

assembly x86 cpu x86-64 cpu-registers
3个回答
8
投票

x86 架构从 20 世纪 70 年代初的 8008 最早的化身演变而来。当时,内存字节以及操作码空间非常宝贵。仅为(当时)A、B、C、D、E、F、(和 IIRC)H 和 L 寄存器留出 3 位,均为 8 位。 (我记得这些机器的编程是多么痛苦,而且多么慢!在读取或写入内存之前,您必须使用内存地址加载 H 和 L!)

此后,Intel 不断发展指令集,通过 20 世纪 80 年代末的 8080、8086、80186、80286、80386、80486 架构,将寄存器扩展到 16 和 32 位,但保留相同的 3 位来选择寄存器。

直到AMD设计了80486架构的64位版本,才通过添加指令前缀字节(因为现在内存和操作码字节很便宜)来添加第4个寄存器位。该前缀字节实质上将“8”添加到由相同的 3 个遗留寄存器位选择的寄存器号;这意味着“寄存器号”分布在整个指令中,这使得解码器变得丑陋,但晶体管现在也很便宜。

16个寄存器的借口是“寄存器压力”。理想的 CPU 将在其寄存器中执行所有必要的算术,并且始终有足够的寄存器,因此有时不必将寄存器溢出(存储并稍后重新加载)到内存中,以便为另一次计算腾出空间。测量(和经验)表明,8 个寄存器实际上并不足以避免此类溢出,并且由于溢出会触及内存,因此它们会大大减慢处理器的速度。我认为 32 被认为(仔细测量)是足够多的寄存器,但这需要2位,而 16 足够接近理想值,非常实用。而且,AMD 在一段时间内能够使用他们的 64 位产品和 16 个寄存器(而不是仅仅 8 个)作为有效的高科技营销功能。

英特尔发现自己在 64 位处理器战争中输给了 AMD,试图生产自己的 x86 64 位扩展,但微软表示他们支持 AMD 指令集,并且不会支持 2 个不同的 x86 64 位指令集。 Intel 倒闭了,现在拥有与 AMD 提供的基本相同的 64 位指令集。

您会发现这些 CPU 的极其现代版本具有 16 个和 32 个(我认为)寄存器的向量寄存器组;操作码位现在便宜得多,并且指令获取率令人难以置信。


1
投票

我记得 1978 年的原始 8086 有数万个晶体管,因此所有指令都是微编码的。这意味着需要做出大量妥协才能将 16 位处理器的功能纳入其中。迄今为止最成功的 16 位处理器是 Digital Equipment 的 PDP-11,它也有 8 个通用寄存器。 8086 通过在四个 16 位寄存器中使用八字节寄存器来改善这一点。

甚至地址翻译也是微编码的。一条指令所需的平均周期为 17 个。由于更多的晶体管(以及不完全微编码的地址转换单元),286 将其降低到 7 个,386 降低到 4.4,486 降低到 1.8。在此期间,时钟速度从 5 MHz 增加到 100 MHz(在 486 DX-3 中)。

8086 旨在用于实时应用,更少的寄存器意味着更快的中断处理和任务切换。应该在历史背景下看待它,而不是与当今的 32 位、32 寄存器 RISC 处理器进行比较。

386 是第一个支持 32 位的处理器,距 8086 已经过去了 10 年。仍然只有 8 个具有 16 位子寄存器的通用寄存器,其中 4 个具有 8 位子寄存器。

到了某个阶段,8 寄存器、32 位架构无法通过添加晶体管来变得更快。或者更确切地说,在规模上是使用更多晶体管改进 8 寄存器、32 位解决方案,而不是扩展到 16 个寄存器(每个寄存器 64 位)并实施修订后的指令集。后者赢了。


1
投票

您可以轻松地自己解释。要寻址 8 个寄存器,只需要 3 位,这是汇编语言命令格式中可用的。由于 64 命令大两倍,因此有 6 位。 在这里查看更多内容 每条asm指令的大小是多少?

因此,如果最短指令长度为 1 个字节,则只有 8 位。因此,如果您需要将命令从一个寄存器移动到另一个寄存器,则需要在 8 位中保留以下内容:

  1. 操作码
  2. 来源地址
  3. 目的地地址

由于源地址和指定地址各占 3 位,因此消耗了 6 位,并且只有 2 位用于实际操作,总共 4 个位,即移动、添加、替换和交换。

© www.soinside.com 2019 - 2024. All rights reserved.