2012-08-06 15 views
5

Podczas montażu tego kodu z nasm:Czy można użyć "mov eax, 0x1" zamiast "mov rax, 0x1"?

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

uzyskać ten wynik:

b8 01 00 00 00 b8 01 00 00 00 

która jest opcode dla mov eax, 0x1 powtórzono dwukrotnie.

Czy to oznacza, że ​​mov rax, 0x1 można zawsze zastąpić przez mov eax, 0x1, czy jest to właśnie w tym przypadku?

Jeśli to prawda czy nie byłoby lepiej użyć niż:

xor rax, rax 
inc rax 

jako że staje się po złożeniu 6 bajtów podczas mov eax, 0x1 jest tylko 5 bajtów?

+0

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

+4

W rzeczywistości, ponieważ pierwszy fragment jest poprawny, drugi fragment zajmuje tylko 4 bajty (nie są wymagane prefiksy REX). – harold

+0

'xor eax, eax' /' inc eax' to 4B, nieco mniejsze niż 'mov eax, 1'. Ale nie używaj tego, chyba że intensywnie optymalizujesz rozmiar kodu. Wydanie 1 bajta, aby zapisać instrukcję (i uop) jest opłacalne dla nowoczesnych procesorów. –

Odpowiedz

5

Zawsze. Większość (jeśli nie wszystkie) 32-bitowe MOV i operacje ALU usuwają bity od 32 do 63 z operandu rejestru docelowego. Zobacz szczegóły w instrukcji procesora.

Powiązane problemy