In der x86-64-Tour der Intel-Handbücher habe ich gelesen
Die vielleicht überraschendste Tatsache ist, dass ein Befehl wie beispielsweise
MOV EAX, EBX
automatisch die oberen 32RAX
Registerbits auf Null setzt .
In der Intel-Dokumentation (3.4.1.1 Allzweckregister im 64-Bit-Modus in der manuellen Basisarchitektur), die an derselben Quelle zitiert wird, heißt es:
- 64-Bit-Operanden erzeugen ein 64-Bit-Ergebnis im Ziel-Allzweckregister.
- 32-Bit-Operanden erzeugen ein 32-Bit-Ergebnis, das im Ziel-Allzweckregister auf ein 64-Bit-Ergebnis erweitert wird.
- 8-Bit- und 16-Bit-Operanden erzeugen ein 8-Bit- oder 16-Bit-Ergebnis. Die oberen 56 Bits bzw. 48 Bits des Ziel-Allzweckregisters werden durch die Operation nicht modifiziert. Wenn das Ergebnis einer 8-Bit- oder 16-Bit-Operation für die 64-Bit-Adressberechnung vorgesehen ist, erweitern Sie das Register explizit auf die vollen 64-Bit-Zeichen.
In der x86-32- und x86-64-Assembly werden 16-Bit-Anweisungen wie z
mov ax, bx
Zeigen Sie nicht diese Art von "seltsamem" Verhalten, dass das obere Wort von eax auf Null gesetzt ist.
Also: Was ist der Grund, warum dieses Verhalten eingeführt wurde? Auf den ersten Blick scheint es unlogisch (aber der Grund könnte sein, dass ich an die Macken der x86-32-Assembly gewöhnt bin).
r32
Zieloperanden setzen den High 32 auf Null, anstatt zusammenzuführen. Zum Beispiel wird ersetzen einige Montierer pmovmskb r64, xmm
mit pmovmskb r32, xmm
einer REX zu speichern, da die 64 - Bit - Zielversion identisch verhält. Obwohl im Abschnitt "Operation" des Handbuchs alle 6 Kombinationen von 32/64-Bit-Dest und 64/128 / 256b-Quelle separat aufgeführt sind, dupliziert die implizite Null-Erweiterung des r32-Formulars die explizite Null-Erweiterung des r64-Formulars. Ich bin gespannt auf die HW-Implementierung ...
xor eax,eax
oder xor r8d,r8d
ist der beste Weg, um RAX oder R8 auf Null zu setzen (das Speichern eines REX-Präfixes für RAX und 64-Bit-XOR wird in Silvermont nicht einmal speziell behandelt). Verwandte: Wie genau funktionieren Teilregister auf Haswell / Skylake? Das Schreiben von AL scheint eine falsche Abhängigkeit von RAX zu haben, und AH ist inkonsistent