|
LE MODELE MEMOIRE TINY |
Avec ce cours nous allons aborder le modèle mémoire tiny tout en continuant d'apprendre le langage assembleur.
Je vous le rappelle, apprendre le langage assembleur nécessite de connaître l'aspect technique de chaque composant de l'ordinateur tel que : microprocesseur, la mémoire vive, le disque dur, etc... mais aussi certains concepts tels que les modèles mémoire.
Il est indispensable de vous familiariser avec les modèles mémoire que met à notre disposition le compilateur.
Ce modèle est le plus petit des modèles mémoire utilisés par le programmeur.![]() |
![]() |
| OFFSET (hexa) | TAILLE (hexa) | CONTENU | SIGNIFICATION |
|---|---|---|---|
| 0 | 2 | INT20 | Termine le programme. |
| 2 | 2 | Adresse | Dernière adresse de segment allouée au programme. |
| 4 | 1 | RESERVE | |
| 5 | 5 | CALLDISP | Appel du répartiteur DOS. |
| A | 4 | ADR22 | Adresse contenant le code de fin de programme. |
| E | 4 | ADR23 | Adresse pointant vers la combinaison de touches CTRL+C |
| 12 | 4 | ADR24 | Adresse du gestionnaire d'erreurs. |
| 16 | 16 | RESERVE | |
| 2C | 2 | ENV | Adresse de segment de la chaîne d'environnement. |
| 2E | 22 | RESERVE | |
| 50 | 2 | INT21 | Idem que le champ numéro 4. |
| 52 | 1 | FAR | |
| 53 | 9 | RESERVE | |
| 5C | 10 | FCB1 | |
| 6C | 10 | FCB2 | |
| 7C | 4 | RESERVE | |
| 80 | 1 | NUM | Nombre de caractères saisis après le nom du programme. |
| 81 | 7E | PARAM | Paramètres passés au programme. |
;Ce code peut être compilé et exécuté sous Windows XP. .8086 .model TINY MonCode SEGMENT 'code' ORG 100h Main: mov ah, 9h mov dx, OFFSET Msg int 21h mov ax, 4C00h int 21h Msg db "Hello World !$" MonCode ENDS END Main |
COMPREHENSION :
.8086, utilise le jeu d'instructions du microprocesseur 8086. Le compilateur interdit l'usage d'instructions n'appartenant pas à ce microprocesseur et ascendant. Lors de la compilation, un message d'erreur est affiché.
.MODEL TINY, modèle mémoire des fichiers .com.
ORG 100h, la directive ORG est très importante car elle indique à l'éditeur de liens (le lieur) que toutes les adresses offset devront être calculées à partir de l'adresse offset 100h (256). Si le programmeur omet cette directive le résultat du programme sera surprenant. Dans la plupart des cas ce sera un plantage du programme, un bug !!!
mov ah, 9h, place la fonction MS-DOS 9h dans le registre ah. Cette fonction affiche une chaîne de caractères se terminant par le signe $ à l'écran.
mov dx, OFFSET Msg, place dans le registre dx l'adresse offset de la variable Msg. MS-DOS doit savoir où trouver la donnée à afficher.
int 21h, int veut dire interruption. Cette fonction du microprocesseur exécute le code du système d'exploitation situé à l'index 21h dans la table des vecteurs d'interruption.
mov ax, 4C00h, place dans le registre ax le numéro de fonction et son code retour : 4C00h qui est la fonction de fin de programme. Tout programme à un moment ou à un autre doit cesser d'exister en mémoire et doit redonner la main au système d'exploitation.
int 21h, exécute la fonction. Fin effective du programme.
Msg db "Hello World !$", Donnée de l'application. C'est le message qui sera affiché à l'écran.Le signe $ ne sera pas affiché par MS-DOS. Il indique au système d'exploitation que c'est la fin de la chaîne de caractères.
Pour un programme TINY (.com) les données peuvent être placées soit avant le code de l'application soit après la dernière instruction du programme. Dans le cas ou les données sont placées avant le code de l'application n'oubliez jamais de placer une instruction jmp (jump) vers l'adresse offset de la première instruction à exécuter. Si non c'est le C R A S H ! ! !
Je vous conseille de toujours placer les données après le code comme ci-dessus, c'est ainsi plus clair et logique !
L'exécutable vu par debug (affichage en hexadécimal) du fichier "hello.com" :
![]() |
Qu'est-ce que nous montre debug ?
Vous savez, maintenant, tout d'un programme "com".
Exemple de code dont les données informatives sont placées avant l'exécution de la première instruction :
;Ce code peut être compilé et exécuté sous Windows XP. .8086.model TINY MonCode SEGMENT 'code' ORG 100h Main: jmp Run Msg db "Hello World !$" Run: mov ah, 9h mov dx, OFFSET Msg int 21h mov ax, 4C00h int 21h MonCode ENDS END Main |
jmp Run, cette instruction n'est là que pour éviter l'exécution de ce qui suit par le microprocesseur ce qui entraînerait un plantage. JMP positionne le registre IP (Instruction Pointer) avec l'adresse offset de l'instruction : mov ah, 9h
Dans les fichiers TINY chaque octet est précieux alors ne gaspillez pas le peu d'espace libre. Mettez vos données à la fin du code du programme.