在以下代码中:
!6 movl $5, %ebx
寄存器显示值:
rbx 0x0000000000000005
ebx
是否可以在64位体系结构上自动转换为rdx
?在该体系结构上写ebx
是“错误”还是rdx
的别名?两者之间有何重大区别?
例如,对我来说,它们在gdb中都产生相同的结果:
>>> p $rbx
$3 = 5
>>> p $rax
$4 = 1
>>> p $eax
$5 = 1
>>> p $ebx
$6 = 5
或在该体系结构上或多或少是rdx的别名?
$ebx
是完整的$rbx
寄存器的低32位的别名(存在no实际的ebx
寄存器)。
ebx是否会在64位体系结构上自动转换为rdx?
[否,但是写入EBX会零扩展到RBX。 (不是RDX,我认为B对D是错字)。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?
所以是的,mov $5, %ebx
与mov $5, %rbx
所做的[精确地]相同,但效率更高(机器代码字节更少)。一些汇编程序(而非GAS)甚至会为您优化彼此。例如:
mov $-1, %rbx # RBX = 0xFFFFFFFFFFFFFFFF
mov %ebx, %ecx # RCX = 0x00000000FFFFFFFF
dec %ebx # RBX = 0x00000000FFFFFFFE
正在写ebx“错误”
取决于(请参阅下文)。如果您不需要使用64位数量,通常这是一种优化。 The advantages of using 32bit registers/instructions in x86-64
两者之间是否有显着差异?是。在以下汇编指令中,只有一个可以编译:
movq $0x12345678ABCD, $rbx
movq $0x12345678ABCD, $ebx