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

kir*_*gan 3 cpu x86 assembly x86-64 cpu-registers

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

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

Ira*_*ter 6

x86架构从20世纪70年代早期的最早版本发展为8008.当时,内存字节和操作码空间非常宝贵; 只有3位被留出(当时)A,B,C,D,E,F,(和IIRC)H和L寄存器,全部为8位.(我记得那些机器编程的难度有多大,而且速度有多慢!在内存读写之前,你必须用内存地址加载H和L!)

从那时起,英特尔已经发展了指令集,通过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个,作为有效的高科技营销功能.

英特尔发现他们正在失去对AMD的64位处理器战争,试图生产他们自己的x86的64位扩展,但微软表示他们支持AMD指令集,并且不支持2个不同的x86 64位指令集.英特尔折叠,现在基本上与AMD提供的基本64位指令集相同.

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

  • 由于寄存器压力原因,RISC CPU往往有16个寄存器.毕竟,RISC背后的想法是简单地设计指令集但覆盖真正需要的东西,而不是CPU设计者看起来很酷(过度的CISC指令真正杀死了VAX).如果你现在深入研究x86架构,你会发现芯片内部是有效的RISC机器,它们具有非常复杂的解码器,可以将你认为的x86指令映射到这个更简单的微操作中. (2认同)