Kann jemand erklären, diese direkt montiert x86 JMP-opcode?

In der Schule haben wir ein bootstrap-Programm zum ausführen von stand-alone-Programme, die ohne Betriebssystem. Ich studiere seit diesem Programm und wenn der geschützte Modus aktiviert ist, gibt es eine weit springen, ausgeführt durch die direkte Montage der opcode und die Operanden als Daten innerhalb des Programms. Dies war für den GNU-assembler:


         /* this code immediately follows the setting of the PE flag in CR0 */

.byte   0x66, 0xEA
.long   TARGET_ADDRESS
.word   0x0010          /* descriptor #2, GDT, RPL=0 */

Zunächst, warum würde man wollen, dies zu tun (anstelle der Anweisung Mnemonik)?

Bin ich auf der Suche auf der Intel-Handbücher, aber bin immer noch ein wenig verwirrt durch den code. Speziell in Band 2A, Seite 3-549, gibt es eine Tabelle der opcodes. Der relevante Eintrag:

EA *cp* JMP ptr16:32 WR. Gültige Springen weit, absolute Adresse im 
operand 

Den eigentlichen opcode, ist klar, aber das das erste byte, 0x66, hat mich verwirrt. Unter Bezugnahme auf die Tabelle im Intel-Handbuch, der cp scheint zu bedeuten, dass ein 6-byte-operand Folgen. Und natürlich 6 bytes Folgen in den nächsten beiden Zeilen. 0x66 kodiert für ein 'Operand-size override-Präfix'. Was hat das zu tun mit der cp in der Tabelle? Ich hatte erwartet, es werden einige hex-Wert für die cp, sondern es ist dieser override-Präfix. Kann jemand bitte deaktivieren Sie dieses, für mich?

Hier ist ein dump von od:

c022 **ea66 0000 0001 0010** ba52 03f2 c030 

TARGET_ADDRESS wurde definiert als 0x00010000.

Ich bin auch verwirrt ein wenig durch die Bedeutung der in den letzten zwei bytes. Aber dass scheint zu sein, ein anderes überhaupt nicht in Frage. Es ist schon ziemlich spät, und ich habe gestarrt, auf code-und die Intel-Handbücher für Stunden, so ich hoffe ich habe meinen Standpunkt zu vermitteln.

Dank für das schauen!

  • Menschen nutzen opcodes (statt Anweisungen) aus 2 Gründen. Der erste Grund ist, wenn der assembler ist "weniger als ausreichend" und bietet keine Unterstützung für die Anleitung, die Sie benötigen (das ist/war üblich, wenn neue Anweisungen Hinzugefügt und ältere Monteure nicht unterstützen, Sie noch). Der zweite Grund ist, wenn der assembler unterstützt die Anweisung, die Sie benötigen, aber die Programmierer nicht wissen, wie Sie zu überzeugen, die assembler zu generieren. Im Grunde, ist es entweder schlechte tools (darunter auch alte Werkzeuge, verwirrende syntax und/oder schlechte Dokumentation) oder schlechte Programmierer.
  • Hinweis: Mein Kommentar oben ist "im Allgemeinen" und gilt für alle Monteure. Ich nicht mit GAS, und habe keine Ahnung, ob es unterstützt die "32-bit-far-jump in 16-bit-code" - Befehl ist oder nicht (oder wie gut/schlecht die Dokumentation ist).
Schreibe einen Kommentar