【问题标题】:zero out top 32 bits of 64-bit register将 64 位寄存器的前 32 位清零
【发布时间】:2014-02-21 17:46:22
【问题描述】:

使用 amd64 汇编,将 64 位寄存器的前 32 位清零的最佳方法是什么,例如将 eax 未覆盖的 rax 位清零?看来我不能和整个寄存器针对 64 位常量。

【问题讨论】:

标签: assembly x86-64 machine-language


【解决方案1】:

movl %eax, %eaxmov eax, eax,取决于使用的汇编程序。

请参阅:英特尔® 64 和 IA-32 架构 - 软件开发人员手册,Volume 1,3.4.1.1:64 位模式下的通用寄存器。

32 位操作数生成 32 位结果,在目标通用中将零扩展为 64 位结果 注册。

关于@HansPassant 的评论,我还应该补充:7.3.1.7:

MOVSXD 指令对 64 位数据进行操作。它将 32 位值符号扩展为 64 位。

【讨论】:

  • 如果可能的话,mov 到一个不同的 寄存器总是更好(不要在其他地方花费额外的指令)。 mov same,same 在 Intel SnB 系列和 AMD Ryzen 上击败了 mov-elimination,因此 mov edi,edi 的延迟为 1c,而作为 dep 链的一部分,mov ecx,edi 的延迟为 0 个周期。 (见Can x86's MOV really be "free"? Why can't I reproduce this at all?)。即使延迟比吞吐量更重要,背靠背的mov eax, edi / mov edi, eax 也可能会击败其中一个的 mov-elimination,因此通常不要这样做。
猜你喜欢
  • 2011-10-26
  • 2012-06-25
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多