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

x86 32-bits / 64-bits Assembleur Discussion :

asm inline avec gcc


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut asm inline avec gcc
    Bonsoir tous,
    voici mon code (sûrement faux ...) qui ne veut pas compiler :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        char    *salut = "Hello world!\n";
        __asm__
        (
            "movl %0, (%esp)\n\t"
            "call _printf\n\t"
            :
            : "m" (*salut)
        );
        return 0;
    }
    et voici la (com)plainte du compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ||=== Build: Debug in asm_inline (compiler: GNU GCC Compiler) ===|
    C:\Users\philippe\workspace\asm_inline\main.c||In function `main':|
    C:\Users\philippe\workspace\asm_inline\main.c|7|error: invalid `asm': operand number missing after %-letter|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    Voilà ,je vois pas où est le problème ?

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 460
    Points : 43 259
    Points
    43 259
    Par défaut
    Je maitrise pas l'assembleur Inline mais je pense pas que tu puisse mettre les noms de registre dedans comme ça.

    Regardes ce tuto :
    http://asm.developpez.com/cours/asminline/
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Je maitrise pas l'assembleur Inline mais je pense pas que tu puisse mettre les noms de registre dedans comme ça.

    Regardes ce tuto :
    http://asm.developpez.com/cours/asminline/
    J'en viens justement !! Par contre tu devrais y aller !

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 460
    Points : 43 259
    Points
    43 259
    Par défaut
    Je n'en ai pas besoin, je ne fais de code mais je sais qu'il est là au cas ou , il me servira de référence. C'est pour ça que je te l'ai proposé.
    Bonne continuation.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Je n'en ai pas besoin, je ne fais de code mais je sais qu'il est là au cas ou , il me servira de référence. C'est pour ça que je te l'ai proposé.
    Bonne continuation.
    Et je t'en remercie ! Malheureusement cela n'a pas résolu mon problème ...

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    c'est une horreur cet assembleur inline, ce truc des contraintes je n'ai vraiment jamais réussi à intégrer le principe perso

    ce truc là compile et semble fonctionner comme attendu, merci de ne pas me demander pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main (void) {
        int ret;
        char *salut = "Hello world!\n";
    
        __asm__ (
            "movl %0, (%%esp)\n\t"
            "call printf\n\t"
            : "=a" (ret)
            : "m" (*salut)
        );
        return 0;
    }
    et l'assembleur généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     80483f8:       8b 45 e8                mov    -0x18(%ebp),%eax
     80483fb:       89 04 24                mov    %eax,(%esp)
     80483fe:       e8 fd fe ff ff          call   8048300 <printf@plt>
     8048403:       89 c3                   mov    %eax,%ebx
     8048405:       89 5d f8                mov    %ebx,-0x8(%ebp)

  7. #7
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Merci BufferBob. Ton code fonctionne il est vrai.
    Quelqu'un pourra peut être nous dire pourquoi ?

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    A vrai dire j'avais la flemme de répondre
    Voici un code plus clair (syntax intel), je crois que j'ai pas besoin de l'expliquer le code parle de lui meme :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    char *chaine ="Bonjour %d\n";
    int a = 5;
     
    int main(int argc, char** argv)
    {
        asm( ".intel_syntax noprefix;" );
     
        asm("push a");
        asm("push chaine");
        asm("call printf");
        asm("add esp,8");
     
        asm( ".att_syntax noprefix;" );
     
        printf("end\n");
     
        return 0;
     
    }
    Le mérite revient aussi a chrtophe , le code est pompée de son tuto

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 460
    Points : 43 259
    Points
    43 259
    Par défaut
    Merci Kannagi,

    Par contre je ne sais pas si on peut exploiter sans problème du code inline en syntaxe Intel, notamment si on commence à gérer des registres. La syntaxe spécifique du code inline ne joue telle pas sur les prologues épilogues ? Le code présenté ne fait que de l'empilement.

    Je vais poser la question à l'auteur du tuto sur le code inline.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je ne suis pas expert de asm inline.
    Mais normalement on peux jouer avec les variable / registre sans trop de souci , voila un autre code de démonstration :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
        int fullscreen,largeur,hauteur;
     
     
    }SYSTEM;
     
    SYSTEM sys;
    int *tmp;
     
    SYSTEM *s = &sys;
     
    int sizeint = sizeof(int);
     
     
    int main(int argc, char** argv)
    {
     
        sys.fullscreen = 1;
        sys.largeur = 505;
        sys.hauteur = 155;
     
        int *a;
     
     
        asm( ".intel_syntax noprefix;" );
        asm("mov eax,300\n"); // ne sert a rien , juste pour voir si on modifie bien eax par la suite
        asm("mov eax,s\n"); //eax = adresse de s qui est un pointeur et qui point sur la struct sys
        asm("add eax,sizeint\n"); // adresse + sizeof(int)
        asm("add eax,sizeint\n"); // adresse + sizeof(int)
     
        asm("mov tmp,eax\n"); // on copie l'adresse de eax dans la variable tmp
     
        asm( ".att_syntax noprefix;" );
     
     
        printf("%d\n",*tmp); // on affiche ce que pointe tmp
     
        return 0;
     
    }
    Ce code fait un truc compliquer pour rien , mais c'est normal
    J'avais fait ce code pour voir comment on manipuler une structure en C via asm , ensuite j'ai testé dans la foulé les pointeurs.

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 460
    Points : 43 259
    Points
    43 259
    Par défaut
    Je considère donc que mon interrogation est non fondée.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  12. #12
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Merci Kannagi,

    Par contre je ne sais pas si on peut exploiter sans problème du code inline en syntaxe Intel, notamment si on commence à gérer des registres. La syntaxe spécifique du code inline ne joue telle pas sur les prologues épilogues ? Le code présenté ne fait que de l'empilement.

    Je vais poser la question à l'auteur du tuto sur le code inline.
    En tout cas c'est fait ! voilà le code :
    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 <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        char    *salut = "Hello world %d!\n";
        int ret = 4;
        __asm__
        (
            "movl %1, 4(%%esp)\n\t"
            "movl %0, (%%esp)\n\t"
            "call _printf\n\t"
            :
            : "r" (salut),"r" (ret)
        );
     
        return 0;
    }

  13. #13
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    tout simplement

    donc en gros tes erreurs c'était principalement %%esp, "m" au lieu de "r", et (*salut)

    Citation Envoyé par exe2bin Voir le message
    En tout cas c'est fait ! voilà le code :
    du coup, t'es en mesure d'expliquer pourquoi c'est le bon code ? pourquoi le modificateur "m" n'était pas valide ?

  14. #14
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    tout simplement

    donc en gros tes erreurs c'était principalement %%esp, "m" au lieu de "r", et (*salut)


    du coup, t'es en mesure d'expliquer pourquoi c'est le bon code ? pourquoi le modificateur "m" n'était pas valide ?
    En gros c'est ça !
    Du reste, la syntaxe AT&T reste assez imbuvable et c'est pour cela même qu'elle m'intéresse .

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

Discussions similaires

  1. Inlining des getters / setters auto avec GCC?
    Par _skip dans le forum Débuter
    Réponses: 45
    Dernier message: 17/08/2009, 12h51
  2. asm inline avec gcc
    Par snakemetalgear dans le forum Autres éditeurs
    Réponses: 27
    Dernier message: 08/04/2007, 02h10
  3. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 01h41
  4. GCC - ASM inline
    Par Edouard Kaiser dans le forum Linux
    Réponses: 2
    Dernier message: 11/07/2005, 09h22
  5. Forcer 'inline' avec GCC ou ICC
    Par Charlemagne dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/05/2005, 18h22

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