NASM: [BITS 32]
-
Hi!
Ich verwende als Assembler NASM. Ich möchte [BITS 32] verwenden. Wenn ich aber Interrupts aufrufen möchte, so muss ich Parameter in AL, AH usw laden. Wie muss so ein Code aussehen, um zu funktionieren?lg,phreaking
-
In 32Bit-Anwendungen kannst Du genauso auf 8 oder 16Bit-Register zugreifen, wie in 16Bit-Anwendungen.
Der Hauptunterschied im Code ist folgender:
[BITS 16]
;Mnemonics und die dazugehoerigen Opcodes:
mov ax,1234h ;B8 34 12
mov eax,12345678h ;66 B8 78 56 34 12[BITS 32]
mov ax,1234h ;66 B8 34 12
mov eax,12345678h ;B8 78 56 32 12In 16Bit-Progs wird das 66-Prefix fuer 32Bit Opcodes gebraucht und in 32Bit-Progs steht es vor 16Bit-Opcodes.
-
Hmm.. jetzt wird mir das Ganze klar (ich habe mir die Sache etwas genauer angesehen). Aber mein Problem liegt woanders!
Mein Programm wird als Binary kompiliert. Wenn ich es zB als .COM oder als Bootstrap-Loader ausführe (es geht nur um das Prinzip... ), führt der PC die Instructions als 16-Bit aus. Daher werden die Informationen natürlich falsch interpretiert...
Wie kann ich dem PC also "beibringen", die Instructions als 32-Bit auszuführen?lg, phreaking
-
Zuerst einmal musst Du natuerlich in den Protected Mode wechseln, falls das Prog noch im RM ist.
Dann musst Du einen Descriptor fuer ein 32Bit Code-Segment erstellen, der auf deinen 32Bit code zeigt und in dieses Segment springen (wenn sich der 32Bit code im selben Segment befindet, wie der 16Bit-Teil, kannst Du auch den aktuellen cs-descriptor klonen und dann nur das 32Bit-Flag setzen).
Dann wird der Code in diesem Segment auch als 32Bit code ausgefuehrt.
Wenn in diesem 32Bit segment 16Bit code liegt, wird dieser dann aber falsch interpretiert... Um wieder 16Bit code ausfuehren zu koennen musst Du dann wieder in ein 16Bit Segment springen (CS auf den Selector dieses Segments setzen).Schau dir dazu mal in der FAQ "Speicher Addressierung RM/PM" an, dort wird der Aufbau der Descriptors etc. genauer erklaehrt.
Nochmal ein sehr vereinfachtes Beispiel:
;Prog laeuft im PM im 16Bit Modus... ;in ax steht der Descriptor zum aktuellen geklonten cs mit 32BitFlag gesetzt... push cs push ax pop cs ;jetzt kann hier 32Bit Code kommen... pop cs ;und nun wieder 16Bit code
[ Dieser Beitrag wurde am 17.08.2002 um 21:50 Uhr von Nobuo T editiert. ]
-
Danke, du hast mir wirklich sehr geholfen!
lg, phreaking