Преобразование из eax в rax регистр - PullRequest
0 голосов
/ 09 октября 2019

В следующем коде:

!6    movl $5, %ebx

В регистре отображается значение:

rbx 0x0000000000000005

Преобразуется ли ebx в rdx автоматически в 64-разрядной архитектуре? Является ли запись ebx «неправильной» или более или менее является псевдонимом для rdx в этой архитектуре? Есть ли существенная разница между ними?

Например, для меня они оба производят одинаково в GDB:

>>> p $rbx
$3 = 5
>>> p $rax
$4 = 1
>>> p $eax
$5 = 1
>>> p $ebx
$6 = 5

1 Ответ

1 голос
/ 09 октября 2019

или более или менее псевдоним для rdx, когда на этой архитектуре?

$ebx является псевдонимом младших 32 бит полного регистра $rbx (существует нет фактический ebx регистр).

ebx автоматически конвертирует в rdx в 64-битной архитектуре?

Нет, но запись в EBX с нуля распространяется в RBX. (Не RDX, я предполагаю, что B против D - опечатка). Почему инструкции x86-64 для 32-битных регистров обнуляют верхнюю часть полного 64-битного регистра?

Так что да, mov $5, %ebx делает точно то же самое, что и mov $5, %rbx, но более эффективно (меньше байтов машинного кода). Некоторые ассемблеры (не GAS) даже оптимизируют один для другого.

Например:

   mov   $-1, %rbx         # RBX = 0xFFFFFFFFFFFFFFFF
   mov   %ebx, %ecx        # RCX = 0x00000000FFFFFFFF
   dec   %ebx              # RBX = 0x00000000FFFFFFFE

Пишет ebx "неправильно"

Зависит (см. Ниже). Обычно это оптимизация, если вам не нужно работать с 64-битными величинами. Преимущества использования 32-битных регистров / инструкций в x86-64

Есть ли существенная разница между ними?

Да. Из следующих инструкций по сборке будет скомпилирована только одна:

movq $0x12345678ABCD, $rbx
movq $0x12345678ABCD, $ebx
...