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...
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
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
Voilà tout au niveau des sources.
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; }
Maintenant, j'aimerais savoir comment on peut faire le lien entre les deux bouts de code.
Merci d'avance pour vos réponses !
Partager