JB_59
Messages postés3Date d'inscriptionlundi 27 septembre 2004StatutMembreDernière intervention31 juillet 2005
-
30 juil. 2005 à 16:35
asma20vs
Messages postés1Date d'inscriptionsamedi 20 juin 2009StatutMembreDernière intervention20 juin 2009
-
20 juin 2009 à 23:30
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
vinc1008881
Messages postés257Date d'inscriptiondimanche 22 août 2004StatutMembreDernière intervention29 septembre 20103 31 juil. 2005 à 12:42
Salut,
je ne comprends pas tres bien ceci :
"Seulement après la compilation avec nasm et le liage par DOS(type kernel >> bootsector)"
yas pas besoin de linkage ici...=> tu compile le bootsect avec nasm et tu ecrit le binaire sur le secteur 0 de ta disquette
=>tu compile le "kernel" avec nasm et tu ecrit le binaire sur le secteur 2 de ta disquette
utilise ramwrite pour ecrire sur les secteur disquette...
@+ , vinc1008881
le goto, c'est comme un parachute, tu l'utilise jamais mais quand t'en as besoin...
asma20vs
Messages postés1Date d'inscriptionsamedi 20 juin 2009StatutMembreDernière intervention20 juin 2009 20 juin 2009 à 23:30
salut tt le monde
je désire votre aide dans un probleme ke j'arrive pas a résoudre meme je comprends pas comment je dois faire le pas..
je veux créer une disquette bootable sous emu8086 qui affiche un message lors de démarrage du systeme
pouvez-vous m'aider svp..
merci pour votre attention