Hallo,
ich möchte mehrmals zwischen Real und Protected Mode hin und her schalten. Jedoch scheint etwas beim Ausschalten des PModes nicht ganz zu funktionieren, denn sobald ich mich wieder im Real Mode befinden müßte kann ich zum einen nicht mehr in den Protected Mode zurückschalten und zum anderen funktioniert der DOS interrupt (0x21) nicht mehr.
Mein verwendeter Code sieht so aus:
asm{
// Den PM ausschalten:
mov eax,cr0
and eax,0xFFFFFFFE
mov cr0,eax
// Far-Jmp zum Selektor:Offset
fjmp rm_cs,ende
ende:
mov dx,rm_ds
mov ds,dx
mov ss,dx
mov es,dx
mov fs,dx
mov gs,dx
}
IDTDescr.size=0x3FF;
IDTDescr.base=0;
asm{
lidt byte ptr [IDTDescr]
sti
}
Also, ich schalte den PMode im cr0 Register aus, mache einen Far-Jump, setze alle Segmente wieder auf den ursprünglichen Wert und lade wieder die Original IDT. Über die Syntax muss man sich an dieser Stelle nicht wundern, da es mein eigener Compiler ist...
Habe ich da noch was vergessen, was noch gemacht werden muss, oder ist das alles soweit richtig und ich muss den Fehler an einer anderen Stelle suchen?
Ich sollte eventuell noch erwähnen, dass nach dem Ausführen dieses Codes ich Interrupts wie 0x10 für die Ausgabe wieder benutzen kann, ohne Probleme.
MM