Bootloader qui ne lance pas le Kernel
Salut tout le monde !
Voilà j'ai un petit problème, j'ai codé un bootloader et un Kernel : Le premier affiche la phrase "Chargement du Kernel...", puis applle ce dernier, qui lui affiche la phrase "Le Kernel parle !". Je compile ces programmes avec nasm, puis les lie avec DOS (type kernel>>bootsector).
Et lorsque je teste avec bochs, il me renvoie en boucle la phrase "Chargement du Kernel...". Voilà mes sources :
Bootsector.asm
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| %define BASE 0x100
%define KSIZE 2 ; Nombre de secteurs de 512 octets a charger
[BITS 16]
[ORG 0x0]
; Initialisation des segments
mov ax, 0x07C0
mov ds, ax ; Data segment en 7C00h
mov es, ax ; Extra segment en 7C00h
mov ax, 0x8000 ; Réglage de stack
mov ss, ax
mov sp, 0xF000
mov [bootdrv],dl ; recuparation de l'unite de boot
; Affichage du message
mov si, welcome ; On met la variable qui contient le message dans le registre SI
call write ; On appelle la fonction qui va écrire le message
; Charger le noyau
xor ax, ax
int 0x13
push es
mov ax, BASE ; L'int 13h charge le(s) secteur(s) en es:bx
mov es, ax
mov bx, 0
mov ah, 2 ; Fonction de lecture
mov al, KSIZE
mov ch, 0 ; Numéro de piste
mov cl, 2 ; Numéro du secteur de départ pour la lecture
mov dh, 0 ; Numéro de face
mov dl, [bootdrv] ; Numéro du lecteur
int 13h
pop es
; Saut vers le kernel
jmp dword BASE:0
; Fonctions
write:
.debut:
lodsb ; Met le premier octet du contenu de l'adresse SI dans AL et incrémente SI
cmp al, 0
jz .fin
mov ah, 0x0E ; Avec l'interruption 0x10 et le caractere en AL, ça écrit à l'écran
int 0x10
jmp .debut
.fin:
ret; Retour au code
; Donnees
welcome db "Chargement du kernel...", 13, 10, 0
bootdrv: db 0
times 510-($-$$) db 0
dw 0xAA55; Signature pour le boot |
Kernel.asm
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| [BITS 16]
[ORG 0x100]
; initialisation des segments en 0x100
mov ax,0x100
mov ds,ax
mov es,ax
mov ax,0x8000 ; stack en 0xFFFF
mov ss,ax
mov sp, 0xf000
; Affichage du message
mov si, speak; On met la variable qui contient le message dans le registre SI
call write; On appelle la fonction qui va écrire le message
; Boucle infinie pour ne pas que le bootsector ne fasse n'importe quoi à la fin
jmp $-2
; Fonctions
write:
.debut:
lodsb ; Met le premier octet du contenu de l'adresse SI dans AL et incrémente SI
cmp al, 0
jz .fin
mov ah, 0x0E ; Avec l'interruption 0x10 et le caractere en AL, ça écrit à l'écran
int 0x10
jmp .debut
.fin:
ret; Retour au code
;DONNEES
speak db "Le Kernel parle !", 13, 10, 0 |
Voilà si quelqu'un pouvait m'aider et me dire ce qui ne vas pas, merci :D