【问题标题】:Conversion from eax to rax register从 eax 到 rax 寄存器的转换
【发布时间】:2019-10-09 01:56:13
【问题描述】:

在以下代码中:

!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

【问题讨论】:

  • 我更新了 Employed Russian 的回答;它遗漏了写 EBX 确实 零扩展到完整 RBX 的重要细节,所以是的,mov $5, %ebx 是编译器使用的,而不是 mov $5, %rbx 用于 0..2^32 - 1 的值

标签: assembly gdb x86-64 cpu-registers


【解决方案1】:

或者在那个架构上或多或少是 rdx 的别名?

$ebx 是完整 $rbx 寄存器的低 32 位的别名(没有实际的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2013-10-22
    相关资源
    最近更新 更多