Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 32位和64位值是否共享相同的寄存器空间?_Assembly_X86 64_Att - Fatal编程技术网

Assembly 32位和64位值是否共享相同的寄存器空间?

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

如果我从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 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