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
Kernel.asm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Voilà si quelqu'un pouvait m'aider et me dire ce qui ne vas pas, merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager