Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
:: Boîte à outils :: Tutoriels
Page 1 sur 1 • Partager •
Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Tutoriel réalisé par Faiseur
Niveau: [ Intermédiaire ]
Dans cet exemple nous allons nous servir de la librairie « msvcrt » pour illustrer la polyvalence possible, en assembleur, avec des fonctions C/C++. Cette librairie est fournie dans les kits de développement C/C++.
Une partie des fonctions de « msvcrt » sont redondantes avec les librairies fournies par les assembleurs courants, mais pas toutes. De plus, certaines fonctions s’avèrent pratiques.
Pour intégrer les fonctions de cette librairie avec un assembleur, dans notre exemple Masm, il est nécessaire de créer des définitions de prototypes pour chaque fonction appelée dans cette librairie. Dit autrement: Masm ne sait pas quoi faire lorsque nous utilisons telle ou telle fonction de cette librairie, il est nécessaire de lui expliquer comment il doit procéder pour appeler ces fonctions afin de les inclure dans notre programme compilé.
Avec Masm32 les définitions correspondent aux fichiers « .inc ». Le fichier "*.inc" est nécessaire pour la fonction "invoke", mais on peut s'en passer, par contre il permet et c'est cela qui est important, d'inclure correctement la bibliothèque lors de l'édition des liens (LINK).
L'adaptation de cette librairie pour Masm a déjà été faite par des utilisateurs, ce qui rend disponible la quasi-totalité des fonctions de cette librairie. Dans l’exemple joint à ce tutoriel vous trouverez les fichiers « msvcrt.lib » et « msvcrt.inc », qui vous permettrons de vous servir de cette librairie dans vos programmes Masm.
A noter que si vous souhaitez utiliser les macros de Masm32 (le fichier « macros.asm ») vous aurez des erreurs lors de la compilation, simplement parce que certains noms utilisés par les macros sont identiques aux fonctions de cette librairie. Pas de panique, les macros en conflit ne sont pas essentielles et de plus elles ont une fonction identique à cette librairie. Si vous souhaitez vous servir des macros de Masm32 vous pouvez donc, au choix:
- Effacer individuellement les macros en conflit de la liste du fichier « macros.asm »
- Renommer les macros du fichier « macros.asm » qui posent problème afin de résoudre le conflit
Le résultat de ce travail préalable est le suivant: nous pouvons appeler les fonctions de cette librairie avec « invoke », sans plus de formalités !
Passons sans plus tarder au code source de notre exemple, qui est fournit dans la même archive.
Notez que chaque fonction de msvcrt étudiée dans ce tutoriel pointe sur son lien direct MSDN. N'hésitez pas à vous documenter plus avant sur cette précieuse source d'information !
Fichier .asm
- Code:
include MscvrtExemplebyF.inc
comment *
Exemple d'utilisation d'une librairie C/C++ avec Masm: asm+c dans un même projet
par Faiseur
*
.data
Listing db "Exemple simple d'utilisation de la librairie msvcrt.lib - librairie C/C++",13,10,13,10,\
" Fonctions C/C++ utilisées:",13,10,13,10,\
" < _strtime >",13,10,\
" < time >",13,10,\
" < srand >",13,10,\
" < _ltoa >",13,10,\
" < sprintf >",13,10,\
" < exit >",13,10,13,10,\
" - Heure locale: %s",13,10,13,10,\
" - Nombre aléatoire depuis l'heure locale: %s",13,10,13,10,\
" - Division par 100 de la valeur: %s",0
Message db "Résultat des fonctions msvcrt.lib - C/C++ library",0
.code
start:
invoke _strtime,addr szTime
invoke time,NULL
invoke srand,eax
invoke rand
push eax
invoke _ltoa,eax,addr szRandom,10
pop eax
invoke ldiv,eax,100 ; divisionde la valeur du random par 100
invoke _ltoa,eax,addr szRandomDiv,10
invoke sprintf,addr Result,addr Listing,addr szTime,addr szRandom,addr szRandomDiv
invoke MessageBox,0,addr Result,addr Message,0 ; on affiche le tout
invoke exit
end start
La taille de l’exécutable généré par notre exemple reste ridicule, environ 2ko pour utiliser les 4 fonctions de la librairie.
Analyse du code
- Code:
invoke _strtime,addr szTime
Exemple d'utilisation de la fonction _strtime, qui permet de récupérer la date de l'heure locale. Le résultat est placé dans szTime directement comme chaîne de caractère en format heure/minute/sec.
- Code:
invoke time,NULL
time récupère l’heure locale mais nous allons nous servir de sa valeur de retour.
MSDN nous dit:
Return the time as seconds elapsed since midnight, January 1, 1970. There is no error return.
Autrement dit, cette valeur ne sera jamais une seule fois identique ! C'est un bon choix pour générer un nombre aléatoire. Nous allons nous servir de ce résultat toujours changeant avec srand.
- Code:
invoke srand,eax
srand permet de fixer un résultat aléatoire sur la fonction rand. Si nous ne faisions pas cela la valeur serait toujours identique avec le random. Comme la valeur placée avec srand est toujours différente (grâce à la valeur de retour de "time") nous sommes sûrs de générer un nombre toujours aléatoire.
- Code:
invoke rand
rand génère le nombre aléatoire.
- Code:
push eax
invoke _ltoa,eax,addr szRandom,10
_ltoa permet de convertir un entier en chaîne de caractère. Il est possible de choisir la base de conversion, ici base 10. Nous convertissons donc le résultat pour être affiché plus tard (note: il serait possible d'éviter d'utiliser cette fonction mais nous souhaitons démontrer ici certaines fonctions de la librairie msvcrt).
- Code:
pop eax
invoke ldiv,eax,100
ldiv permet de diviser une valeur (numérateur) par son dénominateur. Ici nous divisons par 100.
La suite se passe de commentaire particulier. Nous convertissons la valeur divisée par 100 en chaîne de caractère puis nous affichons toutes les chaînes en les envoyant comme paramètres de la fonction sprintf, qui s'utilise de manière similaire à l'API wsprintf:
- Code:
invoke _ltoa,eax,addr szRandomDiv,10
invoke sprintf,addr Result,addr Listing,addr szTime,addr szRandom,addr szRandomDiv
Nous affichons le résultat avec une MessageBox et nous quittons le programme avec une autre fonction de msvcrt.lib: exit.
- Code:
invoke MessageBox,0,addr Result,addr Message,0 ; on affiche le tout
invoke exit
Simple non ?

Téléchargement de la source avec son exécutable:
- Fichiers joints
Dernière édition par faiseur le Mar 15 Juin - 12:50, édité 6 fois

faiseur- Admin
- Messages: 371
Date d'inscription: 02/05/2010

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Uper intéressant et bien fait, cela va m'ouvrir d'autres portes. Juste un commentaire, le fichier "*.inc" est nécessaire pour la macro "INVOKE", mais on peut s'en passer, par contre il permet et c'est cela qui est important, d'inclure correctement la bibliothèque lors de l'édition des liens (LINK).
Quand on regarde le SDK, il y a de plus en plus de fonction appelées à l'aide des classe C++ (spaghetti++). Pourrais-tu nous faire un tops là dessus (celui-là je le comprendrai, il sera en Français). Idem pou les interfaces COM.
Merci Professeur.

Quand on regarde le SDK, il y a de plus en plus de fonction appelées à l'aide des classe C++ (spaghetti++). Pourrais-tu nous faire un tops là dessus (celui-là je le comprendrai, il sera en Français). Idem pou les interfaces COM.
Merci Professeur.

Grincheux- Messages: 247
Date d'inscription: 17/05/2010
Age: 52
Localisation: Mathenay (39), France

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
le fichier "*.inc" est nécessaire pour la macro "INVOKE", mais on peut s'en passer, par contre il permet et c'est cela qui est important, d'inclure correctement la bibliothèque lors de l'édition des liens (LINK).
J'ajoute cette précision dans le tutoriel, merci !
Une précision à mon tour: invoke n'est pas une macro, il s'agit d'une fonction incluse dans Masm (tout comme "if-endif" et d'autres fonctions de haut niveau).

faiseur- Admin
- Messages: 371
Date d'inscription: 02/05/2010

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Ok, mais je n'aime pas INVOKE quand même, car ce n'est pas assez pratique. Il n'utilise que EAX pour les PUSHes et si on utilise déjà EAX dans les paramètres... Je ne vais ouvrir le débat sur INVOKE, je l'ai déjà fait sur un autre forum, mais je pense qu'il serait temps d'ouvrir quelque chose à propos de l'optimisation. Rien qu'avec INVOKE, il y a de quoi écrire.
Par exemple, quand INVOKE se trouve juste avant une instruction de saut, je préfère SIMULER cette pseudo-macro-instruction.
Vivement un thème sur l'optimisation, on pourrait aussi parler des instructions "PAIRABLES"...
Je te laisse, je suis sur l'analyse de mon IDE, et je réfléchis sur une fonction de copie de fichier assez balaise et j'ai du mal à m'en sortir.
A+
Par exemple, quand INVOKE se trouve juste avant une instruction de saut, je préfère SIMULER cette pseudo-macro-instruction.
Vivement un thème sur l'optimisation, on pourrait aussi parler des instructions "PAIRABLES"...
Je te laisse, je suis sur l'analyse de mon IDE, et je réfléchis sur une fonction de copie de fichier assez balaise et j'ai du mal à m'en sortir.
A+

Grincheux- Messages: 247
Date d'inscription: 17/05/2010
Age: 52
Localisation: Mathenay (39), France

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Petite modification sur le tutoriel et l'exécutable qui va avec: j'ai remplacé l'API wsprintf par la fonction sprintf, qui fait le même travail mais il s'agit d'une autre fonction de msvcrt. A présent il n'y a que des fonctions de cette librairie utilisées dans l'exemple, c'est plus logique.

faiseur- Admin
- Messages: 371
Date d'inscription: 02/05/2010

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Je dois installer mysql et ai besoin de fabriquer les fichiers "*.lib", je pensais que le tuto le permettait. Pourrais-tu me dire comment arriver à mes fins et quels sont les outils à utiliser et où les trouver. C'est tout,
Merci et Bonne soirée.
Merci et Bonne soirée.

Grincheux- Messages: 247
Date d'inscription: 17/05/2010
Age: 52
Localisation: Mathenay (39), France

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet
Grincheux a écrit:Je dois installer mysql et ai besoin de fabriquer les fichiers "*.lib", je pensais que le tuto le permettait. Pourrais-tu me dire comment arriver à mes fins et quels sont les outils à utiliser et où les trouver. C'est tout,
Merci et Bonne soirée.
Bonjour Grincheux.
Malheureusement je n'ai pas travaillé sur les bases mysql. Si seulement nous avions plus de personnes pour te répondre :/
Edit: s'il s'agit de créer des fichiers ".lib" à partir de dll, ou encore de créer des fichiers include à partir de dlls, ou une staticlib à partir de définitions, Vortex a créé différents outils sur ce sujet. J'en profite pour les répertorier, on ne sait jamais:
http://vortex.masmcode.com/
ou encore ici:
http://www.manoscoder.gr/phpBB3/viewforum.php?f=11
Le plus intéressant était son tool dll2lib pour créer un fichier .lib à parti d'une dll. ll semble qu'il ait abandonné ce projet car PelleC a créé un utilitaire plus performant avec Polib.
J'ai testé Polib. Une commande qui fonctionne pour créer une librairie à partir d'une dll est par exemple:
\masm32\bin\polib /OUT:gdi32.lib \windows\system32\gdi32.dll
A noter que le résultat n'est pas forcément compatible avec le linker de Masm mais il est compatible avec polink.
_________________
Site perso: http://www.faiseur.net/

faiseur- Admin
- Messages: 371
Date d'inscription: 02/05/2010

Sujets similaires» [PROJET GEANT] La map de Minefield en telechargement libre
» Astuces Vidéos : Se mettre en amie, s'ajouter des commentaires et voter pour soi-même.
» Utilisation de cet espace.
» [A LIRE]Conditions d'utilisation du forum
» Exemple de Biographie
» Astuces Vidéos : Se mettre en amie, s'ajouter des commentaires et voter pour soi-même.
» Utilisation de cet espace.
» [A LIRE]Conditions d'utilisation du forum
» Exemple de Biographie
:: Boîte à outils :: Tutoriels
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum





