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 :

Problème d'inclusion de code Assembleur dans du C


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut Problème d'inclusion de code Assembleur dans du C
    Salut,

    J'ai besoin d'être sûr qu'un bout de code C que j'utilise soit compilé d'une certaine façon, notamment je veux éviter certaines optimisations.
    Mon idée est d'incorporer un code compilé comme je veux dans un bloc "asm" de mon code C. J'ai récupéré le code assembleur de ma fonction mais je ne sais pas comment le présenter pour obtenir l'équivalent de ma fonction. La simple recopie des instructions dans le bloc asm m'a fait des erreurs car il ne connait pas les identifiants des variables que j'utilise.

    Voici ma fonction de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned int MyFunction(UINT16 * ptr)
    {
    	DWORD* p_ADDR = (DWORD*)(ptr);
    	pXPCMessageBoxType pMsgBox = (pXPCMessageBoxType)(*p_ADDR);
    	return pMsgBox->header.readCursor;
    }
    Voici le code assemblé :

    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
     
     
    PUBLIC	_MyFunction
    ; Function compile flags: /Odtpy
    _TEXT	SEGMENT
    _p_ADDR$ = -8						; size = 4
    _pMsgBox$ = -4						; size = 4
    _ptr$ = 8						; size = 4
    _MyFunction PROC
     
    ; 286  : {
     
      00c70	55		 push	 ebp
      00c71	8b ec		 mov	 ebp, esp
      00c73	83 ec 08	 sub	 esp, 8
     
    ; 287  : 	DWORD* p_ADDR = (DWORD*)(ptr);
     
      00c76	8b 45 08	 mov	 eax, DWORD PTR _ptr$[ebp]
      00c79	89 45 f8	 mov	 DWORD PTR _p_ADDR$[ebp], eax
     
    ; 288  : 	pMessageBoxType pMsgBox = (pMessageBoxType)(*p_ADDR);
     
      00c7c	8b 4d f8	 mov	 ecx, DWORD PTR _p_ADDR$[ebp]
      00c7f	8b 11		 mov	 edx, DWORD PTR [ecx]
      00c81	89 55 fc	 mov	 DWORD PTR _pMsgBox$[ebp], edx
     
    ; 289  : 	return pMsgBox->header.readCursor;
     
      00c84	8b 45 fc	 mov	 eax, DWORD PTR _pMsgBox$[ebp]
      00c87	8b 00		 mov	 eax, DWORD PTR [eax]
     
    ; 290  : }
     
      00c89	8b e5		 mov	 esp, ebp
      00c8b	5d		 pop	 ebp
      00c8c	c3		 ret	 0
    _MyFunction ENDP
    _TEXT	ENDS

  2. #2
    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
    Le code assembleur généré correspond à ce que tu veux ?
    Si c'est le cas, pas besoin d'insérer du code asm dans ton code C, tu gardes ta fonction, mais tu la mets en inline.
    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

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par progfou
    Le code assembleur généré correspond à ce que tu veux ?
    Si c'est le cas, pas besoin d'insérer du code asm dans ton code C, tu gardes ta fonction, mais tu la mets en inline.
    Non,
    En fait le code assembleur que je veux correspond à la compilation de la fonction en mode "debug" de Visual Studio. En mode "release" il fait des optimisations qui changent complètement le code assembleur généré...ce que je veux éviter en forçant, juste pour cette partie, la façon d'écrire la fonction en assembleur.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    La manière d'intégrer du code assembleur dépend du compilateur. Les noms de symboles doivent parfois être préfixés par exemple.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Blustuff
    La manière d'intégrer du code assembleur dépend du compilateur. Les noms de symboles doivent parfois être préfixés par exemple.
    OK mais là on pourrait s'attendre à ce que visual studio soit capable de relire du code assembleu qu'il a lui même écrit si je le mets à l'intérieur d'un bloc asm {...}.

    Mon problème c'est que je ne sais pas exactement quoi prendre parmi tout le charabia que j'ai recopié plus haut...je me doute qu'il faut retirer les numéros en début de ligne mais je ne sais pas trop quoi faire des lignes autres que les instructions push/pop/mov/sub/add/jae...et les lignes commentées. Par exemple je ne sais pas si la ligne suivante est valide :

    _pMsgBox$ = -4 ; size = 4

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    1. supprimer les "opcodes" (codes hexa à gauche des instructions).

    2. redéfinir les constantes assembleur en constantes C (#define _pMsgBox$ (-4) par ex).

    Et voilà !
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

Discussions similaires

  1. Inclusion de Code Adsense dans un fichier
    Par badrel dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2009, 11h31
  2. Intégrer un code assembleur dans un programme
    Par laracroft87 dans le forum C
    Réponses: 5
    Dernier message: 27/04/2008, 18h15
  3. Réponses: 4
    Dernier message: 22/04/2007, 08h31
  4. introduire du code assembleur dans un programme C++
    Par hzaki1986 dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2007, 17h14
  5. probleme d'insertion de code assembleur dans du c++
    Par Pragmateek dans le forum C++
    Réponses: 4
    Dernier message: 05/03/2006, 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