Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 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és31Date d'inscriptiondimanche 15 juillet 2001StatutMembreDernière intervention 8 janvier 2009 10 oct. 2006 à 10:36
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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
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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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é.
10 oct. 2006 à 12:50
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{} )
10 oct. 2006 à 10:36
http://sheeps.free.fr/main.php?page=asmfunc
bonne continuation
3 oct. 2006 à 21:55
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 !
3 oct. 2006 à 21:16
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.
3 oct. 2006 à 21:15
Merci de tes commentaires très instructifs.
3 oct. 2006 à 21:08
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.
3 oct. 2006 à 20:51
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 !
3 oct. 2006 à 19:08
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
3 oct. 2006 à 18:31
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
3 oct. 2006 à 18:03
Dans VC++, 'Add new Item' et tu mets extension asm sur fichier de code, le tour est joué.