Bootloader geht nicht
-
Hi,
hab mir mal einen kleinen Bootloader geschrieben, um etwas mehr Erfahrung zu sammeln, aber er funktioniert nicht.
In Bochs zeigt er immer a b c an und dann gehts net weiter[BITS 16] [ORG 0x7C00] jmp start ; Daten und Funktion überpringen ; *** Variablen *** bootlaufwerk db 0 ; *** Meldungen *** msginfo db 'a', 13, 10, 0 msgcpuerkennungstart db 'b', 13, 10, 0 msgcpu386ok db 'c', 13, 10, 0 msgcpu386fehler db 'd', 13, 10, 0 msgneustart db 'e', 13, 10, 0 msginitkernel db 'f', 13, 10, 0 cpuerkennung: mov si, msgcpuerkennungstart ; Meldung anzeigen call zeigetext pushf ; Probe auf 8088/8086 (Bits 12-15 gesetzt) xor ah, ah ; = if (ah == 0) push ax popf pushf pop ax and ah, 0F0h cmp ah, 0F0h je cpu386fehler ; Kein 386 verfuegbar! mov ah, 0F0h ; Probe auf 286 (Bits 12-15 leer) push ax popf pushf pop ax and ah, 0F0h jz cpu386fehler ; Kein 386 verfuegbar! ; Wenn wir hier ankommen, haben wir einen 386 oder besser zur Verfuegung mov si, msgcpu386ok ; OK-Meldung anzeigen call zeigetext ret ; Aus Funktion zurueckspringen cpu386fehler: mov si, msgcpu386fehler call zeigetext jmp neustart zeigetext: ; Zeigt Text auf dem Bildschirm an lodsb ; Einen Buchstabe ins al Register laden or al, al ; Wenn Buchstabe 0 ist, ... jz zeigetextfertig ; ... sind wir fertig! mov ah, 0Eh ; Der Buchstabe mov bx, 0007 ; Farbe weiss int 0x10 ; Text mit BIOS-Interupt schreiben jmp zeigetext ; Und naechster Buchstabe! zeigetextfertig: ret ; Aus Funktion zurueckspringen warteauftaste: ; Wartet auf Tastendruck mov ah, 0 ; Attribut setzen int 0x16 ; Interupt aufrufen ret ; Aus Funktion zurueckspringen neustart: ; Zeigt eine Meldung und startet nach Tastendruck den PC neu mov si, msgneustart ; Meldung laden call zeigetext ; Meldung zeigen call warteauftaste ; Auf Tastendruck warten db 0EAh ; Restart wird ... dw 0000h ; ... hier eingestellt ... dw 0FFFFh ; ... und ausgeführt! ; *** Einsprungpunkt *** start: mov [bootlaufwerk], dl ; Unser Bootlaufwerk speichern cli ; Interupts abschalten mov ax, 0x9000 ; Ort fuer den Stack mov ss, ax mov sp, 0xFFFF sti ; Interupts wieder anschalten mov si, msginfo call zeigetext call cpuerkennung .386 mov si, msginitkernel call zeigetext hlt ; Prozessor abschalten! TIMES 510-($-$$) DB 0 SIGNATURE DW 0xAA55
ChrisM
-
Hi.
Soweit ich das sehe, returst Du aus der CPU-Erkennungs proc ins Nirvana.
Das pushf vom Anfang der Proc wird vor dem ret nicht vom stack geholt.
-
Danke, was ein popf so ausmachen kann...
ChrisM
-
ja ja, beim Poppen *g* sollte man eigentlich immer aufpassen (...)
-
Löl
ChrisM
PS: Woran kann das liegen, wenn in Bochs beim Emulieren bestimmte Zeichen in Strings falsch dargestellt werden? Also z.B. andere ASCII-Zeichen, z.B. das Smilie-Zeichen, dargestellt werden? Printfunktion ist richtig und Text stimmt auch in der Executable! (mit Hexeditor nachgeschaut)