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 :

Inclusion d'Assembleur dans un programme C


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut Inclusion d'Assembleur dans un programme C
    Bonjour à tous,

    J'ai compilé ce qui suit avec BCC32.
    Dois-je le compiler comme myFirst.asm?

    Vista 64 refuse de le faire fonctionner.
    Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz
    Code C : 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
    --------------  myFirst.c -----------
    #include <stdio.h>
     
    int main(void)
    {
    	int x =50;
     
    	_asm{
    		MOV	EAX, x
    		SHL EAX, 1
    	}
     
    	printf("x = %d\n", x);
     
    	return 0;
    }
    bcc32 -omyFirst.exe myfirst.c

    J'utilise NASM version 2.06rc1 compiled on Nov 30 2008

    Cordialement,

    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Déja, si tu insère de l'asm directement dans ton code C, tu n'as pas besoin d'assembler le code, c'est le compilo qui va s'en charger.
    Quand tu dis "Vista 64 refuse de le faire fonctionner" que veux-tu dire?
    - Le compilo ne veut pas compiler ton programme? Dans ce cas, consulte la doc du compilo pour voir comment celui-ci gère l'asm inline.
    - L'éxécutable généré est invalide? A ma connaissance, vista64 est compatible avec les éxécutables 32 bits, donc ça m'étonnerais et il ne me semble pas que bcc32 permette de générer des éxécutables 64bits donc le problème ne viens pas du fait que ce soit de l'asm 32bits que tu insère dans ton code.
    - Le programme ne fonctionne pas comme tu le souhaiterais? En effet, ton code asm ne fait strictement rien: tu met la valeur d'une variable dans un registre, décale ce registre d'un bit vers la gauche et... c'est tout. Ta variable n'a pas changée de valeur lorsque tu l'affiche. Si tu veux placer le résultat de l'opération dans la variable, il faut mettre la valeur du registre dans la variable.
    Voila ce qu'il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov eax, x
    shl eax, 1
    mov x, eax

  3. #3
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par dr.bloodmoney Voir le message
    Si tu veux placer le résultat de l'opération dans la variable, il faut mettre la valeur du registre dans la variable.
    Voila ce qu'il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov eax, x
    shl eax, 1
    mov x, eax
    Je croyais que le déplacement suffisait...
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    myfirst.c:
    Warning W8002 myfirst.c 6: Restarting compile using assembly in function main
    Turbo Assembler Version 5.0 Copyright (c) 1988, 1996 Borland International

    Assembling file: myFirst.ASM
    Error messages: None
    Warning messages: None
    Passes: 1

    Même problème.

    myFirst.exe n'est pas compatible ave
    c la version de Windows actuellement exécutée. Vérifiez dans les informations sy
    stème de votre ordinateur si une version x86 (32*bits) ou x64 (64*bits) du programme est requise, puis contactez l'éditeur de logiciel.

    ----------------------------
    Avec GCC, j'ai enlevé l'underscore p.c.q j'avais plus de commentaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    asm{
    MOV EAX, x
    SHL EAX, 1
    MOV x, EAX
    }
    $ gcc -mno-cygwin -Wall -omyfirst.exe myfirst.c
    myfirst.c: In function `main':
    myfirst.c:7: error: parse error before '{' token

    myfirst.c:5: warning: unused variable `x'

    Merci

    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  4. #4
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    ce qu'il faudrait faire c'est ne garder dans la section assembleur que l'instruction "shl eax,1" et mettre avant l'instruction C qui met la variable x dans eax et apres un instruction c qui met eax dans la variable x

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Je ne connais pas beaucoup bcc mais par contre, la méthode la plus simple pour faire cela ,oui.
    Faire un module objet (un proc) en assembleur,le déclarer extern dans le c.
    Faire attention aux passages de paramètres , c'est un standard call.
    Le linker fait le reste.

  6. #6
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par ToutEnMasm Voir le message
    Je ne connais pas beaucoup bcc mais par contre, la méthode la plus simple pour faire cela ,oui.
    Faire un module objet (un proc) en assembleur,le déclarer extern dans le c.
    Faire attention aux passages de paramètres , c'est un standard call.
    Le linker fait le reste.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* Jean Bernard Emond X86 2003  page 334 */
    /* Il a utilisé le Visual C++ */
     
    #include <stdio.h>
     
    void main(void){
    int x = 50;
     
    _asm {
    MOV EAX, x
    SHL  EAX, 1
    }
     
    printf("x = %d\n", x);
    }

    Compilé en C++ éca marche donc pas du C.

    On passe à aut chose.
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

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

Discussions similaires

  1. Intégrer un code assembleur dans un programme
    Par laracroft87 dans le forum C
    Réponses: 5
    Dernier message: 27/04/2008, 18h15
  2. Réponses: 4
    Dernier message: 22/04/2007, 08h31
  3. introduire du code assembleur dans un programme C++
    Par hzaki1986 dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2007, 17h14
  4. Problème d'inclusion de code Assembleur dans du C
    Par tnarol dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 06/09/2006, 18h56
  5. Réponses: 5
    Dernier message: 14/01/2006, 15h16

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