Ich schaute mir das xchg an und fand etwas interessantes, dass es scheint, dass ein Byte in die Anweisung zur Angabe der Register codiert werden kann
Ja, so funktionieren die meisten x86-Anweisungen. Befehle werden entweder 32 oder 64 Bit (Wortlänge der Maschine) abgerufen, nicht Byte.
Festlegen eines XCHG
von rAX
mit rAX
(wo rAX
ist EAX
auf einer 32-Bit - Maschine und RAX
auf einer 64-Bit - Maschine) werden 0x90
, da das Register Mux - Code für rAX
ist 0x00
(effektiv ein Betrieb eines Zyklus, der nichts tut, tun). In ähnlicher Weise wird der Befehl XCHG rBX, rAX
zusammengebaut 0x93
(der Mux-Code des rBX
Seins 0b011
).
Die Opcode-Kodierung sollte an einer anderen Stelle im Handbuch aufgeführt sein. Sie können auch eine x86-Opcode-Karte betrachten (was hilft zu verstehen, wie alles zusammen gemuxt wird). Sie finden eines in den Intel 64- und IA-32-Architekturen-Entwicklerhandbüchern (Band 2, Anhang A.3).
Ich frage mich also, wie der Prozessor weiß, ob ein Byte hinterher zu arbeiten ist oder ob dieses zusätzliche Register vom Typ rAX sein muss, wodurch es tatsächlich immer noch das eine Byte 0x90 ist
Hier ist es das Gegenteil. Für den 64-Bit-Modus gibt es tatsächlich ein Präfix im Befehlswort selbst, um dies anzuzeigen ( REX
Präfix). Der Prozessor weiß aufgrund der An- oder Abwesenheit des REX
Präfixes, wonach er suchen muss - und in Ermangelung dessen ist der Befehl immer noch richtig 0x90
.