Ok, ich habe mir also die AMD64-Handbücher durchgelesen und da ich wusste, dass es nop
sich wirklich um einen handelt xchg eax, eax
, habe ich mir die angesehen xchg
und etwas Interessantes gefunden, nämlich, dass anscheinend ein Byte in die Anweisung zum Angeben der Register codiert werden kann (entschuldigen Sie, ich bin auf meinem iPod):Bild.
Ich frage mich also, woher der Prozessor weiß, ob danach noch ein Byte zum Arbeiten kommt, oder ob das zusätzliche Register vom Typ sein muss, der rAX
bewirkt, dass es tatsächlich immer noch das eine Byte ist0x90
Antwort1
Ich habe mir die xchg angesehen und etwas Interessantes gefunden, nämlich, dass anscheinend ein Byte in die Anweisung zur Angabe der Register kodiert werden kann
Ja, so funktionieren die meisten x86-Befehle. Befehle werden entweder 32 oder 64 Bits auf einmal abgerufen (Wortlänge der Maschine), nicht Bytes auf einmal.
Die Angabe eines XCHG
von rAX
mit rAX
(wobei auf einem 32-Bit-Rechner und auf einem 64-Bit-Rechner rAX
ist ) ergibt , da der Register-Mux-Code für ist (tatsächlich eine Ein-Zyklus-Operation, die nichts tut). In ähnlicher Weise wird die Anweisung zu (dem Mux-Code von ist ) zusammengesetzt .EAX
RAX
0x90
rAX
0x00
XCHG rBX, rAX
0x93
rBX
0b011
Die Opcode-Kodierung sollte irgendwo anders im Handbuch aufgeführt sein, oder Sie können sich eine x86-Opcode-Map ansehen (die hilft zu verstehen, wie alles zusammen gemultiplext wird). Sie finden eine imSoftwareentwicklerhandbücher für die Intel 64- und IA-32-Architekturen(Band 2, Anhang A.3).
Ich frage mich also, woher der Prozessor weiß, ob danach noch ein Byte zum Arbeiten kommt, oder ob dieses zusätzliche Register vom Typ rAX sein muss, sodass es tatsächlich immer noch das eine Byte 0x90 ist.
Hier ist es umgekehrt. Für den 64-Bit-Modus gibt es tatsächlich einePräfixim Befehlswort selbst, um anzuzeigen, dass ( REX
Präfix) vorhanden ist. Der Prozessor weiß, wonach er suchen muss, basierend auf dem Vorhandensein oder Fehlen des REX
Präfixes – und wenn es nicht vorhanden ist, ist der Befehl immer noch nur 0x90
.