BATIR un Source ASM

 

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"

Comment obtenir les options de commande sous DOS ?:

                

              Se placer en \masm32\bin   ou               SET PATH=\MASM32\BIN

 

taper ML

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

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

 

Les variables d'envirronnements

 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

 

Utilisation

 

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

 

PLUS +++

 

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

 

 VCTOOLKIT

 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%
 

 ML CL,et les Activitées Commerciales de microsoft

 

 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++

 

 Ressources

Le fichier de ressource est optionnel et vient s'ajouter au programme compilé au moment du link (lieur de modules)

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