Wie steuert man eigentlich wo der Kernel am Ende im RAM landet. im Magazin tutorial steht iwo jmp 0x1000. Woher weiß man, dass der Kernel auch dort im RAM gelandet ist?! (Bootloader aus Magazin ausgabe 1).
mfg Sebi
mfg Sebi
09. November 2026, 18:29
org 0x7C00 ; Unsere Startadresse
; -----------------------------------------
; Unser Bootloader
; -----------------------------------------
jmp 0x0000:start
start:
; Erst brauchen wir einen Stack.
cli ; Keine Interrupts!
mov ax, 0x9000 ; Stackadresse
mov ss, ax ; SS = 0x9000 (unser Stack)
mov sp, 0 ; SP = 0x0000 (der Stackpointer)
sti ; Interrupts zulassen
; Segmentregister initialisieren (für Zugriff auf bootdrv notwendig)
mov ax, 0x0000
mov es, ax
mov ds, ax
; BIS HIER VERSTEH ICH ALLES
; Bootlaufwerk aus DL speichern
mov [bootdrv], dl ; WARUM [bootdrv] und nicht bootdrv?
;warum von dl?
; von bios vorbelegt?
;Lade unseren Kernel
call load
;Springe zu diesem Kernel
mov ax, 0x1000 ; Die Adresse des Programms
mov es, ax ; Segmentregister updaten
mov ds, ax
jmp 0x1000:0x0000
; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------
bootdrv db 0 ;Das Bootlaufwerk
loadmsg db "Laden...",13,10,0
; Einen String ausgeben:
putstr:
lodsb ; Byte laden
or al,al
jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E ; Funktion 0x0E
mov bx,0x0007 ; Attribut-Byte (wird nicht benötigt)
int 0x10 ; schreiben
jmp putstr ; Nächstes Byte
putstrd:
retn
; Lade den Kernel vom Bootlaufwerk
load:
; Diskdrive reset (Interrupt 13h, 0)
mov ax, 0 ; Die gewünschte Funktion (reset)
mov dl, [bootdrv] ; Dieses Laufwerk ist gewünscht
int 13h ; Den Interrupt ausführen
jc load ; Geht nicht? -> Noch mal!
load1:
mov ax,0x1000 ; ES:BX = 0x10000
mov es,ax
mov bx, 0 ; IST DIES FÜR DEN BIOS INTERUPT, dass die
;gelesenen daten nach 0x1000 geschrieben werden?
; Sektoren lesen (Interrupt 13h, 2)
mov ah, 2 ; Funktion 2 (Lesen)
mov al, 5 ; Lese 5 Sektoren
mov cx, 2 ; Cylinder=0, Sector=2
mov dh, 0 ; Head=0
mov dl, [bootdrv] ; Laufwerk aus Vorgabe
int 13h ; ES:BX = Daten vom Laufwerk
jc load1 ; Fehler? Noch mal!
mov si,loadmsg
call putstr ; Meldung ausgeben
retn
times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes
dw 0AA55h ; Bootsignatur
mov ax, 0x1000
- Nein, die Addresse, nach welcher der Kernel geladen werden soll, wir in ax kopiert:Nicht, dass ich wüsste, welche Parameter die BIOS-Funktion erwartet, aber ax ist die Adresse nicht. Das wird nämlich weiter unten durch 0x205 überschrieben. Die Kommentare im Code sagen, es wird nach es:bx gelesen, und wenn sie nicht lügen wird der Kernel nach 0x1000:0x0 geladen, also linear 0x10000 (eine Null mehr!)Code: [Auswählen]mov ax, 0x1000
Der Kernel landet somit an Addresse 0x1000
mov [bootdrv],dl
bedeuten, dass dl nach bootdrv kopiert wird und nicht anderum.mov ziel, quelle
ich versteh nur nicht was die eckigen klammern solln. soweit ich weiß zeigen die eckigen klammern an, dass der inhalt und nicht die adresse gemeint ist, oder?mov es, ax
Nur ich versteh nicht warum 0x1000:0x0 = 0x10000. Ich dachte die lineare Adresse setzt sich im Real Mode aus Segementadresse und Offset Adresse (Also Segment + Offset = lineare Adresse) zusammen. Wenn ich jetzt die Segmentadresse 0x1000 habe und nen Offset von 0x0 müsste sich doch eigentlich nichts daran änder, man müsste doch weiterhin bei 0x1000. Irgendwie irretiert mich das.ich versteh nur nicht was die eckigen klammern solln. soweit ich weiß zeigen die eckigen klammern an, dass der inhalt und nicht die adresse gemeint ist, oder?Eben drum. bootdrv selbst ist die Adresse des Labels. In eine konstante Zahl kann man schlecht was reinkopieren.
Ich denk das 0x1000 nach ax kopiert wird ist nur, um dann von ax nach es zu kopieren.Ja, weil man Immediatewerte nicht direkt in Segmentregister moven kann.
Nur ich versteh nicht warum 0x1000:0x0 = 0x10000. Ich dachte die lineare Adresse setzt sich im Real Mode aus Segementadresse und Offset Adresse (Also Segment + Offset = lineare Adresse) zusammenSegment * 16 + Offset. Sonst wärst du ja auch mit Segmentierung immer noch auf die 64k Adressraum beschränkt. Es sind aber 16 * 64k = 1M.
ah okay, da weiß ich jetzt bescheid. Ich weiß nur nicht, ob die adresse in es:bx jetzt für das bios da reingeschrieben werden oder nciht?! Bin leider noch unwissend.Ja es:bx ist die Zieladresse die das Bios zum ablegen der Daten nutzen soll. Zu den oft genutzten Interrupts findet man eigentlich ganz gut Übersichten, z.B. http://de.wikibooks.org/wiki/Interrupts_80x86/_INT_13#Funktion_2h:_Sektoren_lesen