繁体   English   中英

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

[英]Why the number of x86 int registers is 8?

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

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

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(我认为)寄存器的向量寄存器集; 操作码位现在便宜很多,并且指令获取速率令人难以置信。

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

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

  1. 操作码

  2. 来源地址

  3. 目的地址

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

我记得1978年的原始8086有几万个晶体管,因此,所有指令都是微编码的。 这意味着将16位处理器的功能强加到等式中会有很多妥协。 迄今为止最成功的16位处理器是Digital Equipment的PDP-11,它还有8个通用寄存器。 8086在16位寄存器中的4个寄存器中有8个字节寄存器。

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

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

386是第一个具有32位功能的处理器,并且是在8086之后的十年。仍然只有8个通用寄存器具有16位子寄存器,其中4个具有8位子寄存器。

有一点,8位寄存器,32位架构无法通过向其投掷晶体管来加快速度。 或者说,在比例尺中,使用更多晶体管改进了8寄存器,32位解决方案,并扩展到16位64位寄存器,并实现了修改后的指令集。 后者赢了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM