从eax到rax寄存器的转换

问题描述 投票:0回答:1

在以下代码中:

!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
assembly gdb x86-64 cpu-registers
1个回答
2
投票

或在该体系结构上或多或少是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, %ebxmov $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

© www.soinside.com 2019 - 2024. All rights reserved.