最近我开始学习x86汇编语言和CPU架构。我注意到int寄存器的总数是8,但对于x86-64,它是16。
为什么呢?必须有一些解释。
答案 0 :(得分: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位处理器大战,试图生产自己的64位扩展x86,但微软表示他们支持AMD指令集,并且不支持2种不同的x86 64位指令集。英特尔折叠,现在基本上与AMD提供的基本64位指令集相同。
您会发现这些CPU的极端现代版本具有16和32(我认为)寄存器的向量寄存器集;操作码位现在便宜很多,并且指令获取速率令人难以置信。
答案 1 :(得分:1)
您可以轻松解释自己。要寻址8个寄存器,您只需要3位,它是汇编语言命令格式的可用内容。由于64命令大两倍,它有6位。 在这里查看更多 What is the size of each asm instruction?
因此,如果最短指令长度为1个字节,则只有8位。因此,如果您需要从一个寄存器移动到另一个寄存器的命令,则需要保留以下8位:
操作码
来源地址
目的地地址
由于源和指定地址各占3位,因此消耗6位,实际操作只有2位,移动,添加,子和交换共有4位。
答案 2 :(得分:1)
我记得1978年的原始8086有几万个晶体管,因此,所有指令都是微编码的。这意味着将16位处理器的功能强加到等式中会有很多妥协。迄今为止最成功的16位处理器是Digital Equipment的PDP-11,它还有8个通用寄存器。 8086在16位寄存器中有4个字节寄存器更好。
甚至地址转换都是微编码的。指令所需的平均周期为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位寄存器,并实现了修改后的指令集。后者赢了。