7 Stimmen

Kann "mov eax, 0x1" immer anstelle von "mov rax, 0x1" verwendet werden?

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

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 als mov 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.

8voto

Alexey Frunze Punkte 59460

Immer. Die meisten (wenn nicht alle) 32-Bit MOVs und ALU-Operationen löschen die Bits 32 bis 63 des Zielregisteroperands. Siehe das CPU-Handbuch für Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X