Salut tout le monde !
Voilà j'ai un problème de chargement de Kernel; j'ai codé un boot loader en asm qui m'affiche la phrase "Chargement du kernel..." et appelle celui-ci; puis le Kernel affiche la phrase "Le Kernel parle !". Seulement après la compilation avec nasm et le liage par DOS(type kernel >> bootsector), je l'affiche avec bochs et la j'ai en boucle la phrase "Chergement du Kernel...". Voilà mes sources :
Bootsector :
%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 :
[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