Mischen von 32 Bit und 16 Bit Code mit Nasm


5

Dies ist eine Low-Level-System Frage.

Ich muss 32-Bit- und 16-Bit-Code mischen, weil ich versuche, aus dem geschützten Modus in den Real-Modus zurückzukehren. Als ein paar Hintergrundinformationen macht mein Code das gerade nach GRUB-Booten, also habe ich kein lästiges Betriebssystem, um mir zu sagen, was ich kann und was nicht.

Wie auch immer, ich benutze [BITS 32] und [BITS 16] mit meiner Assembly, um festzustellen, welche Arten von Operationen es verwenden sollte, aber wenn ich meine Code-Verwendung bochs teste, sieht es für einige Operationen nicht aus Ausführen des Codes, den ich geschrieben habe. Es sieht so aus, als ob der Assembler in den Extras 0x66 und 0x67 steckt, was Bochs verwirrt.

Also, wie bekomme ich Nasm, um Code erfolgreich zu montieren, wo ich 32 Bit und 16 Bit Code in der gleichen Datei mischen? Gibt es eine Art Trick?

0

Sie machten keine Witze über diese Low-Level!

Haben Sie die generierten Opcodes/Operanden überprüft, um sicherzustellen, dass nasm Ihre BITS-Anweisungen korrekt befolgt? Überprüfen Sie auch, ob die Sprungziele korrekt sind - vielleicht verwendet nasm die falschen Offsets.

Wenn es kein Fehler in Nasm ist, gibt es vielleicht einen Bug in Bochs. Ich kann mir nicht vorstellen, dass Leute sehr oft wieder aus dem 32-Bit-Modus in den 16-Bit-Modus wechseln.


3

Die Werte 0x66 und 0x67 sind Opcodes, mit denen angegeben wird, dass der folgende Opcode als nicht standardmäßige Bitheit interpretiert werden sollte. Genauer gesagt (und gemäß this link),

"Wenn sich NASM im BITS 16-Modus befindet, wird bei Anweisungen, die 32-Bit-Daten verwenden, ein 0x66-Byte und bei 32-Bit-Adressen ein 0x67-Präfix verwendet. Im BITS 32-Modus ist das Gegenteil der Fall: 32-Bit-Befehle erfordern keine Präfixe, während Befehle, die 16-Bit-Daten verwenden, eine 0x66 benötigen und solche, die an 16-Bit-Adressen arbeiten, eine 0x67 benötigen. "

Dies deutet darauf hin, dass es Bochs Schuld ist.


0

Wenn Sie im Real-Modus arbeiten, ist Ihre Standardgröße implizit 16 Bit, daher sollten Sie den BITS 16-Modus verwenden. Wenn Sie eine 32-Bit-Operandengröße benötigen, fügen Sie das Präfix 0x66 hinzu, und für eine 32-Bit-Adressgröße fügen Sie das Präfix 0x67 hinzu.

Blick auf dem Intel IA-32 Handbuch zur Software-Entwickler, Band 3, Kapitel 16 (MIXING 16-Bit- und 32-Bit-Code, die Kapitelnummer kann nach der Ausgabe des Buchs aus):

Real-Adress-Modus, Virtual-8086-Modus und SMM sind native 16-Bit-Modi.

Die BITS 32 Richtlinie wird verwirren nur die Assembler, wenn Sie es außerhalb des geschützten Modus oder langen Modus verwenden.


6

Das Problem stellte sich heraus, dass ich meine Deskriptor-Tabellen nicht richtig eingerichtet habe. Ich hatte ein Bit falsch gedreht, anstatt in den 16-Bit-Modus zu wechseln, ging ich in den 32-Bit-Modus (mit Segmenten, die zufällig ein Limit von 1 Meg hatten).

Danke für die Vorschläge!

Terry

+1

Hinweis: Akzeptieren Sie Ihre eigene Antwort, wenn dies geschieht. 17 mär. 102010-03-17 21:13:07