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 :

est-ce possible avec une macro ?


Sujet :

C

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut est-ce possible avec une macro ?
    Bonjour,



    D'ordinaire, je fais un usage très limité des macros (definition de constantes ou de valeurs pour les #ifdef), car je préfère utiliser des inline... mais ce que je souhaite faire doit absolument être purement syntaxique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define COMMAND(n) movl ## n, %0
     
    int i;
    __asm__ (COMMAND(9) : "=m"(i));
    la conversion se fait bien, mais il me faudrait des " autour du résultats


    au lieu de cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __asm__ (movl $9, %0 : "=m"(i));
    je souhaiterais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __asm__ ("movl $9, %0" : "=m"(i));
    est-ce possible ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu peux donner les macros que tu utilises reellement pour commencer?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Tu peux donner les macros que tu utilises reellement pour commencer?

    pour le moment, je n'ai pas de macros, mais j'aimerais bien rendre mon code un peu plus lisible...


    ce que je souhaites faire en fait c'est ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char bytecode_label[1+END] = {"load0", ...};
    void* begin[1+END];
    void* end[1+END];
     
    /*
    __asm__ ("movl  $.load0_begin, %0" :"=m"(begin[LOAD_0]);
    __asm__ ("movl  $.load0_end, %0" :"=m"(end[LOAD_0]);
     
    a remplacer par ceci si possible
     
    */
     
    DECLARE("load0",LOAD_0);

    si quelqu'un voit comment faire, je suis preneur
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Est-ce que tu as verifie que la concatenation des litteraux de chaines n'etait pas faite dans les __asm__? Si elle est faite, c'est trivial ("a" "b" etant alors equivalent a "ab").
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Est-ce que tu as verifie que la concatenation des litteraux de chaines n'etait pas faite dans les __asm__? Si elle est faite, c'est trivial ("a" "b" etant alors equivalent a "ab").

    exact, ça marche... pourquoi chercher compliqué ?


    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
    // vim:set ts=4 sw=4:
     
    #include <stdio.h>
     
    #define TEMP(n) "movl $" #n ", %0"
     
    int main(int argc, char** argv) {
    	int i = 0;
     
    	fprintf(stderr,"%d\n",i);
    	__asm__ (TEMP(9) : "=m"(i));
    //	__asm__ ("movl ""$9, %0" : "=m"(i));
    	fprintf(stderr,"%d\n",i);
     
    	return 0;
    }
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    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
    Citation Envoyé par gorgonite
    D'ordinaire, je fais un usage très limité des macros (definition de constantes ou de valeurs pour les #ifdef), car je préfère utiliser des inline... mais ce que je souhaite faire doit absolument être purement syntaxique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define COMMAND(n) movl ## n, %0
     
    int i;
    __asm__ (COMMAND(9) : "=m"(i));
    la conversion se fait bien, mais il me faudrait des " autour du résultats


    au lieu de cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __asm__ (movl $9, %0 : "=m"(i));
    je souhaiterais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __asm__ ("movl $9, %0" : "=m"(i));
    est-ce possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define COMMAND(n) "movl $" #n ", %0"
     
    int main(void)
    {
     
    int i;
    __asm__ (COMMAND(9) : "=m"(i));
     
       return 0;
    }
    Semble compiler, mais je n'ai jamais compris comment on produisait le code du préprocesseur (.i) ni le code assembleur (.s).
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Semble compiler, mais je n'ai jamais compris comment on produisait le code du préprocesseur (.i)
    ni le code assembleur (.s).
    (De memoire, il faut peut-etre aussi -c)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    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
    Citation Envoyé par Jean-Marc.Bourguet
    (De memoire, il faut peut-etre aussi -c)
    OK, merci. Je pense qu'avec un IDE, ça ne peut pas fonctionner à cause du > ...

    J'avais essayé le -S (1er de la liste des options), mais j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: console.exe
    C:\CodeBlocks\bin\..\lib\gcc\mingw32\3.4.4\..\..\..\..\mingw32\bin\ld.exe:.objs\main.o: file format not recognized; treating as linker script
    C:\CodeBlocks\bin\..\lib\gcc\mingw32\3.4.4\..\..\..\..\mingw32\bin\ld.exe:.objs\main.o:1: syntax error
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    1 errors, 0 warnings
    Quand à -E :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: console.exe
    .objs\main.o: file not recognized: File format not recognized
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    OK, merci. Je pense qu'avec un IDE
    C'est quoi un IDE ?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    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
    Citation Envoyé par Jean-Marc.Bourguet
    C'est quoi un IDE ?
    Wé...

    Alors ligne de commande. OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
     
    C:\dev\forums\bc>cd..
     
    C:\dev\forums>gcc
    'gcc' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
     
    C:\dev\forums>
    On avance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
     
    C:\dev\forums\bc>cd..
     
    C:\dev\forums>\codeblocks\bin\gcc
    gcc: no input files
     
    C:\dev\forums>
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    C:\dev\forums>\codeblocks\bin\gcc -c -E main.c
    # 1 "main.c"
    # 1 "<built-in>"
    # 1 "<command line>"
    # 1 "main.c"
     
     
    int main(void)
    {
     
    int i;
    __asm__ ("movl $" "9" ", %0" : "=m"(i));
     
       return 0;
    }
     
    C:\dev\forums>\codeblocks\bin\gcc -c -S main.c
     
    C:\dev\forums>type main.s
            .file   "main.c"
            .def    ___main;        .scl    2;      .type   32;     .endef
            .text
    .globl _main
            .def    _main;  .scl    2;      .type   32;     .endef
    _main:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $8, %esp
            andl    $-16, %esp
            movl    $0, %eax
            addl    $15, %eax
            addl    $15, %eax
            shrl    $4, %eax
            sall    $4, %eax
            movl    %eax, -8(%ebp)
            movl    -8(%ebp), %eax
            call    __alloca
            call    ___main
    /APP
            movl $9, -4(%ebp)
    /NO_APP
            movl    $0, %eax
            leave
            ret
     
    C:\dev\forums>
    Ca roule, j'avais oublié le "$"
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    OK, merci. Je pense qu'avec un IDE, ça ne peut pas fonctionner à cause du > ...

    J'avais essayé le -S (1er de la liste des options), mais j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: console.exe
    C:\CodeBlocks\bin\..\lib\gcc\mingw32\3.4.4\..\..\..\..\mingw32\bin\ld.exe:.objs\main.o: file format not recognized; treating as linker script
    C:\CodeBlocks\bin\..\lib\gcc\mingw32\3.4.4\..\..\..\..\mingw32\bin\ld.exe:.objs\main.o:1: syntax error
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    1 errors, 0 warnings
    Quand à -E :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: console.exe
    .objs\main.o: file not recognized: File format not recognized
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings

    Oui, c'est normal, il va mettre dans le fichier objet (.o) le code assembleur ou le code C (suite au préprocessing). Ensuite, il essaye de faire l'édition des liens et forcement, ça ne marche pas vu que le fichier objet contient du code assembleur

    Enfin, tu peux toujours aller jetter un oeil dans le .o, tu verras qu'il y aura le bon code
    Je ne répondrai à aucune question technique en privé

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pour ceux qui voudraient voir les détails de chaque passe, je vais les mettre ici...
    (en revanche, c'est gcc 4 sous linux )

    j'ai mis en rouge les parties qui concernent la question

    fichier.c

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    
    #define TEMP(n) "movl $" #n ", %0"
    
    int main(int argc, char** argv) {
    	int i = 0;
    
    	fprintf(stderr,"%d\n",i);
    	__asm__ (TEMP(9) : "=m"(i));
    	fprintf(stderr,"%d\n",i);
    
    	return 0;
    }

    fichier.i

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    
    int main(int argc, char** argv) {
     int i = 0;
    
     fprintf(stderr,"%d\n",i);
     __asm__ ("movl $" "9" ", %0" : "=m"(i));
    
     fprintf(stderr,"%d\n",i);
    
     return 0;
    }

    fichier.s

    Code asm : 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
            .file   "testStringInASM.c"
            .section        .rodata
    .LC0:
            .string "%d\n"
            .text
    .globl main
            .type   main, @function
    main:
            leal    4(%esp), %ecx
            andl    $-16, %esp
            pushl   -4(%ecx)
            pushl   %ebp
            movl    %esp, %ebp
            pushl   %ecx
            subl    $36, %esp
            movl    $0, -8(%ebp)
            movl    -8(%ebp), %eax
            movl    stderr, %edx
            movl    %eax, 8(%esp)
            movl    $.LC0, 4(%esp)
            movl    %edx, (%esp)
            call    fprintf
    #APP
            movl $9, -8(%ebp)
    #NO_APP
            movl    -8(%ebp), %eax
            movl    stderr, %edx
            movl    %eax, 8(%esp)
            movl    $.LC0, 4(%esp)
            movl    %edx, (%esp)
            call    fprintf
            movl    $0, %eax
            addl    $36, %esp
            popl    %ecx
            popl    %ebp
            leal    -4(%ecx), %esp
            ret
            .size   main, .-main
            .ident  "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
            .section        .note.GNU-stack,"",@progbits
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

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

Discussions similaires

  1. [GD] Remplir une forme quelconque par une couleur est-ce possible avec GD ?
    Par cjean123 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 15/04/2014, 13h02
  2. une requete imbrique est ce possible avec hyperfile?
    Par android32 dans le forum HyperFileSQL
    Réponses: 0
    Dernier message: 01/12/2012, 18h21
  3. Réponses: 2
    Dernier message: 06/03/2011, 10h17
  4. [Matrice]Est ce possible avec OpenGL?
    Par bnoix dans le forum OpenGL
    Réponses: 7
    Dernier message: 19/05/2005, 17h47
  5. [IRC] -> Est-ce possible avec JBuilder ?
    Par MaTHieU_ dans le forum JBuilder
    Réponses: 4
    Dernier message: 26/08/2003, 17h24

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