Bonjour à tous,

Je sais que la question à dû déjà être traitée sous toutes ses coutures, mais pour l'instant je bloque dans mes recherche...

Voici l'idée :

Je dispose d'un code ASM (je l'ai adapté d'un fichier qui n'est pas de moi (source : TutoOS.Bootsect)) : c'est un secteur de boot qui appelle la fonction "puissance" écrite dans un fichier C.

Voici les fichiers en question :

Le fichier ASM : (compilateur : nasm) les deux rajouts important sont marqué par des commentaires. De plus ces parties nouvelles ont sûrement des erreurs, donc n'hésitez pas à me corriger...

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
 
[BITS 16] ; indique a nasm que l'on travaille en 16 bits
[ORG 0x0]
 
; initialisation des segments en 0x07C00
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov ax, 0x8000
mov ss, ax
mov sp, 0xf000 ; stack de 0x8F000 -> 0x80000
 
; rajout : on fait l'opération
push 4
push 5
call puissance
pop ax
 
; rajout : on verifie le resultat
cmp ax, 1024
jne .end
 
; affiche un message
mov si, message
call afficher
 
 
end:
jmp end
 
 
;--- Variables ---
message db "4 puissance 5 vaut bien 1024", 13, 10, 0
;-----------------
 
;---------------------------------------------------------
; Synopsis: Affiche une chaine de caracteres se terminant par 0x0
; Entree: DS:SI -> pointe sur la chaine a afficher
;---------------------------------------------------------
afficher:
push ax
push bx
.debut:
lodsb ; ds:si -> al
cmp al, 0 ; fin chaine ?
jz .fin
mov ah, 0x0E ; appel au service 0x0e, int 0x10 du bios
mov bx, 0x07 ; bx -> attribut, al -> caractere ascii
int 0x10
jmp .debut
 
.fin:
pop bx
pop ax
ret
 
;--- NOP jusqu'a 510 ---
times 510-($-$$) db 144
dw 0xAA55
Et voici le code C (compilateur : gcc), qui celui-là, bien que pas optimisé, est juste !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
short int puissance(short int nombre, short int exposant)
{
	int compteur, resultat=1;
	for(compteur=0 ; compteur<exposant ; compteur++)
		resultat *= nombre;
	return resultat;
}
Voilà tout au niveau des sources.
Maintenant, j'aimerais savoir comment on peut faire le lien entre les deux bouts de code.

Merci d'avance pour vos réponses !