Frage zu Register in x86 Prozessoren

OP #3579790
Lesenswert?

Ich lese gerade ein Tutorial über die OS entwicklung.
http://www.henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId786364

Da wird in der ersten Zeile des Kernels (zu Anfang nur ein Hello World 
Kernel) in das Register AX der Wert 0x07C0 geladen. Diesen Schritt 
verstehe ich noch. Dann aber wird der Wert von AX in DS und ES geladen. 
Als Kommentar steht "set up segments". Wofür muss ich diesen Wert in DS 
und ES laden? Wozu sind diese Register da?

Ersten 3 Zeilen Code aus dem Tutorial:

mov ax, 0x07C0  ; set up segments
mov ds, ax
mov es, ax
#3579858
Lesenswert?

Wenn du auf eine Speicheradresse zugreifst, dann wird die physikalische 
Adresse aus Segment und Adresse berechnet. Das Segment wird um 4 Bits 
nach links geshiftet und die Adresse hinzuaddiert.

Du kannst es dir auch so vorstellen, dass der Arbeitsspeicher aus 
Segmenten besteht, wovon jedes 16 Byte groß ist.
Segment 0x0000 - 16 Byte
Segment 0x0001 - 16 Byte
usw.

Jetzt können sich die Bereiche aber überlappen, da du ja auch 16 Bit 
Adressen hast. Segment 0x0000 mit Adresse 0x0010 zeigt auf den selben 
Speicherbereich wie Segment 0x0001 mit Adresse 0x0000.

Und etwas Hintergrundwissen:
Das BIOS lädt den Bootsector oder den MBR an die Adresse 0x7C00. Wenn in 
deinem Assemblercode des BS oder MBR Variablen sind, z.B. das 5. Byte, 
dann müsstest du immer die Adresse 0x7C00 mit verrechnen - 5. Byte wird 
zu Adresse 0x7C05. Setzt du dagegen das Segmentregister auf 0x07C0, dann 
kannst du das 5. Byte auch mit Adresse 5 adressieren.

DS ist das Segmentregister für Datenzugriffe (Read/Write), CS für 
Codezugriffe(Wird also mit dem IP verrechnet) und ES für Extrzugriffe 
(Benötigt bei z.B. CMPS).
OP #3579964
Lesenswert?

Noch eine Frage:
Im nächsten Schritt soll eine Trennung zwischen Bootloader und Kernel 
stattfinden. Dazu muss ja die Startadresse des Kernels verändert werden. 
Im ersten Teil des Tutorials war sie ja 0x07C0. Jedoch soll sie jetzt 
auf 0x7C00 gesetzt werden. Mach man das nur, um den Bootloader mehr 
Platz zu geben?
#3580013
Lesenswert?

Für den Prozessor nicht.

Bei .EXE-Dateien ist im Header auch eine Einsprungadresse in das 
Programm angegeben. DOS lädt die Datei also ins RAM und springt dann an 
diese Adresse. .COM-Dateien haben das nicht, die werden ins RAM geladen 
und immer bei CS:0100 angesprungen. CS ist immer variabel, da das 
Programm keinen Einfluß darauf hat, an welche Stelle im RAM es geladen 
wird.

Die x86-Prozessoren können nur bestimmte (nicht-Segment) Register zur 
Adressierung nutzen. Beispielsweise DS:SI, ES:DI, CS:IP, SS:SP.
Was nicht geht ist z.B. DS:AX, CS:CX oder AX:BX.
#3580023
Lesenswert?

>mov [bootdrive], dl
hier schreibst du den Inhalt von Register dl an die Speicheradresse 
bootdrive. Die [] ist die Intel Syntax, dass das, was dazwischen steht, 
als Adresse aufgefasst werden soll.

>call load_kernel
Hier machst du einen call. Der schreibt die Rücksprungadresse auf den 
Stack und springt an die Adresse load_kernel

>load_kernel:
Das hier weißt den Assembler an, load_kernel mit der Adresse zu 
verknüpfen, die an der Stelle in der Datei vorliegt. Hier ist jetzt ein 
großer Unterschied ob CS=0x07C0 oder org 0x7C00 benutzt wurde.

>mov dl,[bootdrive]
Hier schreibst du den Inhalt des Speichers an Adresse bootdrive zurück 
ins Register dl.

>xor ax, ax
Hiermit setzt du Register ax auf Null. (xor mit sich selbst setzt alle 
Bits auf 0 und braucht bei einem x86er weniger Bytes als mov ax, 0x0000)

>int 0x13
Interrupt 0x13 aufrufen, davor noch die Rücksprungadresse auf den Stack 
legen.

>jc load_kernel
Wenn das Carry Bit gesetzt ist, dann springe zu Adresse load_kernel
Gast #3580217
Lesenswert?

Nicht ganz sicher.

Der Bios setzt Dir im DL Register das Bootlaufwerk zB 0x80 die erste 
Festplatte.

mov [xyz],dl speichert Dir das Laufwerk in die Adresse xyz
alle Biosfunktionen 0x13 wollen das anzusprechende Laufwerk in dl
deshalb
mov dl,[xyz] ; dl enthaelt das Bootlaufwerk
mov ah,42h   ; lba read
mov si, offset dap
int 13h

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren