| Zeile 64: | Zeile 64: | ||
</asm> | </asm> | ||
| − | Diese Zeile regelt, dass all unsere Adressierungen richtig sind usw. Jetzt basteln wir einen Stack. Er sitzt | + | Diese Zeile regelt, dass all unsere Adressierungen richtig sind usw. Jetzt basteln wir einen Stack. Er sitzt im Segment 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). |
<br><br> | <br><br> | ||
Zum Schluss des Codes seht ihr noch folgende Zeilen: | Zum Schluss des Codes seht ihr noch folgende Zeilen: | ||
| Zeile 86: | Zeile 86: | ||
; ----------------------------------------- | ; ----------------------------------------- | ||
| + | jmp 0x0000:start | ||
start: | start: | ||
; Erst brauchen wir einen Stack. | ; Erst brauchen wir einen Stack. | ||
| Zeile 107: | Zeile 108: | ||
mov es, ax ; Segmentregister updaten | mov es, ax ; Segmentregister updaten | ||
mov ds, ax | mov ds, ax | ||
| − | + | jmp 0x1000:0x0000 | |
| − | |||
| − | |||
| − | |||
; ---------------------------------------------- | ; ---------------------------------------------- | ||
| Zeile 135: | Zeile 133: | ||
load: | load: | ||
; Diskdrive reset (Interrupt 13h, 0) | ; Diskdrive reset (Interrupt 13h, 0) | ||
| − | |||
mov ax, 0 ; Die gewünschte Funktion (reset) | mov ax, 0 ; Die gewünschte Funktion (reset) | ||
mov dl, [bootdrv] ; Dieses Laufwerk ist gewünscht | mov dl, [bootdrv] ; Dieses Laufwerk ist gewünscht | ||
int 13h ; Den Interrupt ausführen | int 13h ; Den Interrupt ausführen | ||
| − | |||
jc load ; Geht nicht? -> Noch mal! | jc load ; Geht nicht? -> Noch mal! | ||
| Zeile 209: | Zeile 205: | ||
ret | ret | ||
| − | ; Rebooten | + | ; Rebooten. |
reboot: | reboot: | ||
| − | + | jmp 0xffff:0x0000 | |
| − | |||
| − | |||
</asm> | </asm> | ||