Programmes en Langage ASSEMBLEUR: (8088/8086) Exécutables en (. EXE)
Programmes en Langage ASSEMBLEUR: (8088/8086) Exécutables en (. EXE)
Programmes en Langage ASSEMBLEUR: (8088/8086) Exécutables en (. EXE)
de Microprocesseur N°2
-1-
T.P. de Microprocesseur N°2
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG, ES: nothing
MAIN :
La première ligne donne le titre du programme avec la directive obligatoire dans ce cas,
"TITLE'. Si cette ligne est présente, l'assembleur l'imprimera à l'entête de chaque page du
listing.
Le corps du programme est constitué de trois parties, appelée chacune segment de
programme. Les segments commencent par un nom de segment suivi à l'aide du mot réservé
'SEGMENT' et se terminant par une ligne dans laquelle le nom du segment est répété suivi par
le mot réservé 'ENDS'(end segment).
La directive 'ASSUME' suivant la déclaration de CSEC dit à l'assembleur vers quel
segment on désire que le registre segment pointe. Ainsi dans le programme ci-dessus, nous
désirons que le registre CS pointe à CSEG, puisque ce segment contient le programme, et CS
plus IP doit toujours pointer à l'instruction suivante devant être exécutée. Nous désirons que
DS pointe au segment où sont rangées les variables (implicitement il en est ainsi, sauf si on
explicite un autre).
Notons, cependant que la directive 'ASSUME' ne fait pas pointer DS à DSEG, il faut
en faire l'initialisation. (Voir les lignes 4 et 5 de la procédure)
Se rappeler que DS a été initialisé pour qu'il pointe au point d'entrée du DOS. Une fois
DS chargé et éventuellement ES, si on s'en sert, on peut oublier les registres segment dans la
suite du programme.
-2-
T.P. de Microprocesseur N°2
Une fois le registre DS est chargé, c'est le DOS qui s'occupe d'initialiser, à la fois
SS:SP pour pointer au segment pile et CS: IP pour pointer au début du programme.
Dans ce programme, aucune valeur n'est requise pour ES, car on ne s'en sert pas.
Enfin l'assembleur n'a pas besoin d'une valeur ASSUME pour SS car le DOS s'occupe de faire
pointer SS au segment STACK.
Nous venons de voir qu'un segment commence par le nom du segment suivi de
"SEGMENT" , pouvant encore être suivi par l'alignement: BYTE (contigu); WORD (adresse
paire) PARA (début d'un paragraphe à 16 Octets ) PAGE(début d'une page à 256 octets). Par
défaut, l'alignement est toujours pris PARA.
Le mot suivant sur la même ligne PUBLIC, le segment peut être concaténé à un
autre. AT (une expression fixe) il sera à l'adresse indiquée, enfin STACK et c'est le cas pour
notre programme, pour indiquer que la pile existe dans ce segment, ainsi lorsque le
programme est chargé en mémoire, le DOS fera pointer les registres SS : SP à la fin du
segment pile, dont la taille ici est de 80 mots (80 DUP signifie dupliquer DW 80 fois), mais
sans initialisation, c'est le sens du '?'.
Le programme est donné sous forme de procédure, dont le nom suit la directive END
(signifiant la fin du programme) afin d'indiquer à l'assembleur par quelle valeur, le DOS devra
initialiser IP pour le départ d'exécution du programme.
Enfin pourquoi ce modèle de programme a-t-il été écrit sous forme de procédure et quel est le
sens des premières lignes de code?
Le DOS génère pour tout appel de commande externe et de programme d'application
un préfixe de segment de programme (PSP) qui est une zone de communication de 256 octets
(100H) contenant les informations suivantes:
- L'adresse de fin d'exécution (INT 20H)
- L'adresse de sortie Ctrl-Break (INT 23H)
- L'adresse de terminaison en cas d'erreur grave (INT 24H)
- L'appel du répartiteur de fonctions en déplacement de 50H
- L'adresse de transfert de disque en déplacement de 80H
- Deux blocs de contrôle de fichier en 5CH et 6CH
La présence du PSP explique que le chargement des programmes s'effectue en déplacement
100H et non à l'adresse 0H.
Pour utiliser ce modèle de programme, il suffit de remplacer, les trois lignes de code
MOV DX, OFFSET MSG;
MOV AH, O9H;
INT 21H
Par celles d'un autre programme, ainsi que la ligne débutant par: MSG DB, par les variables
et donnée nécessaires.
-3-
T.P. de Microprocesseur N°2
1. Evidemment pour cet effet, il faudrait se servir d'un éditeur de texte, tel que le
programme EDIT du dos, puis le ranger dans le disque comme tout fichier. Ce dernier
a pris le nom ici de 'MINPROG. ASM.
2. On fait alors l'assemblage avec le Turbo assembleur appelé 'TASM' afin d'assembler
d’assembler le programme avec la commande :
Ce header dit au DOS comment initialiser les registres segment avant de transférer le
contrôle au programme et surtout comment reloger le programme (modifier toute
instruction pouvant dépendre du nouvel emplacement mémoire fixé par le DOS pour
les segments du programme).
4. Le programme TLINK produit un fichier disque appelé 'MINPROG. EXE' et qu'on
fait tourner simplement par:
C:\……. MINPROG
L'écran doit nous afficher, alors, le message souhaité.
-4-
T.P. de Microprocesseur N°2
IV. EXERCICES
Indications :
1. Le registre CX est chargé par la valeur 26 (nombre total des lettres de l’alphabets).
2. Puis DL est chargé par la valeur 97 (61 en hexa = code ASCII de a).
3. Faire appel à la fonction 6H de l'interruption 21H du DOS (6H ou 2H en AH, le code
du caractère à afficher en DL).
Précaution: Fonction d’affichage d’un caractère sur l’écran :
MOV AH, 06h
MOV DL , ….. ; Initialiser DL par une valeur ASCII.
INT 21H
4. Ajouter à DL la valeur 1.
5. Décrémenter CX.
6. Boucler vers l’étape 3 jusqu’à ce que CX soit égal à 0.
Ecrire un programme assembleur permettant de lire les caractères d'un clavier et de les mettre
dans un tableau TAB en mémoire dans le segment de donnée. L'acquisition continue jusqu'à
ce que l'opérateur appuie sur RETURN (code ASCII de RETURN est 0DH) ou fasse entrer 30
touches.
Ce programme devra retourner le nombre de caractères en CX.
-5-
T.P. de Microprocesseur N°2
N.B: Avant de faire l'exécution sous DEBUG on doit remplacer l’instruction MOV AH, 4CH
par INT 3.
Précaution: Fonction saisie (lecture) d’un caractère d’un clavier:
MOV AH, 01h ; Fonction de lecture d’un caractère.
INT 21H ; Permet de mettre dans Al le code ASCII du
; Caractère saisi.
En utilisant la structure générale d'un programme assembleur de type .EXE, définir dans le
segment de donnée une table d'octets " SOURCE" initialisée avec les valeurs: 10, 20, 30 et
40; réserver quatre octets pour la table "DEST", un octet pour le résultat "SOMME" et 5
octets pour la table bufferASCII.
1. Ecrire alors le programme permettant de :
- Remplir la table "DEST" par des zéros
- Recopier en ordre inverse la table "SOURCE" en table "DEST"
- Faire la somme des éléments de la table "SOURCE" et mettre le résultat dans
"SOMME». Utiliser pour cet effet le registre CX.
Vérifier le résultat à l'aide du DEBUG, expliquer votre démarche.
N.B: On charge le fichier .EXE sous DEBUG puis on exécute le programme et on vérifie le
résultat dans la mémoire (segment de données).
D/ Somme nombres.
Ecrire un programme en assembleur qui lit une suite de chiffres comprise entre 0 et 9,
caractère par caractère et fait la somme. L'acquisition continue jusqu'à ce que l'opérateur
appuie sur la touche «.».
Le programme affiche ensuite le nombre de chiffres tapés et la somme de ces chiffres.
Exemple : l’utilisateur tape « 1234. », l’ordinateur doit afficher ensuite « 4 chiffres dont la
somme est égale a 10 ».
Indications :
- On commence par remplir la table bufferASCII avec des caractères espaces.
- On fait la conversion en divisant le contenu de AX par 10 puis on ajoute au
reste de la division le code ASCII de zéro (30h). la valeur obtenue est le code
ASCCI du chiffre des unités. On refait la même opération pour les chiffres des
dizaines etc.
- On charge les codes trouvés dans la table bufferASCII.
- L'affichage pourra être fait avec la fonction 40h de l'interruption 21h du DOS (Voir
annexe).
-6-