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 :

Aide pour compiler du code assembleur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Par défaut Aide pour compiler du code assembleur
    Bonjour,

    Je souhaite compiler un programme en C contenant du code assembleur mais la syntaxe avec le mot réservé _asm {} n'est pas acceptée, il faut utiliser le mot asm (); avec les "".

    La syntaxe est assez complexe. J'ai jeté un oeil sur http://www.ibiblio.org/gferg/ldp/GCC...-HOWTO.html#s5 et je ne suis pas sûr du passage de paramètres...

    Je compile avec Code::Blocks avec le compilateur GNU par défaut.

    Voici le code en question :

    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
    //just saves execution contect and calls check() 
    _declspec(naked) Proxy()
    {
     
    _asm{
     
    //save execution contect and calls check() -the rest depends upon the value check() returns
    // if it is 1, proceed to the actual callee. Otherwise,return STATUS_ACCESS_DENIED
    pushfd
    pushad
    mov ebx,esp
    add ebx,40
    push ebx
    call check
    cmp eax,1
    jne block
     
    //proceed to the actual callee
    popad
    popfd
    jmp RealCallee
     
    //return STATUS_ACCESS_DENIED
    block:popad
    mov ebx, dword ptr[esp+8]
    mov dword ptr[ebx],0
    mov eax,0xC0000022L
    popfd
    ret 32
     
    }
    }
    Y-a-t-il quelqu'un qui pourrait m'aider à traduire ce passage _asm {} en asm (); SVP ?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Les syntaxes d'assembleur inline dépendent souvent du compilateur.

    Quel compilateur utilises-tu ? Connais-tu la version ?

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 641
    Par défaut assembleurS inline
    Bonjour,

    Le code présenté utilise la syntaxe Intel : op dest, src.
    GCC utilise la syntaxe ATT : op src, dest

    Ce n'est hélas pas la seule différence. Les codes assembleurs ne sont pas les mêmes :
    • Typage implicite pour Intel contre explicite pour GCC qui demande à ce que le code op utilisé précise (avec une lettre en suffixe) le type d'argument et distingue les registre par des % précédant leur nom.
    • Pour GCC le code assembleur doit être une chaîne de caractères, y compris les sauts de lignes
    • GCC peut utiliser des registres non fixés qui permet au compilateur de mieux distribuer ceux-ci (c'est du reste étrange que cette meilleure intégration soit juxtaposée à la contrainte précédente.
    • GCC incite fortement à déclarer les entrées, les sorties et les registres (même symboliques) modifiés.


    En résumé, GCC est meilleur en laissant plus de marge au compilateur pour jongler avec les registres mais au prix d'une syntaxe lourde.

    Pour se simplifier la vie dans ce domaine, la solution la plus évidente est de changer de compilateur (Intel, VC++, BC++ etc.). Mais il faut se rappeler que revenir sur ce choix, quel qu'il soit, sera toujours douloureux.

    Salutations

  4. #4
    Membre confirmé Avatar de ALEX77
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 138
    Par défaut
    Sinon est-il possible de mettre le code asm avec la syntaxe intel dans un fichier à part et de le lier dans la procédure ?

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 641
    Par défaut On peut toujours...
    Bonjour,

    On peut toujours mélanger les langages si on respecte les conventions d'appel. Par exemple, Nous le faisons sans y penser lors de l'appel d'une fonction de l'OS.

    Mais développer un module en assembleur ne me semble pas approprié pour remplacer une petite procédure en assembleur ou un simple code assembleur inséré sans cadre de procédure. De plus l'accès aux variables du programme devient, sinon impossible, sensiblement plus difficile.

    Salutations

Discussions similaires

  1. Aide pour compiler du code pour DOS/XP
    Par jkepler dans le forum Fortran
    Réponses: 1
    Dernier message: 22/11/2007, 10h42
  2. Aide pour compiler un code
    Par deubelte dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/02/2007, 19h33
  3. [VB.NET] besoin d'aide pour déchiffrer un code
    Par pcdj dans le forum Windows Forms
    Réponses: 10
    Dernier message: 27/06/2006, 11h32
  4. Aide pour comprendre le code
    Par jfreuff dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/01/2006, 17h54
  5. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2005, 23h30

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