Beim Zusammenstellen dieses Codes mit nasm
:
BITS 64
mov eax, 0x1
mov rax, 0x1
erhalte ich diese Ausgabe:
b8 01 00 00 00 b8 01 00 00 00
was der Opcode für mov eax, 0x1
ist, der zweimal wiederholt wird.
Bedeutet dies, dass mov rax, 0x1
immer durch mov eax, 0x1
ersetzt werden kann oder ist es nur in diesem Fall so?
Wenn das korrekt ist, wäre es nicht besser als folgendes zu verwenden:
xor rax, rax
inc rax
da das beim Zusammenstellen 6 Bytes ergibt, während mov eax, 0x1
nur 5 Bytes sind?
1 Stimmen
Relevant: stackoverflow.com/questions/8502839/…
4 Stimmen
Tatsächlich würde das zweite Snippet nur 4 Bytes benötigen (keine REX-Präfixe erforderlich), da das erste Snippet korrekt ist.
1 Stimmen
xor eax,eax
/inc eax
ist 4B, etwas kleiner alsmov eax, 1
. Aber benutze das nicht, es sei denn, du optimierst stark für die Code-Größe. Es lohnt sich, 1 Byte zu investieren, um eine Instruktion (und eine fused-domain uop) zu sparen für moderne CPUs.0 Stimmen
Sie können
mov rax, strict dword/qword 1
verwenden, um die 7/10-Byte-Version von mov zu erzwingen