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

C Discussion :

Code asm dans une macro C


Sujet :

C

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Code asm dans une macro C
    Bonjour à toutes et tous !

    Je cherche à remplacer une fonction avec quatre instructions asm dedans par une macro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    signed long long mul32b(int a, int b)
     
    {
     
      asm(" mov %0,%%l0" :: "r"(a));
     
      asm(" mov %0,%%l1" :: "r"(b));
     
      asm(" smul %l1,%l0,%o1\n");
     
      asm(" mov  %y,%o0");
     
    }
    Ce code est destiné à une architecture spécifique .
    Ceci dit, l'idée est de le remplacer par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define MULT32(a,b) ...
    Je sais que ça se fait, mais je ne trouve plus comment faire, il doit me manquer des () et des : un peu partout :p .

    Merci d'avance !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Tu peux faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define MULT32(a,b) { \
      asm(" mov %0,%%l0" :: "r"(a)); \
      asm(" mov %0,%%l1" :: "r"(b)); \
      asm(" smul %l1,%l0,%o1\n"); \
      asm(" mov  %y,%o0"); \
    }

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Perdu...
    Mais presque je pense.
    Il m'a mis moins d'erreurs .
    J'ai encore ça :
    error: parse error before '{' token
    Et le pendant à la fin :
    parse error before '}' token
    Je comprends très bien ce que ça signifie, mais bon, il me manque un mot clé devant les {} ?
    Il faut les remplacer par autre chose ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Code asm dans une macro C
    Citation Envoyé par progman
    Je cherche à remplacer une fonction avec quatre instructions asm dedans par une macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define MULT32(a,b)\
    do\
    {\
      asm(" mov %0,%%l0" :: "r"(a));\
      asm(" mov %0,%%l1" :: "r"(b));\
      asm(" smul %l1,%l0,%o1\n");\
      asm(" mov  %y,%o0");\
    }\
    while (0)
    La structure do-while n'a pas de role fonctionnelle. Elle sert simplement à permettre de mettre la macro dans une structure de code (if, for, while etc.) et à forcer l'usage du ';' final.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    C'est pas un ; à la place du } final ?

    Edit : ok

  6. #6
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Non, ça ne va toujours pas, il me met un
    syntax error before do
    et d'autres devant les {} .

    eci dit, le code n'est pas tout à fait celui ci de toutes façons, j'ai une troisieme variable dans mon define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define MULT32(a,b,q)\
    do\
    {\
      asm(" mov %0,%%l0" :: "r"(a));\
      asm(" mov %0,%%l1" :: "r"(b));\
      asm(" smul %l1,%l0,%o1\n");\
      asm(" mov  %y,%o0");\
      asm ("sra %o0,(q),%o0");\
    }\
    while (0)
    Je doute cependant que cela ne change grand chose.
    Pourtant ça ne va pas...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  7. #7
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Sinon il y a les fonctions inline qui peuvent etre considérées comme des grosses macros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    inline signed long long mul32b(int a, int b)
    {
     
      asm(" mov %0,%%l0" :: "r"(a));
     
      asm(" mov %0,%%l1" :: "r"(b));
     
      asm(" smul %l1,%l0,%o1\n");
     
      asm(" mov  %y,%o0");
     
    }

  8. #8
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'ai pas très bien compris l'histoire, mais pourquoi ne pas la déclarer normalement puis faire un define dessus par après ?

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Yep, j'essaie en passant par une fonction inlinée maintenant.
    Seulement, lorsque je le fais, il me faut retourner une valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static inline volatile DSPint MULT32(DSPint a, DSPint b, DSPshort q)
    {
      DSPint result=0;
      asm(" mov %0,%%l0" :: "r"(a));
      asm(" mov %0,%%l1" :: "r"(b));
      asm(" smul %l1,%l0,%o1\n");
      asm(" mov  %y,%o0");
      asm("sra %0,(q),%%o0" :: "r"(result));
      return result;
    }
    Et ça, ça a l'air de compiler, mais en fait, ça ne le fait pas à l'édition de lien, donc, ça ne doit pas fonctionner.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Non, ça ne va toujours pas, il me met un
    Citation:
    syntax error before do
    et d'autres devant les {} .
    et en mettant le do sur la même ligne que ta macro avec un et un seul espace ça donne quoi ?

    tu dois absolument avoir un espace entre le nom de ta macro et le début de la macro elle même.

    La structure do-while n'a pas de role fonctionnelle. Elle sert simplement à permettre de mettre la macro dans une structure de code (if, for, while etc.) et à forcer l'usage du ';' final.
    Dans le cas précis c'est vrai mais en général, on utilise la structure do while pour pouvoir éviter les effets de bord en créeant des varaibles locale à la macro (en fait au bloc do while )

    Sinon il y a les fonctions inline qui peuvent etre considérées comme des grosses macros
    Ah non, conceptuellement ce n'est pas ça : une macro est d'abord traitée par le préprocesseur tandis qu'une fonction est traitée par le compilateur.

  11. #11
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ah ben oui, c'est passé .
    Mais ça n'est pas plus rapide que la macro C que je voulais remplacer :'( .
    Tant pis, merci !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Tu sais, pour faire une multiplication, je pense que le compilo fais les optimisations nécessaires ...

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

Discussions similaires

  1. [XL-2007] problème dans du code en VBA dans une macro
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/12/2010, 18h05
  2. Copier Coller du Code dans une macro VBA
    Par ted the Ors dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2008, 16h11
  3. [Macro Access] pb dans mon code pour lancer une macro Access
    Par Commodore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2007, 10h51
  4. Inserer du code vba dans une macro
    Par gadget27 dans le forum Général VBA
    Réponses: 4
    Dernier message: 03/05/2007, 13h35
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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