Bonjour,
Voilà j'ai deux fonctions asm, utilisant l'interruption clavier, l'une permet de détecter si une touche a été frappée et l'autre de récupérer le caractère saisie.
Mon soucis vient du fait que lorsque je lance ces fonctions à partir d'un petit prog développé sous visual c++ 6, j'ai la fameuse erreur 0xc0000005 (segmentation fault) au niveau de l'interruption int 16h.
Sauriez vous pourquoi et comment remédier à ce problème?
A titre informatif, voici le code:
- Les deux fonctions assembleurs
- La prog développé sous visual 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 ;***************************************************************************** ;----Fonction pour afficher un caractère à l'écran avec interruption Systeme---- ;***************************************************************************** _TouchPresse: mov ah,01h ;Fonction 01h = Vérifit qu'une touche soit disponnible int 16h ;Appel l'interruption clavier mov al,1 ;Une touche est présente (TRUE) jnz PasVide xor al,al PasVide: ret ;***************************************************************************** ;----Fonction pour lire une touche avec interruption Systeme---- ;***************************************************************************** _LitTouche: xor ah,ah ;Fonction 00h = Lit une touche du clavier int 16h ;Appel l'interruption clavier or al,al; Est-ce une touche étendue? (AL=0) jz Etendue ;Ouais -> AL = code étendu (AH) + 128 ret ;Touche standart -> on se tire Etendue: mov al,ah ;AL = Code ASCII étendu or al,128 ;Ajoute 128 à celui-ci pour le distinguer ret
A noter que je n'ai pas de soucis pour appeller des sous fonctions écrites en assembleur mais qui ne comportent pas d'appels d'interruption.
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 #include "cdecl.h" ... unsigned int __cdecl TouchPresse(void); unsigned int __cdecl LitTouche(void); int main(void) { ... while(1) { if (TouchPresse()) { carac = LitTouche(); printf("Le caractere saisi est %c \n",carac); } } return 1;
Merci.
Nicolas
Partager