从 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 , %ebxmov , %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