Rôle des différents programmes:
Compilateur (ml,hjwasm ..) traduit le source en code machine(binaire) et regroupe les segments
cvtres et rc transforme le fichier ressource .rc en binaire
Linker (link.exe) lie tous les modules précédemment créés + librairies +
programme loader (programme chargement windows) + petits secrets windows
Windows 10 ouvrir
une fenêtre DOS: Dans l'explorateur de fichiers,appuyer sur SHIFT (La flèche
au dessus de ctrl gauche)
Faire un clic droit sur le répertoire,on doit voir "Ouvrir une fenêtre de
commande içi"
Se placer en \masm32\bin ou SET PATH=\MASM32\BIN
taper ML
usage: ML [ options ] liste de fichiers [ /link linkoptions]
Run "ML /help" or "ML /?" for more info
Les options,sont a placer juste après ML,viennent ensuite les fichiers .asm et ensuite les options pour link
Les options pour link sont rarement utilisés avec MASM32
Faites de même pour LINK,CVTRES,RC,CL etc
LINK [options] [files] [@commandfile]
rc [options] .RC input file
CVTRES [options] ResFile (Nom.res créé par rc)
cl [ option... ] filename... [ /link linkoption... ]
En règle générale ,on place les options juste derrière le nom du prog et ensuite les noms de fichiers.Midl , ne le précise pas mais il obéit a cette règle
certaines portent le même nom que l'éxécutable.La commande SET permet de modifier ou de consulter la valeur des variables.La page mémoire ou sont elles sont écrites est accessible par le DOS ou par windows.Chaque programme éxécuté hérite de l'environnement système (ou du programme appelant).
Général
PATH,précise le chemin de recherche pour tous les fichiers éxécutables
SET PATH=C:\MASM32\BIN
ML.EXE
ML,fixe les options par défaut de l'assembleur masm32
SET ML=/c /coff
INCLUDE,précise le chemin de recherche des fichiers inclus
SET INCLUDE=C:\MASM32\INCLUDE
TMP,pécise l'emplacement ou mettre les fichiers temporaires,déja présent dans le système
LINK.EXE
LINK,fixe les options a éxécuter en premier
SET LINK=/SUBSYSTEM:WINDOWS
LIB,précise ou trouver les librairies .LIB
SET LIB=C:\MASM32\LIB
On peut aussi utiliser une variable d'environnement générique pour désigner le programme à compiler.
SET PROG=pilote
l'intérêt est que le nom du programme est répété N fois et que l'on peut ainsi réutiliser le batch pour n'importe quel programme en changeant simplement pilote.On insère %PROG% à la place de pilote et le tour est joué.
Muni de ces quelques renseignements , on peut déja créer un batch qui compilera tous les éxécutables , n'importe ou sur le disque.
@echo off
SET PATH=C:\MASM32\BIN
SET ML=/c /coff
SET LINK=/SUBSYSTEM:WINDOWS
SET LIB=C:\MASM32\LIB
SET PROG=pilote
rc %PROG%.rc
cvtres /MACHINE:IX86 /OUT:%PROG%.bin %PROG%.res
ml %PROG%.asm
Link %PROG%.obj %PROG%.bin
pause
On peut demander a ml de produire:
un listing,des informations de debuggage,de faire une simple vérification du code
On peut demander à link de produire des consoles (/SUBSYSTEM:),des dll,des drivers...,des informations de debuggage
On peut modifier l'envirronement du systeme,ce qui n'est pas recommandé.Dans XP ,panneau de config ---> systeme -->avancé ---> bouton variables d'envirronement
Un programme s'éxécutant sous windows ou sous dos (console) bénéficie des mêmes variables d'environnement.
Link accepte un fichier .res en argument,c'est lui qui appelle alors cvtres.
Lorsque plusieurs chemins de recherche sont nécessaires,séparés les par des points virgules.
SET LIB=C:\MASM32\LIB;%SDK%.LIB
Pour gagner du temps,on peut souhaiter ne pas compiler certains fichiers déja compiler (exemple ressource)
IF EXIST NOMFICHIER goto etiquette
:etiquette
ou IF NOT EXIST
Pour produire une liste des variables d'environnements , dans une fenêtre dos :
SET > ENVIRON.TXT
CAS PARTICULIERS
Vous demandez un espace pile plus important que la normale (voir la pile et le proc) :
Sous windows l'option de ml est inopérente pour régler ce problème.Seul link /STACK est opérante
C'est le cas du tut35 d'iczelion,dans les options de ml,non cités,il faut distinguer celles fonctionnant sous dos et les autres.
On peut intégrer du code asm à un batch et compiler le batch:
;@echo off
;goto batir
.486
.model flat, stdcall
option casemap :none
;---------------- suite du code --------------
:batir
set farce=unicode
\masm32\bin\ml /nologo /c /coff %farce%.bat
\masm32\bin\link /nologo /subsystem:console /out:pinup.exe %farce%.obj
del %farce%.obj
pause
On peut se dispenser de rajouter,includelib \masm32\lib\user32.lib ,dans le source ,il faut alors:
link /DEFAULTLIB:user32.lib /DEFAULTLIB:kernel32 %PROG%.obj %PROG%.bin
Cette technique permet de compiler des programmes C avec le VCTOOLKIT
NMAKE
Si les makefile vous cause des problèmes , transformer les en batch:Prétez attention a la ligne vide insérée entre chaque commande
nmake /N > build.bat , vous perdrez alors uniquement (en principe) les variables d'environnements
Exemples pilotes contient un bon , un mauvais makefile,la copie du makefile fonctionne
le zip contient aussi les batchs cités plus haut,et nettement moins contraignant que makefile
Variables d'environnements
PATH=C:\Program
Files\Microsoft Visual C++ Toolkit 2003\bin
INCLUDE=C:\Program
Files\Microsoft Visual C++ Toolkit 2003\include;+SDK include path
LIB=C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;+ SDK lib path
CL=/Od /FAs /ZI /Zi
;sont prises en premier avant toutes les options de la ligne de commande
;produire un asm /Od /FAs informations de debuggage /ZI /Zi
;------ les librairies ajoutées par Visual studio
------------------------------------------------------------------------
LIBVISUALSTUDIO=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
;------ /link est optionnel
;command line parameters , on peut omettre de rajouter hello.obj dans l'option
de link
cl /EHsc hello.cpp /link libcpd.lib libcd.lib hello.res
comments
/EHsc est utilisée avec
cout
<<"evalua "<<a ;
getch();
dans votre code.
La plupart des exemples vc++ peuvent être compilé dans cet Environnement et avec
la ligne de commande suivante
cl one.cpp two.c etc.cpp %LIBVISUALSTUDIO%
Si vous essayez de compiler les exemples du SDK avec le VCTOOLKIT , vous obtiendrez un message d'erreur de link vous indiquant que UneTelle.lib cannot be found.La raison en est que vous n'avez pas acheté la dernière version du VC++.Est ce incontournable ?.Pas du tout,utiliser une des méthodes ci-dessus
Beaucoup d'exemples du SDK nouveau étaient déja présents dans l'ancien.Microsoft multiplie les options de compilations, surtout si elles sont utiles commercialement.
Une méthode de compilation un peu passe partout est alors très utile,ML et CL fonctionnant de manère très similaire,nous aide a la trouver.
****** Les deux admettent les mêmes variables d'environnements (CL diffère de ML ,c'est tout)
****** Les deux peuvent passer des arguments a link et le lancer
****** Les deux admettent l'inclusion de fichiers de définitions et de noms de librairies dans le source
Pour compiler un source masm à la manière d'un source C++
SET PATH=C:\MASM32\BIN
SET INCLUDE=C:\MASM32\INCLUDE
SET ML=/coff /nologo ;suprimer /c (Assemble without linking)
SET LINK=/SUBSYSTEM:WINDOWS /NOLOGO
SET LIB=C:\MASM32\LIB
SET MASMLIB=kernel32.lib user32.lib gdi32.lib comdlg32.lib perso32.lib masm32.lib dbghelp.lib advapi32.lib shell32.lib REM ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
rc minus.rc
ML minus.asm /link %MASMLIB% minus.res ;les deux seules lignes nécessaires
Cvtres peut être appelé par link.Les noms passés a ml sont transmis a link par le fichier objet.Si on rajoute minus.obj a la ligne cidessus,link envoie un warning(faute d'attention ignorée).
La méthode uilisée ci-dessus permet de suprimer les chemins complets et les librairies dans le source,exactement comme avec le C++
Un fichier de ressource est un fichier texte possédant l'extension .rc et est
écrit en C.
Son role est de contenir les "ressources" du prog.Par exemple un icone,une
image,des fichiers de tous types,des boites de dialogues prédéfinies,des chaînes
de caractêres.....
Son intérêt est de permettre le chargement de ces
"ressources" en même temps que le programme ce qui est plus rapide et évite
d'avoir a faire des accès disques pour charger les fichiers.Tous les fichiers
utilisés par le programme se trouvent a l'intérieur de l'éxécutable
exemple simple pour masm32
---------------------------------------------------------------------
#include <\MASM32\INCLUDE\RESOURCE.H>
500 ICON MOVEABLE PURE LOADONCALL
DISCARDABLE "MAINICON.ICO"
---------------------------------------------------------------------
Le
fichier ressource exemple contient un fichier de définitions de constantes
communs à tous les fichiers de ressources et un icone (mainicon.ico) dont le
fichier doit ce trouver dans le même répertoire que le projet.
---------------------------------------------------------
#define VS_FFI_FILEFLAGSMASK 0x0000003FL
---------------------------------------------------------
le nombre
commençant par 0x.... est hexadécimale.
Pour le compiler il faut deux
programmes.
rc ----> .res
cvtres
-------> .obj (binaire)
Le lieur (link) regroupe le code assembleur et le fichier de ressources compilé pour produire le programme éxécutable