Hallo,
ich bin neu in diesem Forum und möchte etwas mehr über das Programmieren von Betreibssystemen wissen, kenne mich aber mit Assembler relativ gut aus.
Nun wollte ich zum besseren Verständnis von Betriebssystemen einen Bootlader schreiben, der den 2. Sektor von Diskette nachlädt und einen String, der sich in diesem 2. Sektor befindet, ausgibt. Ich habe zuerst den Code von
http://wiki.osdev.org/Babystep2 übernommen, der einen String ausgibt.
Das funktioniert auch perfekt, aber wenn ich nun per int10 den 2. Sektor von der Diskette lade und den String dort ausgeben will, passiert nichts.
Ich denke, der Fehler liegt vlt daran, dass ich nicht so richtig verstanden habe, was mit dem Datensegment (mov ds, ax) gemacht wird und wann das ausgeführt werden soll.
Soll der Code vom Kernel/2. Sektor hinter den Bootlader geladen werden?
Wenn nein, was ist die beste Stelle?
Muss ich irgendwie das Datensegment updaten? oder springen?
Ich darf doch später per include einfach den Kernel an den ersten Sektor hängen?
Vielen Dank für eure Hilfe!!!
Viele Grüße
Alex
[BITS 16]
[ORG 0x7c00]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
xor ax, ax ;make it zero
mov ds, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov si, msg
call bios_print
call LoadKern ; NEU
mov si, msg2 ; NEU
call bios_print ; NEU
hang:
jmp hang
msg db 'Welcome to Macintosh', 13, 10, 0
bios_print:
lodsb
or al, al ;zero=end of str
jz done ;get out
mov ah, 0x0E
int 0x10
jmp bios_print
done:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Load kernel procedure ; NEU
LoadKern:
mov ah, 0x02 ; Read Disk Sectors
mov al, 0x01 ; Read one sector only (512 bytes per sector)
mov ch, 0x00 ; Track 0
mov cl, 0x02 ; Sector 2
mov dh, 0x00 ; Head 0
mov dl, 0x00 ; Drive 0 (Floppy 1) (This can be replaced with the value in BootDrv)
mov bx, 0x7E00 ; Segment 0x7E00
mov es, bx ; again remember segments bust be loaded from non immediate data
mov bx, 0x0000 ; Start of segment - offset value
int 0x13 ; Call BIOS Read Disk Sectors function
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 510-($-$$) db 0
db 0x55
db 0xAA
msg2 db 'Hello World!', 13, 10, 0 ; NEU
times 1024-($-$$) db 0 ; NEU