3

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

为什么?必须有一些解释。

4

3 回答 3

8

x86 体系结构从1970 年代初期的8008的最早化身演变而来。当时,内存字节和操作码空间非常宝贵。(当时)A、B、C、D、E、F(和 IIRC)H 和 L 寄存器只保留了 3 位,全部 8 位。(我记得那些机器编程是多么痛苦,多么慢!在内存读取或写入之前,您必须使用内存地址加载 H 和 L!)

从那时起,英特尔通过 1980 年代后期的 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 位指令集。英特尔折叠起来,现在基本上拥有与 AMD 提供的基本相同的 64 位指令集。

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

于 2013-04-27T04:38:26.440 回答
1

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

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

8086 旨在用于实时应用程序,更少的寄存器意味着更快的中断处理和任务切换。应该从它的历史背景来看,而不是与今天的 32 位、32 寄存器 RISC 处理器相比。

386 是第一个支持 32 位的处理器,比 8086 晚了十年。仍然只有八个具有 16 位子寄存器的通用寄存器,其中四个具有 8 位子寄存器。

8 寄存器、32 位架构无法通过向其投掷晶体管来提高速度。或者,更确切地说,在规模上正在改进使用更多晶体管的 8 寄存器、32 位解决方案,而不是扩展到每个 64 位的 16 个寄存器并实施修改后的指令集。后者赢了。

于 2013-04-27T07:11:28.947 回答
1

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

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

  1. 操作码

  2. 源地址

  3. 目的地址

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

于 2013-04-27T04:57:05.190 回答