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.

C'est le modèle des programmes exécutables d'extension "com".

Caractéristiques :


Code :

Le code commence à l'adresse offset 100h (256) et est situé juste après le PSP.

Données :

Les données sont situées juste après le code.

Pile :

La pile est située juste après les données et occupe tout le reste du segment jusqu'à l'adresse offset FFFEh.

Le compilateur donnera naissance à un fichier exécutable "nom.com". Ce type de fichier ne contient que les données relatives au code, aux données et à la pile. Aucune donnée relative au PSP ne sera stockée dans le fichier. Ces information, sont des informations système implantées en mémoire par le seul système d'exploitation et en l'occurence MS-DOS.


Structure de la zone PSP (
Program Segment Prefixes) :

Cette zone contient les informations mises par le système d'exploitation MS-DOS, elle est essentielle au bon fonctionnement du programme. Ces données ne sont pas contenues dans l'image du fichier exétuable. Elle est large de 256 octets. C'est pour cette raison que le programme proprement dit commence à l'adresse offset 100h (256). Les données implantées dans la zone PSP ne doivent pas être détruites sous peine de plantage.

Ci-après le shéma structurel de cette zone :



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.

La plus part des données logées dans le PSP sont obsolètes. Les seuls champs vraiment intéressant sont :
La taille du fichier d'un tel exécutable dépend de ce que le programmeur aura mis dedans. Rien d'autre n'est rajouté par le compilateur ou le lieur.



On va maintenant étudier par la pratique la structure d'un tel programme par l'exemple de code suivant
:


;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


Copiez le code ci-dessus dans Radasm (ou dans le bloc note), enregistrez-le sous le nom de "hello.asm".

Compilation :

masm32\bin\ml /c hello.asm
masm32\bin\link16 /tiny hello.obj

Le fichier qui en résultera sera : hello.com

Exécutez le fichier "hello.com" et le message : Hello World ! sera affiché sur la console.

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.