![]() |
COURS N° 2 - MsgBox |
![]() |
.386 .MODEL FLAT, STDCALL OPTION CASEMAP:NONE INCLUDE \masm32\include\windows.inc INCLUDE \masm32\include\kernel32.inc INCLUDE \masm32\include\user32.inc INCLUDELIB \masm32\lib\kernel32.lib INCLUDELIB \masm32\lib\user32.lib MesDonnees SEGMENT 'DATA' Msg DB "Hello World !",0 TitleMsg DB "MsgBox.asm",0 MesDonnees ENDS MonCode SEGMENT 'CODE' Main: push MB_OK ;Bouton Ok. push OFFSET TitleMsg ;Titre. push OFFSET Msg ;Message. push NULL ;hwnd dans ce cas 0. call MessageBox push 0h call ExitProcess MonCode ENDS END Main |
1 ) Pour réaliser ce petit programme nous devons utiliser 3 fichiers d'inclusion et 2 bibliothèques :
Fichiers
d'inclusion : Windows.inc, kernel32.inc, user32.inc
Fichiers librairie : kernel32.lib, user32.lib
Les fichiers d'inclusion sont prioritaires et doivent toujours être présentés avant les fichiers de librairie.
Le fichier d'inclusion : windows.inc est prioritaire sur tous les autres fichiers d'inclusion et doit par conséquent être déclaré en premier. Windows.inc contient toutes les déclarations de constantes et structures de Win32 il contient notamment :
MB_OK
NULL
Le fichier d'inclusion et de librairie : kernel32.inc contient toutes les déclarations de fonctions contenues dans la librairie kernel32.lib. La fonction ExitProcess fait partie de cette librairie.
Le fichier d'inclusion et de librairie : user32.inc contient toutes les déclarations de fonctions contenues dans la librairie user32.lib. La fonction MessageBox en fait partie.
2) Le segment Data représente l'espace de données de l'application. Deux variables ont été déclarées :
- Msg, fait référence au message;
- MsgTitle, fait référence au titre de la boîte de dialogue.
3) Un segment de code : Code a été crée. Ce dernier contient les instructions qui réaliseront l'affichage de la boîte de dialogue : MsgBox.
L'exécution du code débute à l'instruction push MB_Ok.
On utilise donc, la fonction MessageBox qui requiert 4 paramètres. (Je n'expliquerai pas les paramètres de cette fonction, pour cela faites référence à l'aide Win32)
Une fois la boîte à messages affichée et après avoir cliqué sur le bouton OK le programme se termine et rend la main à windows en utilisant la fonction : ExitProcess.
Pour enlever toute ambiguïté, il faut savoir qu'un programme est constitué d'une partie de données et de code. Cet ensemble est logé en mémoire. La gestion de la mémoire est effectuée par le système d'exploitation.
Donc, lorsque vous cliquez sur l'icône d'un fichier exécutable, le système d'exploitation réagit et effectue les tâches suivantes :
1 - Le "loader" (chargeur d'application) va lire le contenu du fichier;
2 - Il récupère un certain nombre d'informations afin de créer :
2.1 - Le segment de données est créé et les registres de segment se verront affectés de l'adresse physique. Ces registres sont : DS, ES, FS, SS et sont des registres 16 bits. Vous allez vous demander comment le système fait-il pour stocker une adresse 32 bits dans un segment qui ne peut en recevoir que 16. Question pertinente. En fait le registre segment ne contient pas l'adresse physique mais un numéro d'index qui fait référence à une table qui quant à elle contient l'adresse physique. Grosso modo c'est cela. C'est un processus complexe que l'on verra plus tard.
2.2 - Une fois le segment de données créé, le système créera le segment de code. Dès qu'il aura logé tout le code de l'application en mémoire, il initialisera le compteur d'instructions. Ce compteur d'instruction est le registre "IP" (Instructions Pointer). C'est à partir de là que l'application va commencer à travailler.
3 - Lorsque l'application s'arrête la main est redonnée au système d'exploitation.