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?
Ważne: http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers –
W rzeczywistości, ponieważ pierwszy fragment jest poprawny, drugi fragment zajmuje tylko 4 bajty (nie są wymagane prefiksy REX). – harold
'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. –