En el montaje de este código con nasm
:¿Se puede usar "mov eax, 0x1" en lugar de "mov rax, 0x1"?
BITS 64
mov eax, 0x1
mov rax, 0x1
puedo obtener este resultado:
b8 01 00 00 00 b8 01 00 00 00
que es el código de operación para mov eax, 0x1
repitió dos veces.
¿Esto significa que mov rax, 0x1
puede siempre ser reemplazado por mov eax, 0x1
o es solo en este caso?
Si esto es correcto, ¿no sería mejor usar que:
xor rax, rax
inc rax
como que se convierte en 6 bytes cuando está montado, mientras mov eax, 0x1
es sólo 5 bytes?
Pertinente: http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers –
En realidad, como el primer fragmento es correcto, el segundo fragmento solo tomaría 4 bytes (no se requieren prefijos REX). – harold
'xor eax, eax' /' inc eax' es 4B, un poco más pequeño que 'mov eax, 1'. Pero no lo use a menos que esté optimizando mucho para el tamaño del código. Gastar 1 byte para guardar una instrucción (y un uop de dominio fusionado) vale la pena para las CPU modernas. –