also, wie als titel bereits geschrieben... mein kernel wird geladen, er zeigt einige textzeilen, anschliessend aber nur wirres zeug...
hier erst mal mein bereits etwas geänderter source:
boot.asm
; Bootloader Vers. 0.1.0
;
; Aufgaben:
; * Laden des Kernels und deren Start
; * Übergabe der Kontrolle des Computer an den Kernel
org 0x7C00 ; Startadresse des Bootloaders
jmp 0x0000:start ; Zu Startadresse springen
start:
cli ; Interups sind hier noch nicht erlaubt!
mov ax, 0x9000 ; Die Stackadresse auf 9000h Positionieren
mov ss, ax ; Den Stack an die Adresse 9000h anbinden
mov sp, 0 ; Den Stackpointer auf 0h Positionieren
sti ; Interups sind nun erlaubt!
; Nun suchen wir uns das Bootlaufwerk
mov [bootdrv], dl ; Der Name des Bootlaufwerks wird aus "DL" nach "[bootdrv] " verschoben
; Es wird zeit, den Kernel zu laden...
call load ; Wir rufen die Subroutine "load" auf. Diese läd für uns den Kernel
; Sobald der Kernel geladen ist, geht es hiernach weiter
mov ax, 0x1000 ; Unser Kernel ist an Adresse 1000h abgelegt worden.
; Diese Adresse muss natürlich gespeichert werden.
; Also verschieben wir die Startadresse in das Segement Register
mov es, ax ; Die Segement Register müssen aktualisiert werden
mov ds, ax
jmp 0x1000:0x0000 ; Der Kernel soll natürlich auch gestartet werden.
; Also springen wir zum Kernel
; Als nächstes einige Variablen, die die Arbeit erleichtern
bootdrv db 0 ; Wir sichern als erstes den Namen des startfähigen Laufwerks 0 nach "bootdrv"
loadmsg db "Lade den Kernel...",13,10,0 ; Wir hinterlegen eine Nachricht, damit der Benutzer sieht, das der Computer arbeitet...
; Damit der Benutzer sieht, das der Computer den Kernel läd, lassen wir dies auf dem Bildschirm ausgeben...
putstr:
lodsb ; Wir fangen einfach mal an, die Daten zu lesen
or al,al
jp short putstr ; Muss noch etwas gelesen werden, oder ist alles gelesen worden...?
; Wenn alles gelesen wurde, dann ENDE!
mov ah,0x0E ; Ruft die Funktion 0x0E des BIOS auf
mov bx,0x0007 ; Nicht notwendig, aber dennoch... Setzt das Atribut
int 0x10 ; Schreiben des Textes auf den Bildschirm
jmp putstr ; Solange noch etwas zu lesen ist, wird diese Subroutine neu gestartet und weiter gelesen
putstrd:
retn ; Fertig mit dem lesen? wenn ja, dann geht es hier zurück zur Hauptroutine
; Dies ist die Routine zum laden des Kernels...:
load:
mov ax, 0 ; Als erstes setzen wir das Bootlaufwerk zurück, um von ganz vorn lesen zu können
mov dl, [bootdrv] ; Wir verschieben den Namen des Bootlaufwerks in den Speicher
int 13h ; Anschliessend sagen wir dem BIOS, das es vom Diskettenlaufwerk lesen soll
jc load ; Ist dies nicht gelungen, soll es dies erneut versuchen.
; Wir springen dazu einfach noch mal an den Anfang dieser Routine
; War dies erfolgreich, geht es hier weiter...
load1:
mov ax,0x1000 ; Wir markieren den Speicherbereich 0x1000 als Ziel für unserem Kernel
mov es,ax ; Wir aktualisieren die Segement Register. Somit sind sie bereit für unserem Kernel
mov bx, 0
mov ah, 2 ; Nun wirds interissant... Wir sagen den BIOS, das es etwas von einem Datenträger lesen soll
mov al, 5 ; Gelesen werden sollen die ersten 5 Sektoren...
mov cx, 2 ; Und zwar ab Cylinder 0, Sector 2
mov dh, 0 ; Mit hilfe von Head 0
mov dl, [bootdrv] ; Als Quelle dient das erste Bootlaufwerk (meistens Diskette)
jc load1 ; Hat nicht geklappt? Dann noch mal von vorn...
; Wenn das Lesen erfolgreich war, gehts hier weiter...
mov si,loadmsg ; Als erstes holen wir uns die Bootmsg aus dieser Variable.
; Das ist die Nachricht, die der Benutzer auf dem Bildschirm sehen soll...
call putstr ; Dann geben wir diese mit Hilfe dieser Suroutine aus...
retn ; Dann schliessen wir das Laden des Kernels hier ab...
; Nun müssen wir den Bootloader nur noch die richtige Größe bringen.
; Um es kurz zu machen: Der Bootloader darf nur 512 Bytes groß sein.
; Also bringen wir unserem Bootloader in Form...
times 512-($-$$)-2 db 0
; Anschliessend markieren wir den Datenträger als Bootähig...
dw 0AA55h
; Das wars...
; Das ist unser Bootloader...
kernel.asm
; miniKernel Ver.s 0.1.0
;
; Aufgaben:
; * Kern des Betriebssystems
; * Das heist:
; + Stellt Grundlegende Funktionen und Routinen desBetriebssystems bereit
; + Verwaltet Grundlegende Funktionen der Datenträger,
; insbesondere das Lese,Schreiben und Ändern von Dateien und Daten
; + Verwaltet den Speicher, Threats etc..
;
; Kernel- Typ:
; * Monolitsch
; + Nur in der Start- bzw. Entwicklungsphase
; Später wir der Kernel Modular Struckturiert sein....
mov ax, 0x1000 ; Den Kernel an Adresse 1000h Positionieren
mov ds, ax ; Die Segement Register aktualisieren
mov es, ax
start:
; Anschliesend verwenden wir die Subroutine "putstrg", um Benutzer- Nachrichten auszugeben
mov si,msg ; Wir holen als erstes die Nachricht
call putstr ; Und diese geben wir nun aus...
mov si,msg_boot ; Wir holen uns eine weitere Nachricht...
call putstr ; Auch diese geben wir nun aus...
mov si, msg_boot2 ; Wir holen uns eine weitere Nachricht...
call putstr ; Auch diese geben wir nun aus..
call getkey ; Hier rufen wir nun eine Subroutine auf, die auf einem Tastendruck wartet...
jmp reboot ; Weiter gehts zu einer Subrouten, die den PC neustartet
; Wir speichern die Nachrichten, in den nachfolgenden Variablen...:
msg db "Willkommen beim minOS Version 0.1.0",13,10,0
msg_boot db "Kernel wurde erfolgreich geladen...",10,0
msg_boot2 db "Druecke eine Taste, um den Computer neu zu starten...",10,0
; Es wir Zeit, die Nachrichten auszugeben...:
putstr:
lodsb ; Beginne zu lesen
or al,al
jz short putstrd ; Muss noch etwas gelesen werden, oder ist alles gelesen worden...?
; Wenn alles gelesen wurde, dann ENDE!
mov ah,0x0E ; Ruft die Funktion 0x0E des BIOS auf
mov bx,0x0007 ; Nicht notwendig, aber dennoch... Setzt das Atribut
int 0x10 ; Schreiben des Textes auf den Bildschirm
jmp putstr ; Solange noch etwas zu lesen ist, wird diese Subroutine neu gestartet und weiter gelesen
putstrd:
retn ; Fertig mit dem lesen? wenn ja, dann geht es hier zurück zur Hauptroutine
; Diese Funktion starte den Computer, nach einem Tastendruck, neu
getkey:
mov ah, 0 ; Prozessor Funktion 0, oder anders gesagt, Neustart, ausführen
; Dieser Aufruf bereitet den Prozessor hierfür vor
int 0x16 ; Dieser Befehl löd den Reboot Befehl aus
ret
reboot:
jmp 0xffff:0x0000 ; Alle Befehle entfernen, sowie dem Prozessor neustarten
; Das wars....
; Das ist unserer Mini- Kernel...
entweder wird das laden der textzeilen nicht korrekt abgeschlossen, oder ich habe den aufruf der funktion zum neustarten falsch intergriert...
wo liegt hier der fehler...?
---
ps: sind meine, für mich intergrierten, kommentare korrekt? ich meine die erklärungen der anweisungen. damit will ich sicherstellen, das ich das tutorial richtig verstanden habe...
[edit]
ich füge mal noch hinzu, das ich unter windows xp mit nasm kompiliere und auch, als vergleich, den code aus dem magazin per c&p in notepad++ kopiert und nasm diesen dann assemblieren lassen habe. da tritt seltsamerweise das selbige problem auf...