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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 3 oct. 2006 à 18:03
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 10 oct. 2006 à 12:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39787-liaison-d-un-module-obj-asm-a-un-exe-c

Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
10 oct. 2006 à 12:50
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{} )
cs_Gerald Messages postés 31 Date d'inscription dimanche 15 juillet 2001 Statut Membre Dernière intervention 8 janvier 2009
10 oct. 2006 à 10:36
idem, j'avais fait dans le temps un petit tut avec NASM:
http://sheeps.free.fr/main.php?page=asmfunc
bonne continuation
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
3 oct. 2006 à 21:55
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 !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2006 à 21:16
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.
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
3 oct. 2006 à 21:15
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.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2006 à 21:08
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.
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
3 oct. 2006 à 20:51
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 !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2006 à 19:08
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
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2006 à 18:31
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
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 oct. 2006 à 18:03
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é.
Rejoignez-nous