2012-08-06 13 views
5

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?

+0

Pertinente: http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers –

+4

En realidad, como el primer fragmento es correcto, el segundo fragmento solo tomaría 4 bytes (no se requieren prefijos REX). – harold

+0

'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. –

Respuesta

5

Siempre. La mayoría (si no todas) las MOV de 32 bits y las operaciones ALU borran los bits 32 a 63 del operando de registro de destino. Ver el manual de la CPU para más detalles.

Cuestiones relacionadas