Assembly 将64位寄存器的前32位归零
使用amd64汇编,将64位寄存器的前32位归零的最佳方法是什么,例如,将eax未涵盖的rax位归零?似乎我无法根据64位常量对整个寄存器进行排序Assembly 将64位寄存器的前32位归零,assembly,x86-64,machine-language,Assembly,X86 64,Machine Language,使用amd64汇编,将64位寄存器的前32位归零的最佳方法是什么,例如,将eax未涵盖的rax位归零?似乎我无法根据64位常量对整个寄存器进行排序 movl%eax,%eax或mov-eax,eax,具体取决于使用的汇编程序 请参阅:英特尔64和IA-32体系结构-软件开发人员手册,3.4.1.1:64位模式下的通用寄存器 32位操作数生成32位结果,在目标通用中零扩展为64位结果 注册。 关于@HansPassant的评论,我还要补充:7.3.1.7: MOVSXD指令对64位数据进行操作。它
movl%eax,%eax
或mov-eax,eax
,具体取决于使用的汇编程序
请参阅:英特尔64和IA-32体系结构-软件开发人员手册,3.4.1.1:64位模式下的通用寄存器
32位操作数生成32位结果,在目标通用中零扩展为64位结果
注册。
关于@HansPassant的评论,我还要补充:7.3.1.7:
MOVSXD指令对64位数据进行操作。它将32位的值扩展到64位。eax不是rax的低32位吗?请参见此处:如果eax是有符号值,那么如果值为负数,则需要1s,而不是0s。MOVSXD。如果可能的话,最好是
mov
到另一个寄存器(不在其他地方花费额外的指令)mov same,same
击败了Intel SnB系列和AMD Ryzen上的mov消除,因此mov edi,edi
与作为dep链一部分的mov ecx,edi相比,延迟成本为1c。(见附件)。即使延迟比吞吐量更重要,但背对背的mov-eax,edi
/mov-edi,eax
可能会使其中一个无法消除mov,因此通常不要这样做。