mov ax, 0x1000 ; Die Adresse des Programms ;Ist der Kernel jetzt da?
Jep, denn in
load wird das als die Startadresse für den Kernel angegeben:
mov ax,0x1000 ; ES:BX = 10000
push ax ;Gerettet
mov ax, 0 ;jetzt ist 0
push ax ;Wiederhergestellt --> Was hat das jetzt gebracht?
retf
Es wird gar nichts wiederhergestellt, es wird nur einmal 0x1000 und dann 0 mit Hilfe des Registers
ax auf den Stack gepusht, weil
retf sowohl eine Segment- als auch eine Offsetadresse auf selbigem erwartet. Diese werden dann vom Stack genommen und dorthin gejumpt. Man "kehrt also zum Kernel zurück". Das mag etwas komisch klingeln, weil man da ja gar nicht herkam, aber solange die richtige Adresse auf dem Stack liegt ist das der CPU egal.
; Diskdrive reset (Interrupt 13h, 0) ;Wieso?
push ds ; Sichere DS ;Wieso?
...
pop ds ; DS wiederherstellen ;Siehe Kommentar über diesem
jc load ; Geht nicht? -> Noch mal! ;Wieso sollte es dann plötzlich klappen?
Zum ersten Wieso: sicher ist sicher, also lieber mal resetten, denn dann weiß man genau in welchem Zustand sich das Laufwerk befindet.
Zum zweiten und dritten: Da bin ich mir nicht sicher, ich nehme aber einfach mal an, dass
int 13 ds benötigt und man es deshalb woanders zwischenspeichern muss.
Zum dritten: Naja, vielleicht hatte das Laufwerk gerade wichtigeres zu tun und das BIOS konnte den Befehl deshalb nicht ausführen - dann muss man es einfach so lange weiter versuchen, bis das Laufwerk frei ist.
; Sektoren lesen (Interrupt 13h, 2) ;Was bringt das?
...
mov dx, 0 ; Head=0, Laufwerk=0 ;Wieso Laufwerk=0?
int 13h ; ES:BX = Daten vom Laufwerk ;???
jc load1 ; Fehler? Noch mal! ;Wieso sollte es dann plötzlich klappen?
...
Zum Was: Naja, wir wollen doch den Kernel laden. Der ist aber noch nicht im Speicher, sondern nur auf der Floppy. Von der können wir den Kernel aber nicht direkt ausführen, also müssen wir ihn vom Floppy in den Speicher hauen. Und da ein Sektor die kleinste Einheit auf einer solchen Diskette ist, die man ansprechen kann machen wir das eben sektorweise.
Wieso Laufwerk=0: naja, das ist normalerweise das erste. Da ich mir hier aber auch gerade nicht so sicher bin verweise ich einfach mal
hierauf.
Daten vom Laufwerk
: Nun, der Biosinterrupt liest ja brav Sektoren von der Diskette ein, aber irgendwo müssen die ja auch hin und das ist eben definitionsgemäß (so ist die Funktion halt aufgebaut) an dieser Stelle.
Wieso sollte es dann plötzlich klappen? siehe oben.
Da ich aber auch ein blutiger Anfänger in Sachen Systemprogrammierung bin und das meiste meines Wissens auch nur von dieser Seite hier habe empfehle ich dir zusätzlich eine zweite Meinung von jemandem, der sich auskennt einzuholen *g*[/code]