Die NOP-Bytes verstehen

Die NOP-Bytes verstehen

Ok, ich habe mir also die AMD64-Handbücher durchgelesen und da ich wusste, dass es nopsich wirklich um einen handelt xchg eax, eax, habe ich mir die angesehen xchgund 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 rAXbewirkt, 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 XCHGvon rAXmit rAX(wobei auf einem 32-Bit-Rechner und auf einem 64-Bit-Rechner rAXist ) 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 .EAXRAX0x90rAX0x00XCHG rBX, rAX0x93rBX0b011

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 ( REXPräfix) vorhanden ist. Der Prozessor weiß, wonach er suchen muss, basierend auf dem Vorhandensein oder Fehlen des REXPräfixes – und wenn es nicht vorhanden ist, ist der Befehl immer noch nur 0x90.

verwandte Informationen