In der x86-64-Tour der Intel-Handbücher habe ich gelesen
Die vielleicht überraschendste Tatsache ist, dass ein Befehl wie beispielsweise
MOV EAX, EBXautomatisch die oberen 32RAXRegisterbits 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).
r32Zieloperanden setzen den High 32 auf Null, anstatt zusammenzuführen. Zum Beispiel wird ersetzen einige Montierer pmovmskb r64, xmmmit pmovmskb r32, xmmeiner 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,eaxoder xor r8d,r8dist 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