?
Hier mal mein Bootloader, vllt hilft der dir weiter
;### Bootloader ###
[BITS 16]
org 0x7C00 ;Wir starten an der Adresse 0x7C00
;Segmentregister und Stack aufsetzen
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ax, 0x9000 ;Stacksegment
mov ss, ax
mov sp, 0
sti
mov [boot_drive], dl ;Bootlaufwerk speichern
;Zur Startfunktionen springen
jmp 0x0000:start
;Paar Variablen und Strings
boot_drive db 0
boot_msg db "tony's Bootloader v0.1.0", 13, 10, 0
error_reset_msg db "Couldn't reset bootdrive!", 13, 10, 0
error_kernel_msg db "Couldn't load kernel!", 13, 10, 0
;--String aus SI ausgeben
print:
lodsb ;Byte von SI nach AL laden und SI um eins erhöhen
or al, al ;Null?
jz print_end ;-> Ende!
mov ah, 0x0E ;BIOS-Funktion
mov bx, 0x0007 ;Attribute... (grau-auf-schwarz)
int 0x10 ;Print it, baby!
jmp print ;Nächstes Zeichen
print_end:
retn
;--PC neustarten
reboot:
jmp 0xFFFF:0x0000
;--Laufwerk aus DL zurücksetzen
reset_drive
mov ah, 0x00 ;Funktionsnummer
int 0x13
or ah, ah ;<> 0?
jnz reset_error ;-> Fehler!
retn
;Da ging wohl was falsch... Fehler ausgeben und CPU anhalten
reset_error:
mov si, error_reset_msg
call print
cli
hlt
;--Unseren Kernel laden
load_kernel:
mov dl, [boot_drive]
call reset_drive ;Laufwerk zurücksetzen
mov ax, 0x1000 ;Kernel wird nach 0x1000:0x0000 geladen
mov es, ax
mov bx, 0x00
mov ah, 0x02 ;Funktionsnummer
mov al, 0x05 ;Anzahl der zu lesenden Sektoren
mov ch, 0x00 ;Zylinder
mov cl, 0x02 ;Startsektor
mov dh, 0x00 ;Kopf
int 0x13
or ah, ah
jnz kernel_error
retn
kernel_error:
mov si, error_kernel_msg
call print
cli
hlt
start:
mov si, boot_msg
call print
call load_kernel
mov ax, 0x1000 ;Startadresse laden
mov es, ax ;Segmentregister updaten
mov ds, ax
jmp 0x1000:0x0000
times 512-($-$$)-2 db 0
dw 0x55AA