IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

[NASM] Problème avec l'appel des interruptions


Sujet :

Assembleur

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut [NASM] Problème avec l'appel des interruptions
    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
    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
    - 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
     
    #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;
    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.

    Merci.

    Nicolas

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    De mémoire : le retour d'une fonction d'interruption devrait être iret & non ret. Non ?
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par ALT
    De mémoire : le retour d'une fonction d'interruption devrait être iret & non ret. Non ?
    Bien en fait, vu que c'est une sous fonction qui fait appel à une interruption, je pensais que ret était plus approprié que iret.
    En gros je me disais que c'est lorsqu'on programme une interruption, que l'on a besoin de mettre iret à la fin et non quand on en appelle une.
    Je vais quand même essayer avec iret.

    Nicolas

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    au cas où, je rappelle que l'utilisation des interruptions est interdite sous Windows (fonctionne seulement sous Dos ou la machine virtuelle pour programmes 16 bits de windows).

    Si tu souhaites exécuter des interruptions via la machine virtuelle des noyaux NT (NTVDM) tu devra compiler et lier un programme 16 bits.

    à partir d'un petit prog développé sous visual c++ 6
    J'apportais simplement ces précisions parce que Visual C++ 6 ne compile pas et ne lie pas en 16 bits mais uniquement en 32 bits ( = pas d'int).

    J'espère que cela résoudra ton problème... Dans le cas contraire, je ne vois pas où se situe l'erreur .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/11/2011, 23h41
  2. Réponses: 1
    Dernier message: 24/11/2009, 15h12
  3. Probléme avec l'appel des forms
    Par Rukia dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/05/2008, 18h34
  4. [SWT] Problème avec la transparence des PNG
    Par sirjuh dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 02/08/2004, 08h07
  5. Réponses: 11
    Dernier message: 16/12/2003, 19h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo