begin process at 2010 02 10 16:40:55
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > LIAISON D'UN MODULE .OBJ ASM À UN EXE C++

LIAISON D'UN MODULE .OBJ ASM À UN EXE C++


 Description

Cliquez pour voir la capture en taille normale
Ceci montre, après création d'un module objet avec MASM, comment le lier à son projet c++.
il faut respecter plusieurs choses tels que l'option de respet de la casse, la décoration des noms exportés PUBLIC, la récupération des params sur la pile, le modèle mémoire ect...
J'ai fait une procédure qui ne fait que récupérer 2 pointeur, un dword et un byte, puis les incrémentes. On l'appelle depuis le code c++ en ayant pris soin de la déclarer extern "C". Voir le code asm de la procédure et le main c++, pour les détails.
Je pense que ça peut etre utile car je m'en suis servi pour créer un proc de tri à bulles qui me parait beaucoup plus efficace comme ceci.
Plusieurs autres utilités peuvent être trouvés à cette liaison de module obj.  



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Test_ASM
    •   Debug
      • Test_ASM.exe$Télécharger ce fichier [Réservé aux membres club]106 496 octets
    •   module_ASM
    • MainModule.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 096 octets
    • Test_ASM.ncbTélécharger ce fichier [Réservé aux membres club]347 136 octets
    • Test_ASM.slnTélécharger ce fichier [Réservé aux membres club]Voir ce fichier916 octets
    • Test_ASM.suoTélécharger ce fichier [Réservé aux membres club]8 704 octets
    • Test_ASM.vcprojTélécharger ce fichier [Réservé aux membres club]3 094 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture [C++/WIN32] RECHERCHE DE FUITES DE MEMOIRE
Source avec Zip Source avec une capture PIECHART SUR DIALOG SANS RESSOURCE
Source avec Zip Source avec une capture [C++/WIN32] TYPEDEF_VIEWER (CONTROLES ETENDUS)
Source avec Zip EFFET GRAPHIQUE DIRECTDRAW
Source avec Zip Source avec une capture [C++/WIN32] COMPRESSEUR/DECOMPRESSEUR LZW

 Sources de la même categorie

SMART POINTEUR À COMPTEUR DE RÉFÉRENCE par nirgal76
POINTEUR INTELLIGENT par snpier wolf
ALIGNER TEXTE CONSOLE par CptPingu
QWERTY - AZERTY AVEC SDL, UNE ALTERNATIVE par Scheb
Source avec Zip Source avec une capture INSERER UNE ANIMATION FLASH (WIN32-DEVCPP) par gagah1

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture COMPILATEUR DE PSEUDO PASCAL par CptPingu
Source avec Zip Source avec une capture IPSIM, UN SIMULATEUR DE MINI-PENTIUM par Msgbox
Source avec Zip Source avec une capture [C/WIN32] AFFICHE TOUT LES LIENS D'UNE PAGE (X)HTML. par deck_bsd
Source avec Zip Source avec une capture INJECTION DE DLL DANS N'IMPORTE QUEL PROCESS par krust
Source avec une capture DESSINATEUR DE FRACTALES par jourgun

Commentaires et avis

Commentaire de BruNews le 03/10/2006 18:03:27 administrateur CS

MASM est partie intégrante de VC++, inutile d'aller faire un obj au dehors et de l'importer ensuite.
Dans VC++, 'Add new Item' et tu mets extension asm sur fichier de code, le tour est joué.

Commentaire de BruNews le 03/10/2006 18:31:04 administrateur CS

OUBLI de précise:
ensuite clic doit propriété sur fichier asm:
sur General, régler sur "Custom Build Tool"
Faire Appliquer pour que le menu s'adapte;
Pour finir, onglet 'Custom Build Step':
Command line: ml.exe -c -coff -Cx -Fo$(IntDir)\$(InputName).obj $(InputName).asm
Outputs: $(IntDir)\$(InputName).obj

Pour 64 bits:
Command line: ml64.exe -c -Cx /nologo -Fo$(IntDir)\$(InputName).obj $(InputName).asm
Outputs: $(IntDir)\$(InputName).obj

Commentaire de BruNews le 03/10/2006 19:08:16 administrateur CS

Je mets aussi le code, autant épuiser le sujet, pourra toujours servir.
J'exporte en stdcall comme pour toute API, prob de décoration de nom disparait.

Dans cpp, c ou h:
#ifdef __cplusplus
extern "C" {
#endif
// FONCTIONS EXTERN ICI

void __stdcall procEXTN(unsigned int* pVal1, unsigned char* pVal2);


#ifdef __cplusplus
}
#endif

Fichier ASM, gaffe que je vire la stackframe inutile, autant gagner le maximum de cycles.
.686
.MODEL FLAT, stdcall
option prologue:none
option epilogue:none

PUBLIC procEXTN

.CODE

procEXTN PROC ptr_dwVal:DWORD,ptr_bVal:DWORD
  mov   eax, [esp+4]      ; recup val1
  inc   dword ptr[eax]    ; ajoute 1 (déréférence dword)
  mov   eax, [esp+8]      ; recup val2
  inc   byte ptr[eax]     ; ajoute 1 (déréférence byte)
  ret   8
procEXTN ENDP

END

Commentaire de yann_lo_san le 03/10/2006 20:51:47

Tiens, je ne connaissais pas du tout cela, je pensais que seul l'asm inline était possible ! Les directives MASM et déclarations en tout genres sont elles dispo aussi ?
Et peut être que d'autres compilateurs c++ ne prennent pas MASM 'embeded'.
En tout cas, merci pour le ret 8 et virer ebp, c'est plus propre.
Par contre si tu déclare les 2 params dans la proc asm, pourquoi ne pas utiliser leurs noms directement [esp+4], ce n'est pas possible ?
Moi je découvre MASM, et c'est vraiment super, comme quoi microsoft c'est pas mal quant même !

Commentaire de BruNews le 03/10/2006 21:08:06 administrateur CS

MASM c'est ml et link, la partie finale de VS après que le compilo aura traduit et optimisé le C/C++ en asm. Le package MASM32 a été fait ainsi, extraction des composants d'un compilo MS (celui du DDK win98 si je me souviens bien).
Il est donc tout à fait normal qu'on puisse direct fournir le code en asm, que soit fourni par le compilo ou par le developpeur ne change rien.
Dans un fichier ASM, aucune restriction de syntaxe ASM, on peut tout y faire (JMP direct au MILIEU d'une fonction, etc...), aucune limite.

Commentaire de yann_lo_san le 03/10/2006 21:15:54

Dommage qu'il n'y ai pas de coloration syntaxique dans l'éditeur ! J'utilise TextPad et ça rend le code asm moins austère, ceci dit, c'est un détail, car je faisait pointer textPad sur MASM, je peut aussi le faire pointer sur n'importe quel exe.
Merci de tes commentaires très instructifs.

Commentaire de BruNews le 03/10/2006 21:16:31 administrateur CS

ah oui encore un oubli:
Employer un "nom" de param n'a pas de sens en ASM, ces noms ne servent qu'à indiquer la finale du nom d'export (ici "@8" car 8 octets de param PUSHes par appelant).
Cet emploi de nom peut se faire car ml inclut un analyseur (jeu de macros) qui remplacera par un offset ESP ces noms. C'est le genre d'hérésie de code qu'on trouve fréquemment sur asmfr, le code obtenu fait pitié en rapport à ce que produirait VC++ 2005 avec un listing C correct. Il ne faut absolument pas s'habituer à cela, manipuler les registres sera nettement supérieur.

Commentaire de yann_lo_san le 03/10/2006 21:55:26

J'ai essayé d'utiliser le nom des params a la place de [esp+...],
par exemple mov eax, ptr_dwVal, cç amarche et pour moi c'est un peu plus lisible mais factuel.
c'est le principe du PROTO, INVOKE, USES et ADDR avec masm qui permettent un codage très proche du C pour les procédures.
C'est un fait que masm, cl, link32 sont gratuits mais pas VisualStudio, donc beaucoup de travail en plus pour simplifier certaines choses quant on a que la ligne de commande !

Commentaire de Gerald le 10/10/2006 10:36:38

idem, j'avais fait dans le temps un petit tut avec NASM:
http://sheeps.free.fr/main.php?page=asmfunc
bonne continuation

Commentaire de Arnaud16022 le 10/10/2006 12:50:55

Idem que Gerald mais j'ai pas pu être posté,on nous a hacké notre forum ...
Maintenant plus intéressant, appeller une fonction implémentée dans le code C++ à partir de l'assembleur ^^
Je suis en train de créer un langage de "script" basé sur le principe ...
Bonne continuation
(PS : dans l'exemple que tu as donné, a savoir le tri par bulles, il est effectivement mieux de le mettre direct dans le code C++ avec __asm{} )

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

pb avec procedure [ par bidules ] bonjour,voila mon code(simplifier) :void affiche(int numero){cout << "Le numero est le : "<<numero<<endl;}void main(){affiche(10);}e probleme de link !!! [ par NeeKotine ] Salut !je cherche a me connecter à une base MySQL via un petit programme en c dont voici le source :# include <stdio.h>#if defined(_WIN32) || d Error executing link.exe. [ par Kinamstrong ] Linking...com.obj : error LNK2001: unresolved external symbol _recvfrom@24com.obj : error LNK2001: unresolved external symbol _bind@12com.obj : error probleme de compilation !! [ par Darkneon ] Voila, j'ai passe de Borland C++ a VC++ et j'ai un petit(?) probleme.Lorsque je veux cree un .exe, ca me dit:Linking...LINK : fatal error LNK1104: can LINK : fatal error LNK1104: cannot open file "msvcrtd.lib" [ par TagadaTsoin ] j'ai un pb avec visual c++ 6je créée un projet mfc appwizard, basé sur des boites de dialogues, je ne rajoute RIEN aux sources générées, je compile et liste chainée et lecture d'un fichier txt [ par whiteknight ] Bonjour j'ai un probleme pour charger des données depuis un fichier texte, les données recupérées doivent etre stocké dans un liste chainée déclaré ai c++ : pb avec une fonction extern C [ par nanch07 ] J'expose tout, voilà: dans une de mes classes je fais appel à une fonction externe en C ( de numerical recipes in C). Mais j'ai également besoin de ce Debugage assembleur [ par crocejf2000 ] Salut,Qq'un pourrai il peut etre m'aider, j'ai une méchante érreur et jmy connais pas trop en assembleur, Borland c++ 5 me renvoi ceci : Il s'arrete a mettre de l'assembleur en ligne sous Visual C++ [ par alain34270 ] alainBonjour,Voilà. J'ai un problème avec mon disque dur. je voudrais lire les secteurs physiques de mon disque dur, si possible à partir de visual C+ Problème avec un strcat [ par kalf2000 ] salut, g un blem, le code suivant me génère une erreur au dernier strcat. file est censé être egal a 87248364_48.bmpcomprend pas pourkoiCString ext; c


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales