2012-08-06 7 views
5

Wenn Sie diesen Code mit nasm Montage:Kann "mov eax, 0x1" immer anstelle von "mov rax, 0x1" verwendet werden?

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

ich diese Ausgabe:

b8 01 00 00 00 b8 01 00 00 00 

, die der Opcode für mov eax, 0x1 zweimal wiederholt wird.

Bedeutet dies, dass mov rax, 0x1 kann immer durch mov eax, 0x1 ersetzt werden oder ist es nur in diesem Fall?

Wenn dies richtig ist, wäre es nicht besser, als zu verwenden:

xor rax, rax 
inc rax 

wie das wird 6 Bytes zusammengesetzt, während mov eax, 0x1 nur 5 Bytes?

+0

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

+4

Eigentlich, weil das erste Snippet korrekt ist, würde das zweite Snippet nur 4 Bytes dauern (keine REX-Präfixe erforderlich). – harold

+0

'xor eax, eax' /' inc eax' ist 4B, etwas kleiner als 'mov eax, 1'. Verwenden Sie das jedoch nur, wenn Sie die Code-Größe stark optimieren. Die Ausgabe von 1 Byte zum Speichern einer Anweisung (und eines Fused-Domain-Uops) lohnt sich für moderne CPUs. –

Antwort

5

Immer. Die meisten (wenn nicht alle) 32-Bit-MOVs und ALU-Operationen löschen die Bits 32 bis 63 des Zielregisteroperanden. Einzelheiten finden Sie im CPU-Handbuch.