EAX寄存器是否针对现代处理器的计算进行了优化?

时间:2017-04-28 20:51:48

标签: assembly x86 intel

文章The Art of picking Intel Registers上写着:

  

[因为]大多数计算都发生在累加器中,x86架构包含许多优化指令,用于将数据移入和移出该寄存器。首先,处理器具有16个字节大小的XCHG操作码,用于在累加器和任何其他寄存器之间交换数据。这些并不是非常有用,但它们表明英特尔工程师更喜欢累加器而不是其他寄存器。对于他们来说,最好将数据交换到累加器中,而不是将其与它一起使用。将数据移入和移出累加器的其他指令是LODS,STOS,IN,OUT,INS,OUTS,SCAS和XLAT。最后,MOV指令有一个特殊的单字节操作码,用于将数据从恒定的存储单元移入累加器。

     

在您的代码中,尽量在累加器中执行尽可能多的工作。

由于文章的日期是2003年,我很想知道这是否是真正的现代加工商(你好,从2017年开始)。给出英特尔文档参考的要点。

1 个答案:

答案 0 :(得分:3)

现代英特尔处理器使用称为寄存器重命名的技术。简而言之,CPU有一堆寄存器(~100),它们与您在程序集中看到的寄存器断开连接。 CPU管理该寄存器池并根据需要将它们映射到寄存器名称。因此,就CPU而言,所有通用寄存器都是无法区分的。

当手动编程汇编时,寄存器选择可能很重要,因为某些指令(如单操作数imul)仅在固定寄存器上运行。但是,这些说明很少见,而且大部分说明已经过时,这使得这种选择在实践中变得不那么重要了。

另一个问题是,根据您的调用约定,返回时必须保留一些寄存器,因此在将它们用于您自己的目的之前,您必须保存它们的值。如果你的函数只需要几个寄存器,那么避免使用这些寄存器是很有用的,这样你就可以摆脱相应的推送和弹出。