Warum setzen x86-64-Befehle in 32-Bit-Registern den oberen Teil des vollständigen 64-Bit-Registers auf Null?
In demx86-64-Tour durch Intel-Handbücher, Ich lese
Die vielleicht überraschendste Tatsache ist, dass eine Anweisung wieMOV EAX, EBX
setzt automatisch die oberen 32 Bits von auf NullRAX
registrieren.
In der Intel-Dokumentation (3.4.1.1 Allgemeine Register im 64-Bit-Modus in Manual Basic Architecture), die an derselben Quelle zitiert wird, heißt es:
64-Bit-Operanden erzeugen ein 64-Bit-Ergebnis im Ziel-Universalregister.32-Bit-Operanden erzeugen ein 32-Bit-Ergebnis, das im Ziel-Universalregister auf ein 64-Bit-Ergebnis von 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-Universalregisters werden durch die Operation nicht geändert. Wenn das Ergebnis einer 8-Bit- oder 16-Bit-Operation für die 64-Bit-Adressberechnung vorgesehen ist, erweitern Sie das Register explizit mit Vorzeichen auf die vollständigen 64-Bit-Adressen.In der x86-32- und x86-64-Assembly werden 16-Bit-Anweisungen wie z
mov ax, bx
zeige 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).