最近开始学习 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/