Die folgenden Quelldateien werden separat (in rohen Binärdateien) zusammengestellt und auf Sektoren 1 und 2 einer virtuellen Diskette geladen. Diese Diskette dient dann als Boot-Medium für eine qemu-system-i386-VM.Position unabhängige Code in 16-Bit-Real-Modus, bootloading/Floppy lesen
Der "Bootloader" liest das "erste Programm" aus Sektor 2 der Diskette und springt dann in den Speicher mit dem gerade gelesenen Code. Der folgende Code funktioniert wie gewünscht (d. H. Die Willkommensnachricht "erstes Programm" wird gedruckt), aber ich musste ORG 0x001E
in der Quelle des "ersten Programms" angeben (erhalten durch Untersuchung des Bootloader-Codes in einem Hex-Editor). 0x001E ist der Offset des temp
Puffers, der den von der Diskette gelesenen Code enthält.
"Bootloader":
BITS 16
bootloader_main:
mov bx, 0x07C0 ; Set data segment to bootloader's default segment
mov ds, bx
mov ah, 0x02 ; BIOS int13h "read sector" function
mov al, 1 ; Number of sectors to read
mov cl, 2 ; Sector to read
mov ch, 0 ; Cylinder/track
mov dh, 0 ; Head
mov dl, 0 ; Disk number (here, the floppy disk)
mov bx, 0x07C0 ; Segment containing the destination buffer
mov es, bx
mov bx, temp ; Destination buffer offset
int 0x13
jmp temp
ret
;end bootloader_main
temp: times 60 db 17
times 510-($-$$) db 0 ; Pad rest of sector and add bootloader
dw 0xAA55 signature
"erstes Programm":
BITS 16
ORG 0x001E ; Assume that this code will be located 0x001E bytes
after start of bootloader (in RAM)
mov bx, string ; Print a welcome string
mov ah, 0x0E
print_loop:
mov al, byte [bx]
int 0x10
inc bx
cmp byte [bx], 0
jne print_loop
;end print_loop
string: db "This is the first program.", 0
Alternativ könnte ich ORG 0x200
und 0x200
für den Puffer anstelle von temp
(dh das Programm in den Arbeitsspeicher geladen werden kurz nach Bootloader), aber keine dieser Hacks scheint nachhaltig zu sein, wenn es darum geht, nützliche Betriebssysteme zu erstellen. Wie vermeide ich diese Art von Hardcoding von Adressen?
markieren Sie bitte die Prozessorarchitektur bei der Montage Fragen veröffentlichen. – rjp
Ich würde mir vorstellen, dass die Basisadresse etwas ist, das mit dem Bootloader spezifiziert werden müsste. Die meiste meiner Arbeit in diesem Bereich war auf Embedded-Systemen, und ich weiß, dass das BIOS eine Menge Sachen für Sie erledigt. Wenn ich einen Bootloader benutze, hat er normalerweise eine Dokumentation, die mir sagt, wo der Einstiegspunkt erwartet wird. – rjp
Wenn also jemand ein Programm zusammenbaute, das auf die Diskette geladen und vom Bootloader gelesen wurde, wurde ihm gesagt, er solle etwas wie 'ORG 512' (oder eine andere bestimmte Adresse) zu seinem Quellcode hinzufügen? Und der Bootloader würde das Programm immer auf den gleichen Teil des Speichers laden? Es ist schwer vorstellbar, wie sich moderne Betriebssysteme daraus entwickelt haben, aber ich denke, ich sollte mehr über die Geschichte lesen. – Vale132