从 eax 到 rax 寄存器的转换
Conversion from eax to rax register
在下面的代码中:
!6 movl , %ebx
寄存器显示值:
rbx 0x0000000000000005
ebx
是否会在 64 位架构上自动转换为 rdx
?在该体系结构上写 ebx
"wrong" 或者或多或少是 rdx
的别名?两者之间有什么显着差异吗?
例如,对我来说,它们在 gdb 中都产生相同的结果:
>>> p $rbx
= 5
>>> p $rax
= 1
>>> p $eax
= 1
>>> p $ebx
= 5
or is more-or-less an alias for rdx when on that architecture?
$ebx
是完整 $rbx
寄存器的低 32 位的别名(有 没有 实际 ebx
寄存器) .
Does ebx automatically convert to rdx on a 64-bit architecture?
否,但写入 EBX 会零扩展到 RBX。 (不是 RDX,我认为 B vs. D 是错字)。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?
所以是的,mov , %ebx
与 mov , %rbx
完全 做同样的事情,但效率更高(更少的机器代码字节)。一些汇编器(不是 GAS)甚至会为您优化一个到另一个。
例如:
mov $-1, %rbx # RBX = 0xFFFFFFFFFFFFFFFF
mov %ebx, %ecx # RCX = 0x00000000FFFFFFFF
dec %ebx # RBX = 0x00000000FFFFFFFE
Is writing ebx "wrong"
视情况而定(见下文)。如果您不需要使用 64 位数量,通常这是一种优化。
Is there any significant difference between the two?
是的。在以下汇编指令中,只有一个可以编译:
movq [=11=]x12345678ABCD, $rbx
movq [=11=]x12345678ABCD, $ebx
在下面的代码中:
!6 movl , %ebx
寄存器显示值:
rbx 0x0000000000000005
ebx
是否会在 64 位架构上自动转换为 rdx
?在该体系结构上写 ebx
"wrong" 或者或多或少是 rdx
的别名?两者之间有什么显着差异吗?
例如,对我来说,它们在 gdb 中都产生相同的结果:
>>> p $rbx
= 5
>>> p $rax
= 1
>>> p $eax
= 1
>>> p $ebx
= 5
or is more-or-less an alias for rdx when on that architecture?
$ebx
是完整 $rbx
寄存器的低 32 位的别名(有 没有 实际 ebx
寄存器) .
Does ebx automatically convert to rdx on a 64-bit architecture?
否,但写入 EBX 会零扩展到 RBX。 (不是 RDX,我认为 B vs. D 是错字)。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?
所以是的,mov , %ebx
与 mov , %rbx
完全 做同样的事情,但效率更高(更少的机器代码字节)。一些汇编器(不是 GAS)甚至会为您优化一个到另一个。
例如:
mov $-1, %rbx # RBX = 0xFFFFFFFFFFFFFFFF
mov %ebx, %ecx # RCX = 0x00000000FFFFFFFF
dec %ebx # RBX = 0x00000000FFFFFFFE
Is writing ebx "wrong"
视情况而定(见下文)。如果您不需要使用 64 位数量,通常这是一种优化。
Is there any significant difference between the two?
是的。在以下汇编指令中,只有一个可以编译:
movq [=11=]x12345678ABCD, $rbx
movq [=11=]x12345678ABCD, $ebx