Может ли "mov eax, 0x1" всегда использоваться вместо "mov rax, 0x1"?

При сборке этого кода с nasm:

BITS 64
mov eax, 0x1
mov rax, 0x1

Я получаю этот вывод:

b8 01 00 00 00 b8 01 00 00 00

который является кодом операции для mov eax, 0x1, повторяется дважды.

Означает ли это, что mov rax, 0x1 может всегда заменяться на mov eax, 0x1 или это просто в этом случае?

Если это правильно, было бы лучше использовать, чем:

xor rax, rax
inc rax

поскольку при сборке становится 6 байтов, а mov eax, 0x1 - всего 5 байтов?

Ответы

Ответ 1

Всегда. Большинство (если не все) 32-битных MOV и ALU-операций очищают биты с 32 по 63 операнда регистра назначения. Подробнее см. В руководстве по процессору.