Hallo!
Ich hab mich jetzt auch hier registriert, da ich mich ernsthaft mit der Entwicklung eines OS beschäftigen will.
Tutorials hab ich schon ein paar durchgearbeitet und verstehe in etwa die grundlegenden Dinge, die für die Programmierung eines Bootloaders erforderlich sind.
Also der grundsätzliche Ablauf in meinem Fall:
Stage1: (Bootsektor)
Stage2:
Während Stage1 abgearbeitet wird erscheint keine Meldung auf dem Schirm - ab Stage2 arbeitet die Ausgabefunktion / der Stack korrekt so wie es sein soll.
*edit:
Tools: NASM und Bochs 2.4.6
Auch in Boch 2.4.5 war das Problem bereits sowie auf einem alten P4-System mit Floppy-Laufwerk.
Der Stage1-Loader:
Die Ausgabefunktion wird von Stage1 und Stage2 verwendet:
aus Stage2:
Anmerkung: Ich verwende die Endung *.asi für "ASsembler Include".
"bpb.asi" enthält den BIOS-Parameter-Block
Ich hab schon unzählige Versuche unternommen, das Stacksegment und den -Pointer anders zu initialisieren, doch es bleibt immer wieder der selbe "Fehler".
Es scheint so, als ob in BX durch
==> Nur der Text booting stage2... (in Weiß) wird ausgegeben
Hat von euch jemand einen Lösungsvorschlag für das Problem?
Greets
Ich hab mich jetzt auch hier registriert, da ich mich ernsthaft mit der Entwicklung eines OS beschäftigen will.
Tutorials hab ich schon ein paar durchgearbeitet und verstehe in etwa die grundlegenden Dinge, die für die Programmierung eines Bootloaders erforderlich sind.
Also der grundsätzliche Ablauf in meinem Fall:
Stage1: (Bootsektor)
- ok: Stack einrichten
- fail: verschiedene Meldungen ausgeben
- ok: Stage2 von Floppy laden (liegt roh im 2. Sektor, ist noch nicht größer als 512 Bytes)
- ok: zu Stage2 springen
Stage2:
- versch. Meldungen ausgeben
- in den Protected Mode schalten (kommt erst später)
Während Stage1 abgearbeitet wird erscheint keine Meldung auf dem Schirm - ab Stage2 arbeitet die Ausgabefunktion / der Stack korrekt so wie es sein soll.

*edit:
Tools: NASM und Bochs 2.4.6
Auch in Boch 2.4.5 war das Problem bereits sowie auf einem alten P4-System mit Floppy-Laufwerk.
Der Stage1-Loader:
Code: [Auswählen]
[BITS 16]
ORG 07C0h
JMP stage1.start
%include "bpb.asi"
%include "io.asi"
stage1:
;Festlegen des Stacks und Initialisierung der Register
.start:
MOV AX, 07C0h
ADD AX, 544
CLI
MOV SS, AX
MOV SP, 0x1000
MOV BP, SP
STI
XOR AX, AX
MOV DS, AX
MOV ES, AX
MOV [boot_drv], DL
.main:
CALL setVideomode
f_print boot_msg, 0x0007
f_print fd_reset, 0x0009
.reset:
MOV AH, 00h
MOV DL, [boot_drv]
INT 13h
JC .reset
f_print boot_ok, 0x000A
f_print fd_read, 0x0009
.read:
MOV AX, 0x100
MOV ES, AX
XOR BX, BX
MOV AH, 02h
MOV AL, 1
MOV CH, 0
MOV CL, 2
MOV DH, 0
MOV DL, [boot_drv]
INT 0x13
CMP AL, 0
JC .read
.end:
f_print boot_ok, 0x000A
JMP 0x100:0
boot_drv DB 0
boot_msg DB "booting stage1...",13,10,0
boot_ok DB "OK",13,10,0
boot_ko DB "FAIL",13,10,0
fd_reset DB 9,"Drive reset:",9,0
fd_read DB 9,"Drive read: ",9,0
TIMES 510-($-$$) DB 0
DB 0x55
DB 0xAADie Ausgabefunktion wird von Stage1 und Stage2 verwendet:
Code: [Auswählen]
%macro f_print 2
PUSH word %2 ;color
MOV SI, %1 ;string
CALL print
ADD SP, 2
%endmacro
print:
PUSH BP ; -> alten BASE-POINTER sichern
MOV BP, SP ; -> BASE-POINTER auf den aktuellen STACK-POINTER setzen
MOV AH, 0Eh
.next:
LODSB
OR AL, AL
JZ .end
MOV BX, [SS:BP+4] ; Zugriff auf 1. Parameter
INT 10h
JMP .next
.end:
MOV SP, BP ; <- alten STACK-POINTER wiederherstellen (siehe oben: BP = alter SP)
POP BP ; <- alten BASE-POINTER wiederherstellen
RETaus Stage2:
Code: [Auswählen]
[BITS 16]
ORG 0x1000
JMP stage2.start
%include "io.asi"
%include "gdt.asi"
stage2:
.start:
f_print boots2_msg, 0x000F
CLI
HLTAnmerkung: Ich verwende die Endung *.asi für "ASsembler Include".

"bpb.asi" enthält den BIOS-Parameter-Block
Ich hab schon unzählige Versuche unternommen, das Stacksegment und den -Pointer anders zu initialisieren, doch es bleibt immer wieder der selbe "Fehler".
Es scheint so, als ob in BX durch
Code: [Auswählen]
MOV BX, [SS:BP+4] nichts reingeschrieben werden kann bzw. aus irgendeinem Grund der Wert im Register immer 0x0 ist / wird / bleibt.==> Nur der Text booting stage2... (in Weiß) wird ausgegeben
Hat von euch jemand einen Lösungsvorschlag für das Problem?
Greets

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert

