Bonjours,
J'ai commencé un petit OS, le problème c'est que le code du noyau s'execute quand je l'écris en asm mais quand je passe au C il ne réagit plus
Je vous donne le code (très long je préviens mais c'est pour être sur):
Pour le bootloader:
Le noyau en C:
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 ;======================================== ;=== ProtOS - Bootloader v1.0 === ;======================================== [BITS 16] [ORG 0x0] %define KERNEL 0x100 jmp start boot_dev: dw 0 ;Disque d'ou on a boote off_mem: dw 0 boot: dd "Bootloader v1.0", 0 kernel: dd "Chargement du noyau..", 0 start: mov [boot_dev], dl mov ax, 7C0h ;Se placer en 07C0:0000 mov es, ax mov ds, ax ;Initialisation de la pile cli ;Desactiver les interruption mov ax, 9000h ;Debut pile: 9000:0000 mov ss, ax mov sp, 0FFFFh ;Fin pile: 9000:FFFF sti ;Reactiver les interruption call effacer mov di, boot call affichage ;Ecrire message xor ax, ax int 13h ;Reset Drive push es mov ax, KERNEL mov es, ax xor bx, bx mov ah, 2 xor al, al inc al ;1 secteur xor ch, ch ;Cylindre 0 mov cl, 2 ;Secteur 2 xor dh, dh ;Tete 0 mov dl, [boot_dev] int 13h ;Read from disk pop es mov di, kernel call affichage jmp KERNEL:0 reboot: mov ax, 40h mov ds, ax mov bx, 72h mov dword [ds:bx], 1234h jmp 0FFFFh:0000 ;Redemarrage a chaud effacer: pusha push es mov ax, 0B800h ;Memoire video texte mov es, ax mov dx, 0720h ;Nombre de caractere/Ecran xor bx, bx clear: mov [es:bx], dx add bx, 2 cmp bx, 4000 jne clear popa pop es ret affichage: pusha push es mov ax, 0B800h ;Memoire video texte mov es, ax mov dh, 4h ;Ecrire en rouge mov bx, [off_mem] write: mov dl, [di] ;On prend un caractere cmp dl, 0 ;Si c'est un '0'(fin de chaine) je fin ;On finit inc di ;Pointe sur le prochain caractere mov [es:bx], dx ;Afficher le caractere add bx, 2 ;Mettre l'offset a jour jmp write fin: add dword [off_mem], 160 popa pop es ret times 510-($-$$) db 0 dw 0AA55h
Le fichier "out.c":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "include/out.h" void _start(void) { main(); } int main (void) { gotoxy(6,7); print("Le noyau en C est chargé!!!!!"); scroll(4); print("L'écran est scrollé!!!"); while(1); }
Le "out".h
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 #include "include/out.h" int posX=0; int posY=0; void print (char *str) { u_char arg=C_WHITE+B_BLACK; u_char *car; u_char *mem_vid=(u_char*)(VIDEO_MEM+posX*2+posY*160); for(;*str!=0; str++) { car=str; if(mem_vid>(u_char*)VIDEO_MEM_LIMIT) scroll(1); *mem_vid=*car; mem_vid++; *mem_vid=arg; mem_vid++; } return; } void scroll (u_char line) { u_char *mem_vid=(u_char*)(VIDEO_MEM+160*line); if(mem_vid>(u_char*)VIDEO_MEM_LIMIT) return; for(;mem_vid<(u_char*)VIDEO_MEM_LIMIT; mem_vid++) *mem_vid=*(mem_vid-160); return; } void clear (void) { u_char *mem_vid; mem_vid=(u_char*)VIDEO_MEM; for(; mem_vid<(u_char*)VIDEO_MEM_LIMIT; mem_vid++) *mem_vid=0; return; } void gotoxy (u_short x, u_short y) { posX=x; posY=y; return; }
Et enfin le "types.h"
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 #ifndef _OUT_H_ #define _OUT_H_ #include "types.h" #define VIDEO_MEM 0xB8000 #define VIDEO_MEM_LIMIT 0xB8FA0 #define VIDEO_MEM_SIZE 0xFA0 #define C_BLACK 0 #define C_BLUE 1 #define C_GREEN 2 #define C_CYAN 3 #define C_RED 4 #define C_MAGENTA 5 #define C_YELLOW 6 #define C_WHITE 7 #define SURINT 8 #define CLIGN 128 #define B_BLACK 0 #define B_BLUE 16 #define B_GREEN 32 #define B_CYAN 48 #define B_RED 64 #define B_MAGENTA 80 #define B_YELLOW 96 #define B_WHITE 112 extern int posX; extern int posY; /*Print require a string for argument and write it on the screen*/ void print (char *str); /*Scroll the screen of "line" lines*/ void scroll (u_char line); /*Clear the screen*/ void clear (void); /*Jump in a position (x;y) on the screen*/ void gotoxy (u_short x, u_short y); #endif
Si vous êtes parvenus ici je peux déjà vous dire merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef _TYPES_H_ #define _TYPES_H_ #define TRUE 1 #define FALSE 2 typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; #endif
Par ailleur je ne suis pas sur que ma méthode de compilation et de liaison est bonne, donc si les plus aguérits pourraient me donner un example de compilation de ce genre de projet (j'utilise gcc, nasm et ld).
Partager