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

Langage C++ Discussion :

Stocker le code d'une touche, dans une variable c++, à partir de code assembleur.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Stocker le code d'une touche, dans une variable c++, à partir de code assembleur.
    Salut,
    j'ai un code en assembleur qui lit les interruptions et qui et les convertit au caractère ASCII correspondant :

    Code cpp : 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
     
    /*
     *	keyboard.s
     */
     
    .text
    .globl _keyboard_interrupt
     
    /*
     * these are for the keyboard read functions
     */
    size	= 1024		/* must be a power of two ! And MUST be the same
    			   as in tty_io.c !!!! */
    head = 4
    tail = 8
    proc_list = 12
    buf = 16
     
    mode:	.byte 0		/* caps, alt, ctrl and shift mode */
    leds:	.byte 2		/* num-lock, caps, scroll-lock mode (nom-lock on) */
    e0:	.byte 0
     
    /*
     *  con_int is the real interrupt routine that reads the
     *  keyboard scan-code and converts it into the appropriate
     *  ascii character(s).
     */
    _keyboard_interrupt:
    	pushl %eax
    	pushl %ebx
    	pushl %ecx
    	pushl %edx
    	push %ds
    	push %es
    	movl $0x10,%eax
    	mov %ax,%ds
    	mov %ax,%es
    	xorl %al,%al		/* %eax is scan code */
    	inb $0x60,%al
    	cmpb $0xe0,%al
    	je set_e0
    	cmpb $0xe1,%al
    	je set_e1
    	call key_table(,%eax,4)
    	movb $0,e0
    e0_e1:	inb $0x61,%al
    	jmp 1f
    1:	jmp 1f
    1:	orb $0x80,%al
    	jmp 1f
    1:	jmp 1f
    1:	outb %al,$0x61
    	jmp 1f
    1:	jmp 1f
    1:	andb $0x7F,%al
    	outb %al,$0x61
    	movb $0x20,%al
    	outb %al,$0x20
    	pushl $0
    	call _do_tty_interrupt
    	addl $4,%esp
    	pop %es
    	pop %ds
    	popl %edx
    	popl %ecx
    	popl %ebx
    	popl %eax
    	iret
    set_e0:	movb $1,e0
    	jmp e0_e1
    set_e1:	movb $2,e0
    	jmp e0_e1

    Ce que je voudrais faire c'est récupérer cette touche dans cette fonction (en insérant le code assembleur dans le code c++.)

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void FenClient::readKey() {
     
    }

    Quelqu'un sait t'il comment faire ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon j'ai essayé cela (pour récupérer l'interruption clavier) :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void FenClient::readKey() {
        while(true){
            char kin;
            asm(
                "mov al, 16h;"
                "movb %%al, %0;"
                :"=r"(kin));
            printf("key : %c\n", kin);
        }
    }

    Mais il me dit Error : too many references for mov.

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Potentiellement le manque de \n
    Sachant que le ; en assembleur n'indique pas la fin de ligne, mais le début d'un commentaire. Enfin de mémoire...
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok j'ai essayé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    asm(
           "mov al, 16h \n"
           "movb %%al, %0"
            :"=r"(kin));
           printf("key : %c\n", kin);
    Mais, même message d'erreur. :/

    Je ne m'y connais pas beaucoup en assembleur alors je cherche des tutoriels par ci par là mais pour l'instant je n'ai rien trouvé qui fonctionne sur ma machine pour ce que je souhaite faire. :/

    J'ai un processeur intel core i5.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    http://en.cppreference.com/w/cpp/language/asm

    tu as consulté ça? Il semble que la syntaxe varie en fonction des compilateurs. Cependant la syntaxe gcc a l'air supportée par d'autres compilateurs et le lien donne deux exemples. Le séparateur de ligne semble être \n\t

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Au passage, l'assembleur n'est pas portable d'un processeur à l'autre. Comme on a déjà du mal à mettre d'accord les compilateurs entre eux sur la norme...

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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