Irgendwie der falsche effekt beim umschalten zu pm
-
Ich hab hier ein kleines Programm (wirklich ganz klein), dass mein Bootloader zu (realmod) 0x800:0x00 kopiert und startet. Es soll eigendlich den Protected Mode einstellen und dann garnix machen. Es richtet eine GDT mit einem Eintrag ein (nämlich 0x800:0x000 bzw. 0x8000). Das dumme ist nur, dass proggi schaltet nicht in den pm sondern startet den Rechner neu (is ja auch ganz nett aber nicht erwünscht ;)) Ich assemble das ganze mit nasm falls das irgendwen interessiert
jmp start ;global descriptor table gdt dw 0, 0, 0, 0; kernel code selector dw 0xffff ; segment limit (4 gb total) dw 8000 ; base address (bits 0-15) db 0 ; base address (bits (16-24) db 10011000b ; dpl 0, code (execute only) db 11001111b ; granlurarity (4k), 32-bit, limit high nibble = f db 0 ; base address (bits 24-32) gdtptr dw 0x7ff ; limit (256 slots) dd 0x800 ; base (physical address) start: mov ax , 0x800 mov ds , ax mov ax, 0 mov es, ax mov di, 0x800 ; destination mov si, gdt ; source mov cx, 24 ; length cld ; forward direction rep movsb ; move gtd to its new location cli ;disable interrupts (we don't have an IDT) lgdt [gdtptr] mov eax, cr0 or al, 1 ; set protected mode bit mov cr0, eax db 0eah dw pmode dw 8 pmode: jmp pmode
-
Klingt nach nem Triple-Fault. Jag das ganze dochmal durch Bochs, das gitb einem immer schön die Ursache dafür aus.
-
mal sehen, ob ich richtig liege
:
Auffaelligkeiten:
1.[asm] gdt dw 0, 0, 0, 0; kernel code selector
dw 0xffff ; segment limit (4 gb total)
dw 8000 ; base address (bits 0-15)[/asm]
Sollte diese Zahl nicht besser als hex angegeben werden?db 11001111b ; granlurarity (4k), 32-bit, limit high nibble = f
Hier setzt du das bit fuer 32bit-code, sagst NASM aber nicht, dass es auch 32Bit-Code generieren soll. Da geht der Sprung zum Programmende natuerlich irgendwo in die Botanik.
-
oh sch****. Ich habs nochmal getestet. Es lag an der Hex-Zahl die keine wahr
Da bin ich noch garnich drauf gekommen. Wie kann man mit nasm eigendlich 32 bit code herstellen? Ich dachte das geht garnich. Oder lieg ich da falsch?
-
Ich bin mir nicht sicher, aber geht das nicht mit [bits 32] o.ä.?
[bits 32] ; Das hier ist 32-Bit-Code
Bei nasm ist eine große Doku dabei, in der das beschrieben ist.
-
Ja aber eigendlich will ich mit nasm meine proggis assembeln und nicht den helpfile durchlesen
der is reichlich lang. Aber ich hab mal nachgesucht. [bits 32] is korrekt