2012-08-06 15 views
5

Nel montaggio di questo codice con nasm:È possibile utilizzare sempre "mov eax, 0x1" anziché "mov rax, 0x1"?

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

ottengo questo output:

b8 01 00 00 00 b8 01 00 00 00 

che è il codice operativo per mov eax, 0x1 ripetuta due volte.

Ciò significa che mov rax, 0x1 può sempre essere sostituito da mov eax, 0x1 o è solo in questo caso?

Se questo è corretto non sarebbe meglio usare rispetto:

xor rax, rax 
inc rax 

come che diventa 6 byte quando assemblato mentre mov eax, 0x1 è a soli 5 byte?

+0

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

+4

In realtà, poiché il primo frammento è corretto, il secondo frammento richiederebbe solo 4 byte (non sono richiesti prefissi REX). – harold

+0

'xor eax, eax' /' inc eax' è 4B, leggermente più piccolo di 'mov eax, 1'. Ma non usarlo a meno che tu non stia ottimizzando pesantemente le dimensioni del codice. Spendere 1 byte per salvare un'istruzione (e un dominio ufo fuso) vale la pena per le moderne CPU. –

risposta

5

Sempre. La maggior parte (se non tutte) le MOV di 32 bit e le operazioni ALU cancellano i bit da 32 a 63 dell'operando del registro di destinazione. Vedi il manuale della CPU per i dettagli.

Problemi correlati