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

标签 assembly x86 cpu x86-64 cpu-registers

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

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

最佳答案

x86 架构从其最早的版本演变为 8008早在 1970 年代初期。当时,内存字节和操作码空间非常宝贵。 (当时)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 位处理器的 war 中输给了 AMD,试图生产自己的 x86 的 64 位扩展,但微软表示他们支持 AMD 指令集,并且不会支持 2 种不同的 x86 64 位指令套。 Intel 倒闭了,现在拥有与 AMD 提供的基本相同的基本 64 位指令集。

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

关于assembly - 为什么 x86 int 寄存器的数量是 8 个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16248337/

相关文章:

assembly - 在汇编中有条件地调用子程序

java - `if else` 和 `if-else if-else` 之间有区别吗?

compression - 汇编中的文件压缩器

cpu - 现代 CPU 是否跳过乘法为零?

algorithm - 用mips写俄罗斯农民乘法

c - 尝试制作自己的加载器,但无法实现数据部分

c++ - 在 x86 SIMD vector 中查找最大元素的索引

汇编语言 - 如何做模?

cpu - 堆栈宽度是否始终与 CPU 寄存器大小相同?

Java线程与CPU核心的关系