Vom x86-64 Tour of Intel Manuals las ichWarum zerlegen x86-64-Anweisungen in 32-Bit-Registern den oberen Teil des vollständigen 64-Bit-Registers?
Vielleicht ist die überraschende Tatsache ist, dass eine Anweisung wie
MOV EAX, EBX
automatisch oberen 32 Bits vonRAX
Register Nullen.
Die Intel-Dokumentation (3.4.1.1 Allzweckregister in 64-Bit-Modus in der manuellen Grund Architecture) an der gleichen Quelle zitiert sagt uns:
- 64-Bit-Operanden erzeugen eine 64 -Bit führt zum Ziel-Allzweckregister.
- 32-Bit-Operanden erzeugen ein 32-Bit-Ergebnis, das im Ziel-Allzweckregister zu einem 64-Bit-Ergebnis Null 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 nicht durch die Operation modifiziert. Wenn das Ergebnis einer 8-Bit- oder 16-Bit-Operation für die 64-Bit-Adressberechnung bestimmt ist, zeichen Sie das Register explizit auf die vollen 64 Bits aus.
In x86-32 und x86-64 Montag, 16-Bit-Befehle wie
mov ax, bx
zeigen nicht diese Art von "fremdem" Verhalten, dass das obere Wort von EAX auf Null gesetzt wird.
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 Versammlung gewöhnt bin).
Wenn Sie Google für "Partial Register Stall", finden Sie eine ganze Reihe von Informationen über das Problem, das sie (fast sicher) versucht zu vermeiden. –
http://stackoverflow.com/questions/25455447/x86-64-register-rax-ax-ax-al-overwriting-ful-register-contents –
Nicht nur "die meisten".AFAIK, * alle * Anweisungen mit einem 'r32'-Zieloperanden setzen das Hoch 32 auf Null, anstatt es zu verschmelzen. Zum Beispiel werden einige Assembler 'pmovmskb r64, xmm' durch' pmovmskb r32, xmm' ersetzen und einen REX speichern, da sich die 64bit Zielversion identisch verhält. Obwohl der Abschnitt [Operation des Handbuchs] (http://www.felixcloutier.com/x86/PMOVMSKB.html) alle 6 Kombinationen von 32/64-Bit-Ziel- und 64/128/256b-Quellen separat auflistet, ist dies die implizite Null-Erweiterung der r32-Form dupliziert die explizite Zero-Extension der r64-Form. Ich bin gespannt auf die HW-Implementierung ... –