Les microprocesseurs ne comprennent que les chiffres.Pour
rendre leur utilisation possible,on affecte ces chiffres a des valeurs littérales
sous plusieurs formes.Constantes et structures forment le gros des définitions.Ces
définitions sont contenues dans des fichiers avec l'extension .h
Le c
et le c++ peuvent utiliser les quelques 87 Mo de définitions contenus
dans le SDK (la référence windows)
Il
faut Rajouter les définitons du ddk,directx,autres K et autres headers
(windbg ..).. Et on comprend qu'il est inutile de les traduire à
la main(c'est long,hasardeux, et ça vous promet des séances
de débuggage).
Pour masm,windows.inc a une taille de plus de 1 Mo
et est une option minimaliste,permettant de faire beaucoup de choses et aussi
de rendre les sources échangeables sans ré-exporter ces définitions.
Si on
veut un langage non limité dans ces applications , l'abondance de ces définitions
est un critère essentiel.La traduction n'est pas entièrement automatique,et
tout n'est pas traduisible.
Critère de choix d'un assembleur plutôt qu'un autre:
Avant d'adopter un assembleur plutôt qu'un autre,commencer
par regarder la taille des définitions qu'il vous propose et les moyens
qu'il vous donne pour les étendre.Un compilateur seul (parfois sans linker)
est insuffisant pour aborder windows,ou alors il vous faudra passer des
journées a traduire les définitions permettant d'utiliser les API ,COM et
autres fonctions fournis par windows.
La syntaxe est aussi un véritable
problème (nécessite documentations et exemples).MASM et TASM évite de se
faire concurrence sur ce terrain.
Traducteurs:
Ils sont fort peu nombreux,Aucun n'est parfait,et tous demandent des corrections manuelles et des contrôles.Des corrections mineures peuvent intervenir dans le windows sdk traduit,sans pour autant faire l'objet de communications détaillés.Masm n'admet pas les redéfinitions d'un même prototype,ajout d'un fichier de ressource..Toutes corrections n'ayant aucune incidence sur le code.
voir lisezmoi.doc
Télécharger le VC++ express permet d'utiliser la msvcrt.lib et la libcmt.lib avec le windows.sdk.Beaucoup (prudence) de fonctions C de ces librairies sont utilisables.Masm32 manifeste quelques incompatiblités avec ces librairies.Mettez les noms de protos de masm en commentaire et/ou réutiliser le code de la fonction renommée (dynamiquement) dans votre source.Les outils du vc++ (link,lib...) sont utilisables avec masm.
La msvcrt.lib et la libcmt.lib définissent un point d'entrée du code.Certains noms de fonctions sont incompatibles avec masm.
Guide des éventuelles corrections a faire:
Il
traduit les constantes,les structures, les enums , les Interfaces , les
prototypes.et les GUID du SDK,du winddk et de directx.
Il n'utilise aucun
typedef et uniquement les variables (byte,word,..) de masm
Utiliser
les interfaces existantes est aussi simple que d'utiliser une API.L'utilisation des interfaces rajoutent plusieurs
milliers de fonctions a celles utilisables par API.Leur documentation est
presque exclusivement dans le SDK.Avant de l'utiliser,vous devez créer une
liste de vos fichiers .h comme suit:
DIR /S/B *.h > header.txt remplacer
l'ancien fichier dans le répertoire créer au décompactage.
Créer un répertoire
masm32\SDK ,c'est tout,les menus sont en anglais et le
readme.txt aussi
Lisez le lisezmoi.txt avant de commencer,plusieurs traductions
successives sont demander pour arriver au bout de la phase d'aprentissage
avec "aprendre"
Ce qu'il faut faire:
Avec
editmasm,utilisez le menu "syntaxe"-->"SDK et header",tapez
le nom de la définition,lancez la recherche, visualisez la traduction
et/ou le header et copiez les définitions dans votre source.Cette manoeuvre,fort
rapide,suppose que vous avez utilisez le traducteur comme expliqué a la
page d'editmasm.
Si vous voulez utiliser l'interface IPicture,(celle
qui permet d'utiliser les .jpg et .gif)
Créer son pointeur en data,en
rajoutant ppv a son nom (ou copier son
nom depuis la macro)
ppvIPicture
dd 0
Rechercher le nom de l'interface dans l'aide du SDK,celui-ci
va vous dire que l'interface est défini dans
Header: Declared in ocidl.h
Traduire
ocidl.h après vous être assuré qu'un répertoire masm32\sdk existe (créer
le) et que la liste des headers files contenus dans header.txt pointe bien
sur le bon répertoire.Cela dépend de la version du SDK.Si besoin est,recréer
la en utilisant le DOS.Placez vous dans le répertoite Include du SDK et
tapez dir /S/B *.inc > header.txt.Placer le fichier dans le répertoire
translator (celui ci est créé au décompactage).
La documentation de l'interface
précise:
The function OleLoadPicture simplifies
the creation of a picture object based on stream contents.
et comme
il y a un exemple dans masm,C:\masm32\M32LIB\BitmapFromMemory.ASM,je m'en
suis inspiré pour produire un exemple inclus dans le paquet a télécharger.Voyez
aussi COM ASM
Insérer
la structure STIPicture et la macro
IPicture produite par le traducteur
dans les déclarations de votre source.Il ne reste plus qu'a utliser les
fonctions de l'interface en remplaçant invoke par le nom de l'interface
IPicture
get_Width,addr hmWidth
IPicture get_Height,addr hmHeight
Editmasm
vous fournit des fichiers .uui (dans ref\feuilles) contenant tous les GUID,CLSID,IID
dont vous avez besoin.Plus l'utilitaire uuidlib qui produit ces fichiers.Servez
vous de cherche pour retrouver celui qui vous intéresse.
Lorsque
le traducteur ne trouve pas la taille d'un argument:
-L'argument
est écrit dans la ligne précédé de inconnu:
-Le traducteur tente
sa chance en traduisant l'argument en DWORD (fonctionne dans 95% des
cas),vérifiez la taille de l'argument et si vous trouvez un QWORD ou
un REAL8 incrémentez la comethod
La plupart des prototypes des interfaces sont réduits a des comethod n'utilisant que des DWORD,comment cela est-il possible ?
actions de MASM lorsqu'on lui demande de pousser un byte ou un word en pile
MASM réduit toujours l'action à un DWORD en pile
invoke Parametre,petit ;avec ,petit BYTE et Parametre PROTO :BYTE
------- listing ----------
mov al, petit
push eax
call Parametre
;-----------------------------------------
invoke Parametre,moyen ;moyen word Parametre PROTO :WORD
------- listing ----------
sub esp, 002h ;word undefined
push moyen
call Parametre
;------------------------------------------------
invoke Parametre,moyen ;moyen word Parametre PROTO :DWORD
------- listing ----------
push 000h ;word NULL in stack
push moyen ;
call Parametre
;------------------------------------------------
invoke Parametre,petit ;petit byte Parametre PROTO :DWORD
------- listing ----------
push 000h ;word NULL in stack
mov al, petit ;translate byte in word
movzx ax, al
push ax ;=DWORD in stack or movzx eax,al follow by push eax
call Parametre
;----------------------------------------------------------------
Guide des éventuelles corrections a faire:
Internal error (message de ml):
La traduction n'y est pour rien,c'est un bug ml.Utiliser ml 6.15 pour obtenir le nom du fichier ou se produit l'erreur.Dans la page,rechercher les unions internes aux structures et rendez les externes.Ne faites pas confiance à la localisation ligne.
error LNK2001: unresolved external symbol
Vérifier que le symbole est utiliser par votre source.
S'il est utilisé,rechercher la librairie contenant la fonction.Editmasm->Syntaxe->Cherche API
Non utilisé,cela veut dire que des duplicatas du proto existent dans les inclus
Utiliser Editmasm->Syntaxe->Cherche pour repérer les doubles des prototypes dans tous les .sdk.
Mettez les protos en double en commentaires.
Il se peut aussi qu'un prototype ,de portée générale, entre en conflit avec un terme de portée locale comme les déclarations d'interfaces.Dans ce cas,rajouter 1 à la fin du nom de fonction dans la structure (ou table vecteur) de l'interface(s)
Erreur ml sur un record:
La traduction n'y est encore pour rien,dissocier le record de la structure en remplaçant 'NamedRecord <>' par 'tailleduRecord ?'.La taille du record pouvant être BYTE,WORD ou DWORD.Visualiser le point.h pour le voir et utiliser egales.txt (dans \masm32\ref\outils\translator\) pour avoir sa conversion.
Erreur de traduction:
Consulter le header .h pour corriger manuellement le problème.
Sources écrits avec windows.inc
Il est parfaitement faisable de passer de windows.inc a windows.sdk.Certains champs d'utilisation courante ont été modifiés pour rester compatibles avec windows.inc,mais pas tous.Corriger votre source,si la modification n'entraine pas d'erreurs de la part de ml.Si des définitions sont manquantes,consulter la documentation de la plateforme SDK pour savoir quels fichiers ajoutés.Vous n'avez aucun besoin des définitions de prototypes contenus dans masm32\include.Seul masm32.inc est utile.Certains noms sont incompatibles avec windows.sdk,mettez les en commentaires ou intégrer le source de la fonction (en changeant son nom) à votre source.
N'oublier pas que le bouton droit de la souris(editmasm) vous permet de visualiser les fichiers ou se sont produit des erreurs.
Incompatibilité de Nom avec Masm
Certains noms de fonctions sont incompatible avec masm.fabs en est un exemple.On peut comme le fait masm32,rebatir la librairie (certains sources sont fournis par le SDK,CRT..) au prix d'une incompatibilté de cette librairie avec les autres modules windows.La méthode la moins contraignante est d'utiliser un lien dynamique sur la fonction.L'avantage de la méthode est d'utiliser la librairie tel quel.
declare
Pcrt_fabs TYPEDEF PROTO C :QWORD
Fcrt_fabs TYPEDEF PTR
Pcrt_fabs
crt_fabs TEXTEQU <Fcrt_fabs ptr Acrt_fabs>
.data
s db "
-2309.12E-15",0
x QWORD -5.6798
y QWORD 0
;Main Main_DATA
<>
Hlibrairie dd 0
format db "fabs( %lf ) =
%lf",13,10,0
Acrt_fabs dd 0
.code
main PROC C
un:DWORD,deux:DWORD
invoke LoadLibrary,SADR("ntdll.dll")
mov
Hlibrairie,eax
invoke GetProcAddress,Hlibrairie,SADR("fabs")
mov
Acrt_fabs,eax
;------------------------------------------------------------------------------------
invoke
crt_fabs,x
fstp y
invoke printf,addr format,x,y
ret
Si vous trouver cette traduction utile et apporter des corrections aux fichiers,n'hésiter pas en m'en faire part,cela peut servir aux autres.
Sdk VISTA actuel et non pas la version beta
Quelques lignes doivent être ajoutées dans translate.inc pour que tout fonctionne normalement
Les contrôles sont les premières victimes de constantes mal définies
Adapté ces deux constantes a votre système en vous servant du sdkver.sdk et en vérifiant que vos contrôles sont visualisés normalement.Sinon,regardé la définition et les switchs qu'elle utilise.
Vc++ 2008 non pret à l'emploi,quelques corrections seront peut être nécessaires