X86 为什么只有四个寄存器?

X86 为什么只有四个寄存器?,x86,cpu-architecture,X86,Cpu Architecture,为什么在最常见的CPU(x86)中只有四个寄存器?如果增加更多的寄存器,速度不会有很大的提高吗?什么时候会增加更多的寄存器?现在有4个以上的寄存器。如果您查看,您会发现它是从8086指令集演变而来的。英特尔一直希望在其处理器系列中保持一定程度的向后兼容性,因此所有后续处理器只需将原始A、B、C、D寄存器扩展到更广泛的位数。原始段寄存器今天可以用于一般用途,因为不再有真正的段(这是一个过于简单的说法,但基本上是正确的)。新的x64体系结构还提供了一些额外的寄存器 寄存器过去实现起来很昂贵 不一定。

为什么在最常见的CPU(x86)中只有四个寄存器?如果增加更多的寄存器,速度不会有很大的提高吗?什么时候会增加更多的寄存器?

现在有4个以上的寄存器。如果您查看,您会发现它是从8086指令集演变而来的。英特尔一直希望在其处理器系列中保持一定程度的向后兼容性,因此所有后续处理器只需将原始A、B、C、D寄存器扩展到更广泛的位数。原始段寄存器今天可以用于一般用途,因为不再有真正的段(这是一个过于简单的说法,但基本上是正确的)。新的x64体系结构还提供了一些额外的寄存器

  • 寄存器过去实现起来很昂贵
  • 不一定。现代x86 CPU上的寄存器数量远远超出了CPU显示的数量——CPU维护根据指令流根据需要重命名的影子寄存器
  • 在AMD64/x86_64中。在64位模式下运行时,通用寄存器的数量增加一倍(除了它们的大小增加一倍之外)

  • 有许多体系结构具有更多寄存器(ARM、PowerPC等)。有时,它们可以实现更高的指令吞吐量,因为在操作堆栈时所做的工作更少,并且指令可能更短(无需引用堆栈变量)。相反,由于更多的寄存器保存,函数调用变得更昂贵。

    还有更多,这四个函数只是特殊的,它们是“通用的”,我认为,所有这些以及其他函数没有被大量使用的原因是:

    • x86并不是事实上最好的标准指令集,Intell只是看到了向后兼容性的潜力,一旦AMD加入,这只是时间问题
    • 现在这是事实上的标准,所以我们必须接受它
    • 添加更多寄存器将不再是x86,因此您的意思是“基于x86创建一个具有更多寄存器的新指令集”
    • 大多数编译器不会使用它们,因为它们也可以编译为x86,以针对x86的超集
    • 更多的寄存器意味着更昂贵的硬件

    注册使用的内存对CPU工程师来说非常昂贵。除了设计上的困难外,增加可用寄存器的数量会使CPU芯片更加昂贵

    此外:

    • 还有其他更经济高效的方法来提高CPU性能
    • 即使引入了更多,您仍然需要更新指令集并修改编译器以使用
    • 已经有超过4个注册:来自维基百科(世界上最可靠的来源)
      • AX/EAX/RAX:累加器
      • BX/EBX/RBX:基本索引(例如:数组)
      • CX/ECX/RCX:计数器
      • DX/EDX/RDX:数据/通用
      • SI/ESI/RSI:字符串操作的“源索引”
      • DI/EDI/RDI:字符串操作的“目的地索引”
      • SP/ESP/RSP:堆栈顶部地址的堆栈指针
      • BP/EBP/RBP:用于保存当前堆栈帧地址的堆栈基指针
      • IP/EIP/RIP:指令指针。保存程序计数器,即当前指令地址

    嗯。。。。。(E/R)AX,(E/R)BX,(E/R)CX,(E/R)DX,(E/R)SI,(E/R)DI,(E/R)SP,(E/R)BP,(E/R)IP。我认为这超过了4条

    更多的寄存器并不一定会使事情变得更快,它们会使CPU体系结构更加复杂,因为寄存器必须靠近其他组件,并且许多指令只在特定的寄存器上工作

    但是现代的CPU有四个以上的寄存器,从我的头顶上看有AX,BX,CX,DX,SI,DI,BP。。。然后CPU有内部寄存器,例如PIC(处理器指令计数器)

    x86总是有四个以上的寄存器。最初,它有CS、DS、ES、SS、AX、BX、CX、DX、SI、DI、BP、SP、IP和标志。其中,七个(AX、BX、CX、DX、SI、DI和BP)支持大多数通用操作(加法、减法等)。BP和BX还支持用作“基址”寄存器(即,保存用于间接寻址的地址)。SI和DI也可用作索引寄存器,与基址寄存器大致相同,只是指令可以从一个基址寄存器和一个索引寄存器生成地址,但不能从两个索引寄存器或两个基址寄存器生成地址。至少在典型使用中,SP专用于充当堆栈指针

    从那时起,寄存器变得越来越大,添加了更多的寄存器,其中一些寄存器变得更加通用,因此(例如)现在可以在2寄存器寻址模式下使用任意2个通用寄存器。有点奇怪的是,386中添加了两个段寄存器(FS和GS),这也允许32位段,这使得所有段寄存器几乎不相关。它们有时用于线程本地存储

    我还应该补充一点,当您执行多任务、多线程等操作时,大量寄存器可能会受到相当严重的惩罚——因为您不知道哪些寄存器正在使用,当您执行上下文切换时,您必须在一个任务中保存所有寄存器,并为下一个任务加载所有保存的寄存器。在像安腾(Itanium)或SPARC这样拥有200+寄存器的CPU中,这可能相当慢。最近的SPARC投入了大量的芯片面积来优化这一点,但它们的任务切换仍然相对缓慢。安腾的情况甚至更糟——这是安腾在典型服务器任务上表现不佳的一个原因,尽管它在科学计算领域(很少)使用任务切换

    最后,当然,所有这些都与x86的合理现代实现的工作方式大不相同。从奔腾Pro开始,Intel将体系结构寄存器(即可以在指令中寻址的寄存器)与实现解耦。为了支持并发、无序执行,奔腾Pro