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).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage