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

Linux Discussion :

GCC - ASM inline


Sujet :

Linux

  1. #1
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut GCC - ASM inline
    Bonjour à tous !
    J'ai définis dans un header file des valeurs comme :

    Dans un fichier .c qui inclus ce header file, j'ai de l'assembleur inline qui donne par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __asm__("movb $TEST,%al");
    Hors gcc me renvoit dans la face qu'il ne connait pas TEST.
    Pourtant si je déclare un entier dans mon fichier .c et lui attribut TEST il ne dit rien, preuve que TEST est bien définit mais ne semble pas passer dans de l'asm inline.
    Y a t il une solution sous gcc ? Des options de compilation ? Merci d'avance !

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    TEST est une macro.
    Le préprocesseur ne va pas aller l'expanser dans la chaîne de caractères... Donc quand le compilateur passe dessus, il cherche $TEST, et donc forcement, ne le trouve pas...

    Je suppose que tu veux, au final, te retrouver avec $0x22.
    L'idée est d'utiliser à fond les avantages du préprocesseur (cpp je suppose).
    Il te faut "transformer" ta macro en chaîne de caractères.

    Il existe au moins deux solutions (dont une plus élégante que l'autre )

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define TEST 0x22
    #define S_TEST "0x22"   /* on code en dur l'équivalent chaine de TEST  */
     
    <....>
    __asm__("movb $"S_TEST", %al");
    <....>
    Avantages : simple et rapide. Par contre, le jour ou la valeur de TEST change, il ne faut pas oublier de changer aussi S_TEST, sinon c'est le drame....

    D'ou une solution plus élégante :
    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
     
    #define TEST 0x22
    #define S_TEST xstr(TEST)
     
    /* do not separate following macros */
    #define xstr(s) str(s)
    #define str(s) #s
    /* ******************************** */
     
    int main(void) {
     
      __asm__("movb $"S_TEST", %al");
     
      return 0;
    }
    On passe par deux sous macros servant à expanser TEST et à le transformer en chaîne de caractères.
    => Un peu plus lourd à écrire, mais si TEST change, plus de problèmes de maintenance

    Voila, si tu as des questions, n'hésite pas
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Merci beaucoup, parfait

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

Discussions similaires

  1. [QUESTION] ASM Inline in C# ?
    Par KeLx86 dans le forum C#
    Réponses: 3
    Dernier message: 11/06/2008, 12h14
  2. [GCC] Assembleur inline et instructions SSE2
    Par progfou dans le forum Linux
    Réponses: 3
    Dernier message: 27/06/2007, 20h44
  3. ASM inline pushad/popad
    Par toto23 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 23/05/2007, 13h39
  4. asm inline avec gcc
    Par snakemetalgear dans le forum Autres éditeurs
    Réponses: 27
    Dernier message: 08/04/2007, 02h10
  5. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 01h41

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