Vous êtes sur la page 1sur 6

T.P.

de Microprocesseur N°2

Programmes en langage ASSEMBLEUR


( 8088/8086 )
Exécutables en (. EXE)

I. Structures générales d’un programme en assembleur:


Un programme en assembleur destiné à être enregistré dans un fichier de type
Nom.asm doit être sous la forme suivante :

II. Modèle d'un programme assembleur

On donne, ici, un exemple de programme assembleur simple :

-1-
T.P. de Microprocesseur N°2

TITLE PROGRAMME ASSEMBLEUR MINIMUM

DSEG SEGMENT ; Généralement toutes les variables


MSG DB 'BONJOUR$' ; se trouvent dans le segment de
DSEG ENDS ; données appelé ici DSEG.

CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG, ES: nothing

MAIN :

MOV AX, DSEG ; Faire pointer DS au segment de données


MOV DS, AX

MOV DX, OFFSET MSG ; Ici se trouve le corps principal


MOV AH, 09 ; du programme (3 lignes)
INT 21H

MOV AX, 4C00H ; fonction standard sert au retour au DOS


INT 21H
CSEG ENDS
END 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.

C:\……. edit minprog.asm

2. On fait alors l'assemblage avec le Turbo assembleur appelé 'TASM' afin d'assembler
d’assembler le programme avec la commande :

C:\……. TASM minprog


3. La version langage machine correspondante est alors rangée dans un fichier appelé
‘MINPROG.OBJ’. Après il faudrait faire tourner le programme linker en faisant
entrer:

C:\……. TLINK minprog


Le programme TLINK convertit le code machine en une forme qui peut être
chargée et exécutée à partir du DOS. Il rajoute en tête du code machine un bloc de
code appelé 'header'.

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é.

III . Présentation de l’environnement Emu8086

Emu8086 est un émulateur de microprocesseur. Lancez emu8086 (disponible dans


Démarrer). Pour cela, créez un raccourci dans votre répertoire de travail (d:\TPmicro). Editez
votre programme et enregistrez le dans un fichier de type Nom.asm. Cliquez sur Compiler et
choisissez un répertoire dans votre répertoire de travail où se trouvera l’exécutable créé (dans
(d:\TPmicro). Cliquez ensuite sur Emuler afin d’émuler le programme. Une seconde fenêtre
doit se lancer et émuler le programme. Vous pouvez faire une émulation pas-à-pas, c'est-à-
dire instruction par instruction en cliquant sur « pas à pas ». Ce mode va vous être
particulièrement utile pour tester votre programme s’il ne fonctionne pas et pour le débugger.
Vous pouvez observer les valeurs des registres de travail, des registres d’instruction.

-4-
T.P. de Microprocesseur N°2

IV. EXERCICES

A/ Affichage des lettres de l’alphabets

En utilisant la structure générale d'un programme assembleur de type .EXE , écrire un


programme permettant d’afficher les lettres de l’alphabets de ‘a’ jusqu'à ‘z’.

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.

B/ Acquisition des caractères du clavier en mémoire

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.

C/ Initiation à l'utilisation d'une table

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-

Vous aimerez peut-être aussi