首页 文章

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

提问于
浏览
2

文章The Art of picking Intel Registers读到:

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

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

1 回答

  • 3

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

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

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

相关问题