| Zeile 60: | Zeile 60: | ||
Zuerst einmal sucht das BIOS auf dem ersten Sektor von Diskette und Festplatte nach einer Binärdatei, die genau 512 Bytes (1 Sector) lang ist und am Ende das Wort 0x0AA55 enthält. Jetzt lädt das BIOS unseren Bootloader, wenn es ihn denn gefunden hat, an die Adresse 0x7C00. Damit alles so läuft, wie wir es uns gedacht haben, enthält die erste Zeile unseres Assemblercodes also den Code: | Zuerst einmal sucht das BIOS auf dem ersten Sektor von Diskette und Festplatte nach einer Binärdatei, die genau 512 Bytes (1 Sector) lang ist und am Ende das Wort 0x0AA55 enthält. Jetzt lädt das BIOS unseren Bootloader, wenn es ihn denn gefunden hat, an die Adresse 0x7C00. Damit alles so läuft, wie wir es uns gedacht haben, enthält die erste Zeile unseres Assemblercodes also den Code: | ||
| + | <asm> | ||
ORG 0x7C00 | ORG 0x7C00 | ||
| + | </asm> | ||
Diese Zeile regelt, dass all unsere Adressierungen richtig sind usw. Jetzt basteln wir einen Stack. Er sitzt an Adresse 0x9000. Den Stackpointer setzen wir auf null. Während wir das alles tun, sind übrigens keine Interrupts zugelassen. Nun schreiben wir die Information über das Bootlaufwerk aus DL in eine Variable, rufen die Funktion "load" auf und springen zum geladenen Programm, unserem Kernel rüber (das seht ihr im vollständigen Code weiter unten). | Diese Zeile regelt, dass all unsere Adressierungen richtig sind usw. Jetzt basteln wir einen Stack. Er sitzt an Adresse 0x9000. Den Stackpointer setzen wir auf null. Während wir das alles tun, sind übrigens keine Interrupts zugelassen. Nun schreiben wir die Information über das Bootlaufwerk aus DL in eine Variable, rufen die Funktion "load" auf und springen zum geladenen Programm, unserem Kernel rüber (das seht ihr im vollständigen Code weiter unten). | ||
| Zeile 66: | Zeile 68: | ||
Zum Schluss des Codes seht ihr noch folgende Zeilen: | Zum Schluss des Codes seht ihr noch folgende Zeilen: | ||
| + | <asm> | ||
times 512-($-$$)-2 db 0 | times 512-($-$$)-2 db 0 | ||
dw 0x0AA55 | dw 0x0AA55 | ||
| + | </asm> | ||
Sie sind für die Länge von 512 Bytes und das Wort 0x0AA55 am Ende zuständig. | Sie sind für die Länge von 512 Bytes und das Wort 0x0AA55 am Ende zuständig. | ||
| Zeile 75: | Zeile 79: | ||
Der Code am Stück | Der Code am Stück | ||
| + | <asm> | ||
org 0x7C00 ; Unsere Startadresse | org 0x7C00 ; Unsere Startadresse | ||
| Zeile 155: | Zeile 160: | ||
times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes | times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes | ||
dw 0AA55h ; Bootsignatur | dw 0AA55h ; Bootsignatur | ||
| + | </asm> | ||
Ein kleiner Kernel zum Testen...<br> | Ein kleiner Kernel zum Testen...<br> | ||
Nun kneten wir uns einen kleinen Kernel, damit unser Bootloader auch was zu laden hat. | Nun kneten wir uns einen kleinen Kernel, damit unser Bootloader auch was zu laden hat. | ||
| + | <asm> | ||
; --------------------------------------------------- | ; --------------------------------------------------- | ||
; Unser Kernel | ; Unser Kernel | ||
| Zeile 207: | Zeile 214: | ||
dw 0000h | dw 0000h | ||
dw 0FFFFh | dw 0FFFFh | ||
| + | </asm> | ||
Kompilieren und Testen<br> | Kompilieren und Testen<br> | ||
| Zeile 498: | Zeile 506: | ||
=== CPU >= 386 === | === CPU >= 386 === | ||
| + | <asm> | ||
; determine CPU type. Code from Freedows 98 ldr_asm.asm | ; determine CPU type. Code from Freedows 98 ldr_asm.asm | ||
; Copyright (C) 1997 Joachim Breitsprecher | ; Copyright (C) 1997 Joachim Breitsprecher | ||
| Zeile 524: | Zeile 533: | ||
not_386: | not_386: | ||
| + | </asm> | ||
== OS-Showcase: MenuetOS == | == OS-Showcase: MenuetOS == | ||