Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Voir le sujet précédent Voir le sujet suivant Aller en bas

Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  faiseur le Lun 24 Mai - 20:15



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
MscvrtExemple_Faiseur.zip Vous n'avez pas la permission de télécharger les fichiers joints.(30 Ko) Téléchargé 17 fois


Dernière édition par faiseur le Mar 15 Juin - 12:50, édité 6 fois

faiseur
Admin

Messages: 371
Date d'inscription: 02/05/2010

Voir le profil de l'utilisateur http://www.asmforum.net

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  Grincheux le Sam 29 Mai - 13:48

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. sunny sunny

Grincheux

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

Voir le profil de l'utilisateur http://phrio.biz

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  faiseur le Sam 29 Mai - 16:30

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 ! Wink

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

Voir le profil de l'utilisateur http://www.asmforum.net

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  Grincheux le Sam 29 Mai - 17:13

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+

Grincheux

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

Voir le profil de l'utilisateur http://phrio.biz

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  faiseur le Mer 2 Juin - 18:28

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

Voir le profil de l'utilisateur http://www.asmforum.net

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  Grincheux le Dim 8 Mai - 21:58

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.

Grincheux

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

Voir le profil de l'utilisateur http://phrio.biz

Revenir en haut Aller en bas

Re: Exemple d'utilisation de libraries C/C++ en assembleur: Masm et C/C++ dans un même projet

Message  faiseur le Lun 9 Mai - 12:59

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

Voir le profil de l'utilisateur http://www.asmforum.net

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum