Assembly 32位和64位值是否共享相同的寄存器空间?
如果我从32位寄存器中移动一个值,则表示:Assembly 32位和64位值是否共享相同的寄存器空间?,assembly,x86-64,att,Assembly,X86 64,Att,如果我从32位寄存器中移动一个值,则表示: movq %rdx,%rax movl %edx,%eax %rax中存储的值是否会被删除?是 您的代码: mov rax,rdx mov eax,edx 将执行以下操作 rax <= rdx high 32 bits of rax <= 0, low 32 bits of rax <= edx. 更好的选择是 mov rax,-1 //1 cycle movzx eax,dx //runs
movq %rdx,%rax
movl %edx,%eax
%rax中存储的值是否会被删除?是
您的代码:
mov rax,rdx
mov eax,edx
将执行以下操作
rax <= rdx
high 32 bits of rax <= 0, low 32 bits of rax <= edx.
更好的选择是
mov rax,-1 //1 cycle
movzx eax,dx //runs concurrent with previous instruction, 0 cycles
mov r8,rax //1 cycle
//Total 2 cycles, twice as fast.
这段代码并不等同于上面的示例,但这就是重点。尽可能避免部分寄存器更新。
另请注意,出于上述原因,movzx-eax,dx
等同于movzx-rax,dx
。在x64上,它短一个字节,因此是首选形式
注意,原则上我没有使用ATT语法
您的代码:
mov rax,rdx
mov eax,edx
将执行以下操作
rax <= rdx
high 32 bits of rax <= 0, low 32 bits of rax <= edx.
更好的选择是
mov rax,-1 //1 cycle
movzx eax,dx //runs concurrent with previous instruction, 0 cycles
mov r8,rax //1 cycle
//Total 2 cycles, twice as fast.
这段代码并不等同于上面的示例,但这就是重点。尽可能避免部分寄存器更新。
另请注意,出于上述原因,movzx-eax,dx
等同于movzx-rax,dx
。在x64上,它短一个字节,因此是首选形式
请注意,原则上我没有使用ATT语法是的,尽管不是出于您认为的原因。你也可以试试。当然可以。无论使用8/16/32/64位模式寻址,它都是相同的寄存器。这里有一个很好的图表:@Jester“不是因为你想的原因。”请详细说明。@Thilo他将
rdx
移动到rax
,然后edx
移动到eax
。如果不是因为32位操作将顶层位归零,这通常不会改变任何事情。请参见“是”,尽管不是因为您认为的原因。你也可以试试。当然可以。无论使用8/16/32/64位模式寻址,它都是相同的寄存器。这里有一个很好的图表:@Jester“不是因为你想的原因。”请详细说明。@Thilo他将rdx
移动到rax
,然后edx
移动到eax
。如果不是因为32位操作将顶层位归零,这通常不会改变任何事情。请参阅“更好的选项”确实更快,但并不等同于原始的延迟代码。movzx
使初始的mov
完全冗余。此外,基于本答案前半部分给出的原因,movzx
可以更有效地写成movzx eax,dx
。更好的选项确实更快,但并不等同于原始的延迟代码。movzx
使初始的mov
完全冗余。此外,根据本答案前半部分给出的原因,movzx
可以更有效地写成movzx eax,dx
。