Vous êtes sur la page 1sur 8

Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

TP N°1
Initiation au Langage Assembleur (8086/8088)
I. Objectifs :

Se familiariser avec les registres du 8086 et certaines instructions de base.

II. Rappels sur le microprocesseur Intel 8086


Développé en 1978 par Intel, le microprocesseur 8086 est un processeur CISC 16 bits. Il s’agit du
premier microprocesseur de la famille des « x86 » comprenant les célèbres 80386 et 80486.
Ses caractéristiques principales sont les suivantes :

- Bus de données d’une largeur de 16 bits.

- Bus d’adresses de 20 bits, ce qui permet d’adresser un total de 1 mégaoctet de mémoire.

- 14 registres de 16 bits dont un registre d’état contenant des indicateurs binaires.

La mémoire est segmentée en 16 blocs de 64 Ko et une adresse sur 20 bits est obtenue en
combinant deux parties :

- Le registre CS permet de stocker les 4 bits de poids fort donnant le numéro de segment de
mémoire.

- Le registre IP fournit les 16 bit de poids faible donnant l’adresse à l’intérieur du segment
de mémoire spécifié par CS.

Le 8086 autorise un mode de fonctionnement en pas à pas, ainsi que l’utilisation d’opérations
spécifiques appelées interruptions permettant au 8086 de « dialoguer » avec les autres
périphériques de l’ordinateur.
Les registres du 8086 se décomposent en 4 grandes familles :
Registres du 8086/8088
16 bits

Registres d'utilisation générale


AH AL Ax (pour multiplication, division, Entrées/Sorties)
BH BL Bx (pour pointer vers une adresse de base)
CH CL Cx (pour compter et décaler)
DH DL Dx (pour multiplication, division, Entrées/Sorties)

Registres d'Index et Pointeurs


SP Pointeur de Pile (Stack Pointer)
BP Pointeur de Base (Base Pointer)
SI Index de Source (Source Index)
DI Index de Destination(Destination Index)

Registres de Segment
CS Segment de Code (Code Segment)
DS Segment de Données (Data Segment)
SS Segment de Pile (Stack Segment)
ES Segment Extra (Extra Segment)

Autres Registres
IP (Pointeur d'Instruction) Instruction Pointer
ST (Registre d'Etat) Status

-1-
- 1 --
1-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

4 registres de données, se décomposant chacun en deux parties : une partie « haute » et une partie
« basse » de 8 bits chacune, ce qui permet au microprocesseur de manipuler des données sur 8 ou
16 bits :

- AX (décomposable en AH et AL) sert d’accumulateur et est principalement utilisé lors


d’opérations arithmétiques et logiques ;

- BX est la plupart du temps utilisé comme opérande dans les calculs ;

- CX est utilisé comme compteur dans les structures itératives ;

- DX, tout comme AX, est utilisé pour les calculs arithmétiques et notamment dans la
division et la multiplication. Il intervient également dans les opérations d’entrées/sorties.

Registres de segmentation :

- CS (segment de code) permet de déterminer les adresses sur 20 bits ;

- DS (segment de données) ;

- SS (segment de pile) ;

- ES (segment supplémentaire).

Registres pointeurs ou d’index :

- SP (pointeur de pile) pointe sur le sommet de la pile de données ;

- BP (pointeur de base) pointe sur la base de la pile de données ;

- SI (index de source) ;

- DI (index de destination).

Introduction à l’utilisation du debugger :


Un debugger est un outil qui permet d’exécuter instruction par instruction un programme
tout en suivant en permanence l’´evolution du contenu des registres, du segment de
données, la pile, ... C’est un outil indispensable pour simplifier et accélérer la mise en point
de programmes.

-2-
- 2 --
2-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

Figure 1. Utilisation du Debug


Les paramètres des commandes :
Les commandes principales de DEBUG sont :
Commande A :
Syntaxe: A <adresse>
(Pour assemble) permet d’écrire, en mémoire, un programme en langage assembleur, qui pourra
être désassemblé par la commande U.
Exemple : Taper la commande A 100 pour commencer à entrer un programme à la position
100 du segment définit dans CS.
Commande C (compare) :
Syntaxe C <bloc> <adresse>
Compare le bloc défini par <bloc> avec le bloc qui débute à <adresse> (de la même taille). Il n'y a
pas de message s’ils sont identiques.
Exemple C 100 110 200 ou C 100 L10 200 compare les blocs (CS:100..CS:110) avec
(CS:200..CS:210).
Commande D (dump soit vider) :
Syntaxe D ou D <adresse> ou D <bloc>
Donne la suite d'octets du bloc défini. Si on spécifie une adresse seule, le bloc fera 128 octets. D
sans paramètres "dump" les 128 octets suivants.
Commande E (enter) :
Syntaxe E <adresse> ou E <adresse> <liste d'octets>
Si on donne une liste d'octets, il sont mis en mémoire à partir de <adresse>. Sinon, on peut donner
les différents octets (l'ancien est affiché). Une valeur donnée remplace l'ancienne, un espace
conserve l'ancienne valeur, retour chariot termine la commande et le symbole moins permet de
revenir en arrière.
Commande F (fill) :
Syntaxe F <bloc> <liste d'octets>
Remplit le bloc avec la suite d'octets. La suite est répétée pour tout remplir.
Exemple: F 100 200 1 2 3 donne 100: 1 2 3 1 2 3 1 2 3 1 2 3... jusqu'en 200 inclus.
Commande U :

-3-
- 3 --
3-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

(pour unassemble ) désassemble le code machine en assembleur.


Commande D :
Affichage sur l’écran le contenu d’une zone mémoire (instructions, données, pile, ROM,…)
dont les adresses début et de fin sont spécifiées (ou bien le début et la longueur). L’affichage
se présente en deux parties : une partie à 16 octets en hexadecimale et une partie pour la
correspondance ASCII (c’est possible pour les données mais c’est sans signification pour les
instructions).
Commande G (go) :

Syntaxe G [=<adresse1>] [<adresse2>...]

Exécute le programme à partir de l'adresse 1 si elle est spécifiée (elle est facultative) ou à partir de
CS:IP si elle n'est pas indiquée. Il y a des points d'arrêt aux adresses <adresses2> (on peut mettre
entre = et 10 points d'arrêt qui doivent être le premier octet d'une instruction).

Exemples:
G => lance à partir de CS:IP
G = 100 => lance à partir de CS:100
G 100 => lance à partir de CS:IP et s'arrête si on tombe sur l'adresse 100
G = 100 200 300 400 => lance à partir de 100 et s'arrête si on passe par 200 300 ou 400.

Commande Q (quit) :

Syntaxe Q

Termine la cession.

Commande T :

Pour exécuter n lignes de programme à partir de l'adresse cs:100, il faut exécuter la commande
t=100 n. Observer l'évolution de l'exécution de votre programme et notamment l'évolution du
contenu des registre ax, bx, cx et dx.

Commande R (registre) :

Syntaxe R [<registre>]

Affiche et permet de modifier le contenu d'un registre ou affiche tous les registres si
aucun nom n'est spécifié. Le registre des flags s'appelle F. Si on donne RF, l'état des flags
s'affiche et on peut changer les flags individuellement: OV, DN, EI, NG, ZR, AC, PE et
CY permettent de mettre à un les flags Overflow, Direction, Interruption, Signe, Zéro,
Retenue auxiliaire, Parité et Retenue. NV, UP, DI, PL, NZ, NA, PO et NC permettent de
les remettre à zéro.

-4-
- 4 --
4-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

Application
Remarque : l'interruption 20h de DOS permet la terminaison du programme (int 20).
Étapes à réaliser :

Étape 1: création d'un fichier qui affiche un message à l'écran

À l'invité du DOSBox, lancez le programme DEBUG.EXE

À l'invité du programme DEBUG, tapez A 100 pour commencer l'assemblage.

Votre écran ressemblera à celui-ci :

Z:\> mount c: c:\DOSBox

Driver C is mounted as local directrory c:\DOSBox


Z:\> c:
c:\> debug
-A 100 ;on se place à l'adresse 100h dans un segment de mémoire,
;le programme doit toujours commencer à l'adresse 100h
XXXX:0100

Le XXXX représente l'adresse du segment de mémoire qu'on utilise et 0100 représente l'offset
dans ce segment.

Étape 2: Trace d'exécution d'un code avec la vérification du contenu de registres


Tapez votre code , appuyez sur Enter pour revenir à l'invité du programme DEBUG. Nous
sommes prêts à exécuter notre programme. Tapez la lettre G pour exécuter...
Votre écran ressemblera à celui-ci:
C:\>DEBUG
-A 100
1773:0100 MOV AX,FFFF
1773:0103 MOV BX,FFFF
1773:0106 ADD AX,BX
1773:0108 MOV AX,0001
1773:010B DEC AX
1773:010C INC AX
1773:010D SUB AX,0002
1773:0110 MOV AH,70
1773:0112 MOV BH,50
1773:0114 ADD AH,BH
1773:0116 INT 20

Pour tracer l'exécution de votre petit code, tapez la lettre T et observez le contenu des
registres (la première fois, tapez la lettre R pour afficher le contenu de registres avant
l'exécution de la première instruction):

-5-
- 5 --
5-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1773 ES=1773 SS=1773 CS=1773 IP=0103 NV UP EI PL NZ NA PO NC
1773:0103 BBFFFF MOV AX,FFFF
-T
AX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1773 ES=1773 SS=1773 CS=1773 IP=0103 NV UP EI PL NZ NA PO NC
1773:0103 BBFFFF MOV BX,FFFF

Exercice 1 : Transfert de données

En se référant aux instructions du 8086, à l’aide du Debug exécuter Pas à Pas les
séquences suivantes :

1)

AX 500
BX 600
CX AX
AX BX
BX CX

2)

[200] 56E3
AX 0BF7
BX C01E
XCHG AL, BL
XCHG AH, AL
XCHG [200], AX

3)

AX 1FDE
BX FF00
CX CA02
DX C01E
PUSH AX
PUSH BX
POP AX
POP DX
1- En utilisant la commande a, entrer les programme ci-dessus à l’adresse 100 de la mémoire.
2- Vérifier votre programme en utilisant la commande u.
3- Donner le code de chacune des instructions du programme.
4- Calculer la taille en bits et en octet de votre programme.
5- Calculer l’adresse physique de chacune des instructions du programme.
6- indiqué la valeur de SS :SP ainsi le contenu des registres AX, BX, CX, DX.

4)

-6-
- 6 --
6-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

Ecrire le programme suivant: (l'instruction PUSH reg place dans la pile le registre reg.
L'adresse de la pile est définie par le couple SS:SP)

mov ax,35
mov bx,41
mov cx,30
mov dx,6
push ax
push bx
push cx
push dx
add ax,bx
add cx,dx
int 20

- Exécuter le programme et vérifier son bon fonctionnement.


- Retrouver les valeurs de ax, bx, cx et dx qui ont été sauvés dans la pile.

Exercice 2 : instructions logiques

1)

Exécuter les instructions suivantes et donner le contenu des registres associés :

AX 0AFB
BX C01E
OR AX, BX
OR AX, FFFF
AND AX, 9999
XOR BX, BX
NOT AX
2)
CX C01E
DX C01E
NEG CX
AND DX, CX

Exercice 3 : Instructions arithmétiques


1) Calculer la somme des entiers de 1 jusqu’à 10. Utiliser pour cet effet le registre CX en
compteur et le registre AX en accumulateur.
2) Ecrire un programme qui additionne deux nombres décimaux se trouve respectivement
dans BL et AL et donne le résultat en décimale.
3) A l’adresse d’offset 200h, initialiser une table avec les valeurs décimales suivantes : 1, 3,
5, 7, 9, 11.
En utilisant l’instruction XTAL, on désir accéder à la 4ème valeur.

-7-
- 7 --
7-
Microprocesseurs et Microcontrôleurs AU : 2018/2019 Sem2

Jeu d’instructions

Nous citons ci-dessous les instructions de l’assembleur les plus utilisées.


1. Transfert de données :
Multiplication
Général MUL Multiplication non signée d’octets ou de mots
MOV Déplacement d’un octet ou d’un mot IMUL Multiplication signée d’octets ou de mots
PUSH Ecriture d’un mot au sommet de la pile AAM Ajustement ASCII de la multiplication
POP Lecture d’un mot au sommet de la pile Division
XCHG Echange d’octets ou de mots DIV Division non signée d’octets ou de mots
XLAT ou Traduction d’un octet à l’aide d’une table IDIV Division signée d’octets ou de mots
XLATB AAD Ajustement ASCII de la division
Entrées/Sorties CBW Conversion d’octet en mot
IN Lecture d’un port d’E/S CWD Conversion de mot en double mot
OUT Ecriture d’un port d’E/S
Transfert d’adresses 4. Instructions de branchements :
LEA Chargement d’une adresse effective
LDS Chargement d’un pointeur utilisant DS Branchements inconditionnels
LES Chargement d’un pointeur utilisant ES CALL Appel de procédure
Transfert des flags RET Retour d’une procédure
LAHF Transfert des 5 flags bas dans AH JMP Saut inconditionnel
SAHF Transfert de AH dans les 5 flags bas Contrôles d’itérations
PUSHF Sauvegarde des flags sur la pile LOOP Bouclage tant que CX
POPF Restauration des flags à partir de la pile
LOOPE ou Bouclage tant que CX = 0 et ZF = 1
LOOPZ (égalité)
2. Instructions logiques : LOOPNE ou Bouclage tant que CX = 0 et ZF = 0
LOOPNZ (inégalité)
Logique
NOT Complément à 1 d’un octet ou d’un mot JCXZ Saut si CX est nul
mots
AND ET logique de deux octets ou de deux mots
OR OU logique de deux octets ou de deux mots 5. Instructions de branchements conditionnels
XOR OU exclusif logique de deux octets ou de deux
TEST Comparaison, à l’aide d’un ET, d’octets ou de mots Sauts conditionnels
Décalages
SHL/SAL Décalage à gauche arithmétique ou logique (octet JA ou JNBE (1) Saut si « supérieur » (si CF + ZF = 0)
ou mot) JAE ou JNB (1) Saut si « supérieur ou égal » (si CF = 0)
SHR Décalage logique à droite d’un octet ou d’un mot Saut si « inferieur » (si CF = 1)
SAR Décalage arithmétique à droite d’un octet ou d’un JB ou JNAE (1)
Mot JBE ou JNA (1) Saut si « inferieur ou égal »
Rotations (si CF + ZF = 1)
ROL Rotation à gauche d’un octet ou d’un mot) JC Saut en cas de retenue (si CF = 1)
ROR Rotation à droite d’un octet ou d’un mot JE ou JZ Saut si « égal » ou « nul » (si ZF = 1)
RCL Rotation à gauche incluant CF (octet ou mot)
RCR Rotation à droite incluant CF (octet ou mot) JG ou JNLE (2) Saut si « plus grand »
(si (SF ⊕ OF) + ZF = 0)
3. Instructions arithmétiques : JGE ou JNL (2) Saut si « plus grand ou égal »
JL ou JNGE (2) Saut si ⊕
(si SF = 0) » (si SF ⊕ OF = 1)
OF petit
« plus
Addition
ADD Addition d’octets ou de mots JLE ou JNG (2) Saut si « plus petit ou égal »
ADC Addition d’octets ou de mots avec retenue (si (SF ⊕ OF) + ZF = 1)
INC Incrémentation de 1 d’un octet ou d’un mot JNC Saut si « pas de retenue » (si CF = 0)
AAA Ajustement ASCII de l’addition JNE ou JNZ Saut si « non égal » ou « non nul »
DAA Ajustement décimal de l’addition (si (ZF = 0)
Soustraction
SUB Soustraction d’octets ou de mots JNO Saut si « pas de dépassement » (si OF = 0)
SBB Soustraction d’octets ou de mots avec retenue JNP ou JPO Saut si « parité impaire » (si PF = 0)
DEC Décrémentation de 1 d’un octet ou d’un mot JNS Saut si « signe positif » (si SF = 0)
NEG Complémentation à 2 d’un octet ou d’un mot JO Saut si « dépassement » (si OF = 1)
(changement de signe) JP ou JPE Saut si « parité paire » (si PF = 1)
CMP Comparaison d’octets ou de mots JS Saut si « signe négatif » (si SF = 1)
AAS Ajustement ASCII de la soustraction
DAS Ajustement décimal de la soustraction

-8-

Vous aimerez peut-être aussi