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:
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 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
 
#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 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
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;
}
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
 
#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
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
 
#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
Si vous êtes parvenus ici je peux déjà vous dire merci
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).