Vous êtes sur la page 1sur 100

Objectif du cours

Sinitier la programmation en assembleur 8086.

Introduction
Le langage Assembleur est un langage de programmation bas niveau.
Son fonctionnement est trs proche du langage machine.
L'avantage du langage assembleur est de pouvoir grer jusqu'au
moindre octet de mmoire et de toujours savoir quel code est
excut par le microprocesseur un instant donn.
L'assembleur a aussi l'avantage d'tre rapide et extrmement lger.
L'assembleur est un terme qui peut dsigner deux choses. Avant
d'tre un langage informatique, c'est un programme qui permet de
recrer des fichiers excutables partir de fichier source.

Introduction
Une instruction est dfinie par son code opratoire, valeur
numrique binaire difficile manipuler par ltre humain.
On utilise donc une notation symbolique pour reprsenter les
instructions : les mnmoniques.
Un programme constitu de mnmoniques est appel programme
en assembleur.
Un programme en assembleur contient aussi des directives.

Les instructions et les directives


Pour programmer en assembleur, on doit utiliser, en plus des
instructions assembleur, des directives.
Une directive est une information que le programmeur fournit au
compilateur.
Elle n'est pas transforme en une instruction en langage machine.
Elle n'ajoute donc aucun octet au programme compil.
Donc les directives sont des dclarations qui vont guider
l'assembleur.
Une directive est utilise par exemple pour crer de l'espace
mmoire pour des variables, pour dfinir des constantes, etc...

Syntaxe dune instruction


La syntaxe des instruction est comme suit :
{Label :} Mnmonique {oprande} { ; commentaire}
Le champ oprande est un champ optionnel selon linstruction.
Le champ commentaire : champ sans signification syntaxique et smantique
pour l'assembleur.
Le champ Label (tiquette) est destin pour marquer une ligne qui sera la cible
d'une instruction de saut ou de branchement.
Un mnmonique est, gnralement, compos uniquement de lettres (MOV,
CMP, LOOP).
On pourra indiffremment crire les mnmoniques avec des lettres minuscules
ou majuscules.

Les groupes dinstructions


Les instructions de transfert de donnes.
Les instructions arithmtiques.
Les instructions logiques.
Les instructions de dcalage et de rotation.
Les instructions de contrle des indicateurs.
Les instructions de comparaisons.
Les instructions de branchements.
Les instructions de boucles.
Les instructions de traitement de chanes de donnes.

Les instructions de transfert de donnes


Elles permettent de dplacer des donnes dune source vers une
destination.
Syntaxe : MOV destination, source
Oprandes autoriss :
registre vers mmoire ;
registre vers registre ;
mmoire vers registre.

Le microprocesseur 8086 nautorise pas les transferts de mmoire


vers mmoire.
Il existe diffrentes faons de spcifier lemplacement dun oprande
dans une instruction : ce sont les modes dadressage.

Mode Immdiat
Un oprande est donn en immdiat s'il constitue lui mme la
valeur.
La donne est spcifie immdiatement aprs linstruction.
Elle est donc situe dans le segment de code.
Exemple: MOV SI,1240h
SI est charg par la valeur immdiate 1240h (SI 1240h).
Remarque: Ce type de transfert est interdit avec les registres de
segmentation (DS, CS, SS, ES).

Mode Registre
L'oprande est dsign par le contenu d'un registre.
Exemple:
MOV AX,DX

Mode direct
Un oprande est donn en mode direct s'il est dsign par son
adresse effective dans la mmoire.
Exemple 1: MOV [1200h],5Ah
La valeur 5Ah sera stocke l'adresse effective 1200h.
Pour calculer son adresse physique, il faut connatre la valeur stocke
dans le registre de segmentation DS (Si DS = 720h),
l'adresse physique sera :
Adresse physique = (720h 10h) + 1200h = 08400h

Mode direct
Exemple 2: MOV [1200h], 4D59h
4D59h est une donne sur 16 bits, elle occupera les deux octets d'adresse
effective 1200h et 1201h.
Si DS = 720h, la rpercussion de cette instruction sur la mmoire sera:
0720:1200
0720:1201

59h
4Dh

Rappelons que 0720:1200 est la reprsentation (Segment : Offset) de


l'adresse physique 08400h.
Notez aussi la convention Little Endian dans le rangement en mmoire.

Remarque
Dans le cas de ladressage immdiat de la mmoire, il faut indiquer le
format de la donne : octet ou mot (2 octets) car le microprocesseur
8086 peut manipuler des donnes sur 8 bits ou 16 bits.
Pour cela, on doit utiliser un spcificateur de format :
MOV byte ptr [1100H],65H
Cette instruction transfre la valeur 65H (sur 1 octet) dans la case
mmoire doffset 1100H ;
MOV word ptr [1100H],65H
Cette instruction transfre la valeur 0065H (sur 2 octets) dans les
cases mmoire doffset 1100H et 1101H.

Modes indirect
Ladresse effective est le contenu dun registre de base (BX ou BP) ou
index (Dl ou SI) ou la combinaison des deux.
Il existe trois types dadressage indirect :
Le mode indirect bas (registres de base),
Le mode indirect index (registres index),
Le mode indirect bas-index (registres de base et dindex).

Exemples : MOV AX, [BX]


MOV AX, [SI]
MOV AX, [BX+DI]

Mode indirect
Exemple 2:
Soit : BP = F415h ; SS = 0784h ; AX = 76E4h
MOV [BP]7Ah,AL
Autre criture : MOV [BP+7Ah],AL
La valeur 7Ah est un dplacement constant sur 8 bits.
Ce dplacement est ajout au contenu de BP pour former l'adresse
effective.
L'adresse effective : F415h + 7Ah = F48Fh
L'adresse physique : F48Fh + (10h 0784h) = 16CCFh
L'octet d'adresse 16CCFh recevra la valeur E4h (contenu de AL).
Cet octet appartient videmment la pile (registre SS).

Mode indirect bas


L'adresse effective de l'oprande est fournie par BX ou BP avec
ventuellement un dplacement constant sur 8 ou 16 bits.
Les registres de segment utiliss pour le calcul de l'adresse physique sont:
DS pour BX et SS pour BP.
Ceci signifie que BX sera utilis comme pointeur sur une donne dans le
segment de donnes (registre DS),
Alors que BP sera employ pour accder aux informations stockes dans
la pile (registre SS).
Exemple 1:
Soit BX = 1342h et DS = 1072h et soit l'instruction :
MOV [BX],0768h

Mode indirect index


L'adresse effective est fournie par l'un des registres d'index SI ou DI
avec ventuellement un dplacement constant sur 8 ou 16 bits.
SI et DI sont des pointeurs utiliss dans la zone des donnes.
Le registre de segment employ est DS.
Exemple 1 :
Soit SI = 24ABh ; DI = C140h ; DS = A1BAh
MOV [SI+1000h],142Bh
L'adresse effective : 24ABh + 1000h = 34ABh
L'adresse physique : 34ABh + A1BA0h = A504Bh

Mode indirect index


Exemple 2 :
Soit le programme suivant :
MOV AX,A1BAh
MOV DS,AX
MOV DI,C140h
MOV AX,1412h
MOV [DI],AX
Dans la dernire instruction o l'adressage indirect index est employ :
L'adresse effective : C140h
L'adresse physique : A1BA0h + C140h = ADCE0h

Mode indirect bas-index


Dans ce mode, les modes index et bas sont combins. L'adresse logique
est donne par BX/BP et SI/DI. Quatre cas sont possibles :
Avec le registre BX (et le registre de segmentation DS) :
BX + SI + dplacement ventuel sur 8 ou 16 bits
BX + DI + dplacement ventuel sur 8 ou 16 bits
Avec le registre BP (et le registre de segmentation SS) :
BP + SI + dplacement ventuel sur 8 ou 16 bits
BP + DI + dplacement ventuel sur 8 ou 16 bits
Ce type d'adressage est trs utile dans le traitement des chanes de
caractres ou dans le cas de traitement simultan de tableaux.
En effet, en faisant pointer BX sur le dbut d'une chane de caractres, SI
peut tre utilis comme index pour accder aux diffrents caractres.

Mode indirect bas-index


Exemple :
Soit : SS = 1240h ; BP = 42A8h ; SI = 4010h
MOV [BP+SI],12h
Autre criture : MOV [BP][SI],12h
L'adresse effective : BP + SI = 82B8h
L'adresse physique : 10h SS + 82B8h = 1A6B8h
L'octet d'adresse 1A6B8h sera charg par la valeur 12h.

Exemple
Ecrire un programme en assembleur 8086 qui permet de :
Charger la valeur 100H dans le registre AX.
Charger la valeur 205H dans le registre BX.
Permuter les valeurs des registres AX et BX.

Solution 1 :
mov ax,100h
mov bx,205H
mov cx,ax
mov ax,bx
mov bx,cx

Exemple
Solution 2 :
mov ax,100h
mov bx,205H
xchg ax,bx

Linstruction XCHG (Exchange) permet de permuter deux valeurs.


Syntaxe : XCHG oprande 1, oprande 2
Oprandes autoriss :
registre et mmoire ;
registre et registre ;
mmoire et registre.

Exercice 1
Indiquer le mode dadressage pour chacune des instructions
suivantes :

MOV AX, BX
MOV CX, 1234H

MOV [1000H], CX

MOV AL, [BX]

MOV AH, [BX + SI]

Les instructions arithmtiques


Les instructions arithmtiques de base sont laddition, la
soustraction, la multiplication et la division qui incluent diverses
variantes.

ADD (Addition sans retenue)

Syntaxe : ADD oprande 1, oprande 2


Lopration effectue est : oprande1 oprande1 + oprande2.
Oprandes autoriss :

registre et mmoire ;
registre et registre ;
mmoire et registre ;
Registre / mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

ADD (Addition sans retenue)


Remarques :

Les deux oprandes doivent tre de mme taille (8 bits ou 16 bits).


Tous les registres sont utilisables sauf les registres de segment.
L'addition mmoire, mmoire est interdite.

Exemples :

ADD DX,1000h ; addition sur 16 bits : DXDX+1000h.


ADD BH,F1h ; addition sur 8 bits : BHBH+F1h.
ADD AL,[1205h] ; adressage direct.
ADD CL,[SI] ; adressage index.

ADC (Addition avec retenue)


Syntaxe : ADC oprande 1, oprande 2
Lopration effectue est :
oprande1 oprande1 + oprande2 + CF.
Oprandes autoriss :

registre et mmoire ;
registre et registre ;
mmoire et registre ;
Registre / mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

AF

Exemples :

ADC DX,300h ; (DXDX+300h + CF)

Si DX=500h et CF=1 alors DX prendra la valeur 801h.

PF

CF

INC (Incrmentation)
Syntaxe : INC oprande
Lopration effectue est :
oprande1 oprande + 1.
Oprandes autoriss :
registre (8 ou 16 bits) ;
mmoire.

Indicateurs affects :
OF DF IF TF SF ZF

Exemples :

INC DI ; (DIDI + 1)

AF

PF

CF

SUB (Soustraction sans emprunt)


Syntaxe : SUB oprande 1, oprande 2
Lopration effectue est : oprande1 oprande1 - oprande2.
Oprandes autoriss :

registre et mmoire ;
registre et registre ;
mmoire et registre ;
Registre / mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

Exemples :

SUB CH,BL ; (CHCH-BL).

AF

PF

CF

SBB (Soustraction avec emprunt)


Syntaxe : SBB oprande 1, oprande 2
Lopration effectue est : oprande1 oprande1 - oprande2 - CF.
Oprandes autoriss :

registre et mmoire ;
registre et registre ;
mmoire et registre ;
Registre / mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

Exemples :

SBB CH,BL ; (CHCH-BL-CF).

AF

PF

CF

DEC (Dcrmentation)
Syntaxe : DEC oprande
Lopration effectue est :
oprande oprande - 1.
Oprandes autoriss :
registre (8 ou 16 bits) ;
mmoire.

Indicateurs affects :
OF DF IF TF SF ZF

Exemples :

DEC SI ; (SISI - 1)

AF

PF

CF

MUL (Multiplication)
Syntaxe : MUL oprande
Lopration effectue est :

Si oprande est sur 8 bits : AX AL x oprande.


Si oprande est sur 16 bits : (DX : AX) AX x oprande.

Oprandes autoriss :

registre sur 8 ou 16 bits;


mmoire sur 8 ou 16 bits.

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

Dans le cas dune multiplication sur 16 bits les indicateurs ne sont pas affects.

Exemples :

MUL DH ; (AXAL x DH)

IMUL (Multiplication signe)


Linstruction IMUL fonctionne de la mme faon que linstruction
MUL, mais sur des nombres signs.
Exemple 1 :
MOV BX, 435
MOV AX, 2372
IMUL BX
A lissue de lexcution de ces 3
instructions, AX contient la valeur
BE8C et DX la valeur F, soit la valeur
hexadcimale FBE8C, cest-`a-dire
1031820, le produit de 435 par 2372.

Exemple 2 :
MOV BX, -435
MOV AX, 2372
IMUL BX
A lissue de lexcution de ces 3
instructions, AX contient la valeur
4174 et DX la valeur FFF0, soit la
valeur -1031820, le produit de -435
par 2372.

DIV et IDIV (Division)


Syntaxe : DIV oprande
IDIV oprande
Lopration effectue est :

Si oprande est sur 8 bits : AL = Quotient et AH = reste de ( AX / oprande).


Si oprande est sur 16 bits : AX = Quotient et DX = reste de ( (DX:AX) / oprande).

Oprandes autoriss :

registre sur 8 ou 16 bits;


mmoire sur 8 ou 16 bits.

Indicateurs affects :
DIV :
IDIV :

OF DF IF TF SF ZF

AF

PF

CF

OF DF IF TF SF ZF

AF

PF

CF

Dans le cas dune division sur 16 bits les indicateurs ne sont pas affects.

DIV et IDIV (Division)


Exemple 1 :
MOV BX, FFFEh
MOV AX, 2372H
MOV DX, 0172H
DIV BX
A lissue de lexcution de ces 4
instructions, AX contient la valeur
0172H et DX la valeur 2656H.
Tous les oprandes sont considrs
comme nombres positifs.

Exemple 2 :
MOV BX, FFFEh
MOV AX, 2372H
MOV DX, 0172H
IDIV BX
A lissue de lexcution de ces 4
instructions, AX contient la valeur
2372H et DX la valeur 0172H.
Un oprande est considr comme un
nombre ngatif si le bit du poids le
plus fort est 1 (bit signe).

NEG (Complment 2)
Syntaxe : NEG oprande
Lopration effectue est :
oprande oprande + .
Oprandes autoriss :
Registre ;
Mmoire.

Indicateurs affects :
OF DF IF TF SF ZF

Exemple :

mov al, 36h


neg al

AF

PF

CF

Exercice 2
Soit les nombres a, b et c stocks en mmoire tel que :
a est stock ladresse 100H.
b est stock ladresse 101H.
c est stock ladresse 102H.

Ecrire un programme en assembleur 8086 qui permet dvaluer


lexpression suivante :
d = a2 / (2b + c).
Et stocker le rsultat en mmoire ladresse 200H.

Les instructions logiques


Ce sont des instructions qui permettent de manipuler des donnes
au niveau des bits.
Les oprations logiques de base sont :
ET;
OU;
OU exclusif ;
Complment 1;

Les diffrents modes dadressage sont disponibles.

AND (ET logique)


Syntaxe : AND oprande1, oprande2
Lopration effectue est :
oprande1 oprande1 ET oprande2.
Oprandes autoriss :

Registre et registre;
Registre et mmoire.
Mmoire et registre.
Registre et immdiat.
Mmoire et immdiat.

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

AND (ET logique)


Exemple :
mov al,10010110B
mov bl,11001101B
and al, bl

10010110
11001101
10000100

Application : masquage de bits pour mettre zro certains bits dans


un mot.

OR (OU logique)
Syntaxe : OR oprande1, oprande2
Lopration effectue est :
oprande1 oprande1 OU oprande2.
Oprandes autoriss :

Registre et registre;
Registre et mmoire.
Mmoire et registre.
Registre et immdiat.
Mmoire et immdiat.

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

OR (OU logique)
Exemple :
mov al,10010110B
mov bl,11001101B
or al, bl

10010110
11001101
11011111

Application : mise 1 dun ou plusieurs bits dans un mot.

XOR (OU exclusif)


Syntaxe : XOR oprande1, oprande2
Lopration effectue est :
oprande1 oprande1 oprande2.
Oprandes autoriss :

Registre et registre;
Registre et mmoire.
Mmoire et registre.
Registre et immdiat.
Mmoire et immdiat.

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

XOR (OU exclusif)


Exemple :
mov al,10010110B
mov bl,11001101B
xor al, bl

10010110
11001101
01011011

NOT (Complment 1)
Syntaxe : NOT oprande
Lopration effectue est :
oprande oprande.
Oprandes autoriss :
Registre ;
Mmoire.

Indicateurs affects :
OF DF IF TF SF ZF

Exemple :

mov al, 36h


not al

AF

PF

CF

Les instructions de dcalages et de rotations


Ces instructions dplacent dun certain nombre de positions les bits
dun mot vers la gauche ou vers la droite.
Dans les dcalages, les bits qui sont dplacs sont remplacs par des
zros.
Il y a les dcalages logiques (oprations non signes) et les dcalages
arithmtiques (oprations signes).
Dans les rotations, les bits dplacs dans un sens sont rinjects de
lautre ct du mot.

SHR (Dcalage vers la droite)


Syntaxe : SHR oprande, n
Cette instruction dcale loprande de n positions vers la droite.
Oprandes autoriss :

Registre et 1 ;
Registre et CL ;
Mmoire et 1 ;
Mmoire et CL.

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

Remarque :
si le nombre de bits dcaler est suprieur 1, ce nombre doit tre
plac dans le registre CL.

SHR (Dcalage vers la droite)


Exemple :
mov al,11001011B
shr al,1
CF
10

Remarque : un dcalage droite est quivalent une division par 2.

SHL (Dcalage vers la Gauche)


Syntaxe : SHL oprande, n
Cette instruction dcale loprande de n positions vers la gauche.
Oprandes autoriss :

Registre et 1 ;
Registre et CL ;
Mmoire et 1 ;
Mmoire et CL.

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

Remarque :
si le nombre de bits dcaler est suprieur 1, ce nombre doit tre
plac dans le registre CL.
Un dcalage gauche est quivalent une multiplication par 2.

SAR (Dcalage Arithmtique vers la droite)


Syntaxe : SAR oprande, n
Cette instruction dcale loprande de n positions vers la droite.
Ce dcalage conserve le bit de signe bien que celui-ci soit dcal.
Oprandes autoriss :
Registre
Mmoire

Indicateurs affects :
OF DF IF TF SF ZF

AF

PF

CF

SAR (Dcalage Arithmtique vers la droite)


Exemple :
mov al,11001011B
sar al,1
CF
1

Remarque : le dcalage arithmtique gauche (SAL) est identique au


dcalage logique gauche (SHL).

ROR (Rotation droite)


Syntaxe : ROR oprande, n
Cette instruction dcale loprande de n positions vers la droite.
Les bits qui sortent par la droite sont injects par la gauche.
Oprandes autoriss :
Registre / Mmoire et 1 ;
Registre / Mmoire et CL ;

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

Remarque :
Si le nombre de bits dcaler est suprieur 1, ce nombre doit tre
plac dans le registre CL.

ROR (Rotation droite)


Exemple :
MOV AL,11001101B
ROR AL,1
1

CF
0

Remarque : La rotation gauche (ROL), se ralise comme la rotation


droite, mais dans l'autre sens: Le bit qui sort gauche est inject
la droite.

RCR (Rotation droite avec passage par


lindicateur de retenue)
Syntaxe : RCR oprande, n
Cette instruction dcale loprande de n positions vers la droite en
passant par lindicateur de retenue CF.
Oprandes autoriss :
Registre / Mmoire et 1 ;
Registre / Mmoire et CL ;

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

Le bit sortant par la droite est copi dans lindicateur de retenue CF


et la valeur prcdente de CF est rinjecte par la gauche.

RCR (Rotation droite avec passage par


lindicateur de retenue)
Exemple :
MOV AL,11001101B
RCR AL,1
1

CF
X

Remarque : Linstruction RCL fonctionne de la mme faon, mais


dans l'autre sens.

Les instructions de pile


Une pile est une zone mmoire servant stocker temporairement
des valeurs.
On ne peut stocker qu'une information la fois et l'lment dpil
un moment donn est celui qui a t empil en dernier : c'est la
structure LIFO (Last In, First Out).
Les oprations ne se font que sur 16 bits.
La pile commence au segment SS et elle finit dans le mme segment
mais l'offset SP.
A noter que cette pile est remplie l'envers : le premier lment est
situ une adresse plus haute que le dernier lment.

Linstruction dempilement (PUSH)


L'empilement d'une donne est ralis par l'instruction :
PUSH donne
O donne est un registre 16 bits ou un emplacement mmoire
dsign par adressage direct ou indirect.
L'empilement s'effectue en deux tapes :
SP SP 2 : on fait reculer SP de deux cases (donne sur 16 bits),
pour qu'il pointe sur le nouveau sommet susceptible de recevoir la
donne empiler.
[SP] donne : le sommet de la pile reoit la donne.

Linstruction dempilement (PUSH)


Exemple :
Soit AX = 1225h et soit l'instruction : PUSH AX.
Aprs linstruction :

Avant linstruction :
1Ch
13h
55h

SS:SP

FEh
22h
4Ah
98h

1Ch
13h
55h

SS:SP-2
Donne dj
empile

25h
12h
4Ah
98h

Linstruction de dpilement (POP)


Le dpilement est l'opration qui permet de retirer le sommet de la
pile et le stocker dans une destination.
Il est ralis par l'instruction :
POP destination
Destination est un registre 16 bits ou un emplacement mmoire
dsign par adressage direct ou indirect.
Le dpilement engendre deux oprations :
destination [SP] : le sommet de la pile est copi dans destination.
SP SP + 2 : la donne du sommet tant retire, on fait avancer SP
pour pointer sur la donne suivante.

Linstruction dempilement (PUSH)


Exemple :
Considrons l'instruction : POP DX
Avant linstruction :

SS:SP

1Ch
13h
55h
39h
58h
4Ah
98h

Aprs linstruction :

Sommet de
la pile

SS:SP + 2

1Ch
13h
55h
39h
58h
4Ah
98h

Le registre DX est charg par la valeur 5839h.

Autres instructions de pile


PUSHA (Push All): Empile les 8 registres gnraux.
Les registres sont empils dans l'ordre AX, CX, DX, BX, SP, BP, SI, DI.
La valeur empile de SP est celle avant le dbut de l'instruction.
POPA (Pop All): Dpile les 16 octets du sommet de la pile vers les 8
registres gnraux.
Les registres sont dpils dans l'ordre DI, SI, BP, SP, BX, DX, CX, AX.
En fait, le registre SP pose un cas particulier, puisqu'il n'est pas mis
jour avec la valeur dpile qui n'est pas prise en compte.
PUSHF (Push Flags): Empile le registre des indicateurs.
POPF (Pop Flags): Dpile vers le registre des indicateurs.

CMP (Comparaison)
Syntaxe : CMP oprande1, oprande2
Soustrait l'oprande 2 de l'oprande 1.
Positionne les indicateurs en fonction du rsultat qui n'est pas
stock.
Oprandes autoriss :
Registre et registre;
Registre et mmoire.
Mmoire et registre.
Registre / Mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

TEST (Comparaison logique)


Syntaxe : TEST oprande1, oprande2
Teste les bits de l'oprande 1 spcifis par l'oprande 2.
Cette instruction effectue un ET logique, bit bit, entre les deux
oprandes, positionne les indicateurs, mais le rsultat n'est pas
stock.
Oprandes autoriss :

Registre et registre;
Registre et mmoire.
Mmoire et registre.
Registre / Mmoire et immdiat.

Indicateurs affects :

OF DF IF TF SF ZF

AF

PF

CF

Les instructions de branchement


Les instructions de branchement (ou saut) permettent de modifier
lordre dexcution des instructions du programme en fonction de
certaines conditions.
Il existe 3 types de saut :
saut inconditionnel ;
saut conditionnel ;
appel de sous-programmes.

JMP (Saut inconditionnel)


Syntaxe : JMP label
Cette instruction effectue un saut (jump) vers le label spcifi.
Un label (ou tiquette) est une reprsentation symbolique de
ladresse dune instruction en mmoire.
Linstruction JMP ajoute au registre IP (pointeur dinstruction) le
nombre doctets (distance) qui spare linstruction de saut de sa
destination.
Pour un saut en arrire, la distance est ngative (code en
complment 2).

Les sauts conditionnels


Syntaxe : JCondition label
Un saut conditionnel nest excut que si une certaine condition est
satisfaite, sinon lexcution se poursuit squentiellement
linstruction suivante.
La condition du saut porte sur ltat de lun (ou plusieurs) des
indicateurs dtat (flags) du microprocesseur.
Les indicateurs sont positionns en fonction du rsultat de la
dernire opration.
Il existe des sauts arithmtiques. Ils suivent en gnral linstruction
de comparaison.

Les sauts conditionnels


Mnmonique
JC
JNC
JZ
JNZ
JP
JNP
JPE
JPO
JO
JNO
JS
JNS

Signification
Jump If Carry
Jump If Not Carry
Jump If Zero
Jump If Not Zero
Jump If Parity
Jump If Not Parity
Jump If Parity Even
Jump If Parity Odd
Jump If Overflow
Jump If Not Overflow
Jump If Sign
Jump If Not Sign

Condition
CF = 1
CF = 0
ZF = 1
ZF = 0
PF = 1
PF = 0
PF = 1
PF = 0
OF = 1
OF = 0
SF = 1
SF = 0

Les sauts conditionnels


Mnmonique
JCXZ
JNA
JNB
JNAE
JNBE
JE
JNE

Signification
Jump If CX Register is Zero
Jump If Not Above
Jump If Not Below
Jump If Not Above nor Equal
Jump If Not Below nor Equal
Jump If Equal
Jump If Not Equal

Condition
(CF ou ZF) = 0
CF =1 ou ZF = 1
CF = 1
CF = 1
CF = 0 et ZF = 0
ZF = 1
ZF = 0

Les sauts conditionnels


Mnmonique
JA
JAE
JB
JBE
JG
JGE
JNG
JNGE
JL
JLE
JNL
JNLE

Signification
Jump If Above
Jump If Above or Equal
Jump If Below
Jump If Below or Equal
Jump If Greater
Jump If Greater or Equal
Jump If Not Greater
Jump If Not Greater nor Equal
Jump If Less
Jump If Less or Equal
Jump If Not Less
Jump If Not Less nor Equal

Condition
CF = 0 et ZF = 0
CF = 0
CF = 1
CF = 0 ou ZF = 0
ZF = 0 et SF = 0
SF = 0
((SF xor OF) ou ZF) = 1
(SF xor OF) = 1
(SF xor OF) = 1
((SF xor OF) ou ZF) = 1
SF = OF
ZF = 0 et SF = OF

Exercice 3
Ecrire un programme en Assembleur 8086 qui permet de :
Comparer les valeurs contenues dans les registres AL, BL et
CL pour trouver le minimum et le maximum de ces trois
valeurs.
Stocker le minimum en mmoire ladresse 100H.
Stocker le maximum en mmoire ladresse 200H.

Les boucles
Il nexiste pas de structure gnrale en assembleur pour coder
une boucle tant-que ou une boucle rpter.
Cependant, laide des instructions vues prcdemment pour
raliser des tests, on peut coder nimporte quel type de
boucle.
On verra galement que des instructions simplifient
grandement le codage des boucles pour (boucle for).

Principe gnral
Une boucle est essentiellement compose de deux lments :
Une condition de sortie qui indique quand la boucle doit tre
interrompue, quil faut sortir de la boucle et continuer
lexcution des instructions en squence.
Un corps de boucle qui spcifie laction raliser pendant que
la condition de sortie nest pas vrifie, chaque itration de
la boucle.
La condition de sortie va donc tre code dune manire
ressemblant aux tests.

Principe gnral
Un saut conditionnel testera cette condition et entranera,
quand la condition est vrifie, la sortie de la boucle.
Le corps de la boucle devra pour sa part (boucler),
cest--dire, une fois excut, entraner le rvaluation de la
condition de sortie
et la prise de dcision quant la poursuite ou non des
itrations.

Boucles tant-que
Le squelette dune boucle tant-que, dans un langage de haut niveau,
est le suivant :
TANT-QUE (condition) FAIRE
action
FIN_TQ

Cela va se traduire en assembleur sous la forme suivante :


TQn: calcul de la condition
Jcc FTQn
action
...
JMP TQn
FTQn:
...

Boucles rpter
Le squelette dune boucle rpter, dans un langage de haut niveau,
est le suivant :
REPETER
action
JUSQUA (condition vraie)

Cela va se traduire en assembleur sous la forme suivante :


REPETERn: action
...
calcul de la condition
Jcc REPETERn

Boucles pour
Une boucle pour est gnralement code laide dune instruction de
la famille LOOP.
Syntaxe : LOOP label
LOOP fonctionne avec le registre CX qui joue le rle de compteur de
boucles.
LOOP dcrmente le compteur Sans Modifier Aucun Des Indicateurs.
Si le compteur est diffrent de 0, un saut ltiquette oprande de
linstruction LOOP est ralis.
Le squelette dune boucle pour scrit de la manire suivante :
POUR indice = 0 bs FAIRE
Action
Fin pour

Boucles pour
Cependant, en assembleur, seules existent des boucles ayant un
indice qui est dcrment chaque itration.
Aussi, la boucle prcdente doit initialement tre transforme en une
boucle du type suivant :
POUR indice = bs 0, pas := -1 FAIRE
action
Fin pour

Cette boucle se traduit en assembleur de la manire suivante :


mov cx, n ; n est le nombre ditrations
POURn: ...
action
loop POURn

Exemple
Ecrire un programme en assembleur qui permet de transfrer les 100
octets de donnes situs ladresse 3000H vers ladresse 4000H.

Label:

MOV SI, 3000 H ; charger ladresse de source dans SI


MOV DI, 4000 H ; charger ladresse de destination dans DI
MOV CX, 64 H ; initialiser CX 64h (100)
MOV AH, [SI] ; charger loctet source dans AH
MOV [DI], AH ; charger AH (loctet source) dans la destination
INC SI ; incrmenter SI pour pointer le prochain octet source
INC DI ; incrmenter DI pour pointer la prochaine destination
DEC CX ; dcrmenter le compteur de boucle
JNZ Label ; sauter vers Label
HLT ; fin du programme.

Exemple
Le programme prcdent peut tre crit de la manire suivante :

Label:

MOV SI, 3000 H ; charger ladresse de source dans SI


MOV DI, 4000 H ; charger ladresse de destination dans DI
MOV CX, 64 H ; initialiser CX 64h (100)
MOV AH, [SI] ; charger loctet source dans AH
MOV [DI], AH ; charger AH (loctet source) dans la destination
INC SI ; incrmenter SI pour pointer le prochain octet source
INC DI ; incrmenter DI pour pointer la prochaine destination
LOOP Label ; boucler tant que CX 0
HLT ; fin du programme.

LOOPE (LOOP while Equal)


Cette instruction a la mme fonction que l'instruction LOOP.
Elle dcrmente le compteur de boucle CX de 1,
Et compare CX avec 0,
Si ce n'est pas gale, elle saute au label spcifi,
Mais, de plus, elle ne saute au label que si l'indicateur ZF est
gal 1,
Donc si la dernire opration effectue a positionn cet
indicateur.
Remarque :
Linstruction LOOPE est quivalente linstruction LOOPZ.

LOOPE (LOOP while Equal)


Exemple :
Recherche dun premier lment non nul dans un tableau de
100 octets stock en mmoire ladresse 1000H.
Stocker lindice de cet lment en mmoire ladresse 1202H.
Si aucun lment nest trouv, stocker -1 cette adresse.

LOOPNE (LOOP while Not Equal)


Cette instruction dcrmente CX
et effectue un saut ladresse si CX 0 et ZF = 0.
Remarque :
Linstruction LOOPNE est quivalente linstruction LOOPNZ.
Exemple :
Recherche dun premier lment nul dans un tableau de 100
octets stock en mmoire ladresse 1000H.
Stocker lindice de cet lment en mmoire ladresse 1202H.
Si aucun lment nest trouv, stocker -1 cette adresse.

Exercice 4
Ecrire un programme en Assembleur 8086 qui permet de
compter le nombre de bits 1 dans un tableau de 10 octets,
se trouvant en mmoire ladresse 200H.
Le rsultat sera stock dans un registre.

Dclaration de variables en Assembleur


On dclare les variables l'aide de directives.
L'assembleur attribue chaque variable une adresse.
Dans le programme, on repre les variables grce leurs noms.
Les noms des variables (comme les tiquettes) sont composs d'une
suite de 31 caractres au maximum, commenant obligatoirement
par une lettre.
Le nom peut comporter des majuscules, des minuscules, des chiffres,
plus les caractres @, ? et _.
Lors de la dclaration d'une variable, on peut lui affecter une valeur
initiale.

Dclaration de variables en Assembleur


Les directives DB (Define Byte) et DW (Define Word) permettent de
dclarer des variables de respectivement 1 ou 2 octets.
Exemple :
truc DW 0F0AH ; 2 octets initialiss 0F0A en hexadcimal.
masque DB 01110000b ; 1 octet initialis 01110000 en binaire.

Les variables s'utilisent dans le programme en les dsignant par leurs


noms.
Aprs la dclaration prcdente, on peut crire par exemple :
MOV AX, truc
AND AL, masque
MOV truc, AX

L'assembleur se charge de remplacer les noms de variables par les


adresses correspondantes.

Dclaration de variables en Assembleur


Il est aussi possible de dclarer des tableaux, c'est dire des
suites d'octets ou de mots conscutifs.
Pour cela, on utilise plusieurs valeurs initiales :
machin db 10, 0FH ; 2 fois 1 octet
chose db -2, ALORS ; un nombre et une chane de caractres.

Si l'on veut crire un caractre X la place du O de ALORS, on


pourra crire :
MOV AL, 'X'
MOV chose + 3, AL

Dclaration de variables en Assembleur


Lorsque l'on veut dclarer un tableau de n cases, toutes initialises
la mme valeur, on utilise la directive DUP :
tab DB 100 dup (15) ; 100 octets valant 15
zzz DW 10 dup (?) ; 10 mots de 16 bits non initialiss.

Dclaration dune constante


La directive EQU associe une valeur un symbole qui pourra tre
ensuite utilis dans le programme la place de la constante quelle
dfinit.
nom EQU constante
Par exemple, la commande :
Trois EQU 3
dfinit une constante qui sappelle Trois, dont la valeur est 3.
Une fois cette dclaration effectue,
Toute occurrence de lidentificateur Trois sera remplace par la
valeur indique.

Gestion des indicateurs


Nous dcrivons ici quelques instructions ne prenant aucun oprande
et agissant chacune sur un bit particulier du registre dindicateurs
FLAGS.
CLC (Clear Carry Flag) mise zro de lindicateur de retenue CF.
CLD (Clear Direction Flag) mise zro de lindicateur de direction DF.
CLI (Clear Interrupt Flag) mise zro du masque dinterruption IF.
CMC (Complement Carry Flag) complmente lindicateur CF.
STC (Set Carry Flag) mise 1 de lindicateur CF.
STD (Set Direction Flag) mise 1 de lindicateur DF.
STI (Set Interrupt Flag) mise 1 du masque dinterruption IF.

Manipulation de chanes de donnes


Des instructions spcialement sont conues pour le traitement de
squences de donnes,
Les donnes peuvent tre des caractres (des octets) ou des mots.
Il y a cinq types dinstruction :
LODS : chargement dun lment de chane depuis la mmoire dans
un registre.
STOS : criture dun lment de chane en mmoire.
MOVS : transfert dun lment entre deux chanes.
CMPS : comparaison entre deux lments de chane.
SCAS : comparaison entre une valeur et un lment de chane.

Linstruction REP (Repeat)


Cette instruction permet ditrer sur toute une chane les oprations
lmentaires vues prcdemment.
Cette instruction prfixe en fait lopration itrer.
Elle donne tout son intrt aux instructions de manipulation des
chanes de donnes.
L'oprande de cette instruction est une instruction.
Le processeur effectue cette instruction, et dcrmente le registre
CX, jusqu' ce que celui-ci soit nul.
Il faut donc plac pralablement le nombre de fois rpter
l'instruction dans le registre CX.
Il existe plusieurs variantes de linstruction REP.

LODS (Load String Data)


Syntaxe : LODSB ou LODSW
L'oprande est un octet : LODSB (Load String Byte)
LODSB: charge AL avec l'octet point par DS:SI,
puis met jour le contenu de SI en fonction de l'indicateur DF (DF = 0
: SI est incrment, DF = 1 : SI est dcrment).
L'oprande est un mot de 16 bits : LODSW (Load String Word)
LODSW: charge AX avec le mot point par DS:SI,
puis met jour le contenu de SI en fonction de l'indicateur DF (DF = 0
: SI est doublement incrment, DF = 1 : SI est doublement
dcrment).

STOS (Store String Data)


Syntaxe : STOSB ou STOSW
L'oprande est un octet : STOSB (Store String Byte)
STOSB: charge l'octet point par ES:DI avec le contenu de AL,
puis met jour le contenu de DI en fonction de l'indicateur DF.
L'oprande est un mot de 16 bits : STOSW (Store String Word).
STOSW: charge le mot de 16 bits point par ES:DI avec le contenu de
AX,
puis met jour le contenu de DI en fonction de l'indicateur DF.

MOVS (Move String Data)


Syntaxe : MOVSB ou MOVSW
L'oprande est un octet : MOVSB (Move String Byte)
MOVSB: copie un octet de l'adresse DS:SI l'adresse ES:DI,
SI et DI sont ensuite incrments de 1 (si DF=0) ou dcrments de 1
(si DF=1).
L'oprande est un mot de 16 bits : MOVSW (Move String Word)
MOVSW: copie un mot de l'adresse DS:SI l'adresse ES:DI,
SI et DI sont ensuite incrments de 2 (si DF=0) ou dcrments de 2
(si DF=1).

CMPS (Compare String Data)


Syntaxe : CMPS
L'oprande est un octet : CMPSB (Compare String Byte)
CMPSB compare deux chanes formes d'une suite d'octets.
L'oprande est un mot de 16 bits : CMPSW (Compare String Word)
CMPSW compare deux chanes formes d'une suite de mots.
DS:SI doivent contenir l'adresse de la chane source,
et ES:DI celle de la chane destination.
Pour chaque octet des chanes comparer, une soustraction est effectue dont le
rsultat est utilis pour mettre jour les indicateurs,
puis les registres SI et DI sont incrments ou dcrments selon la valeur de DF.

SCAS (Scan String Data)


Syntaxe : SCAS
L'oprande est un octet : SCASB (Scan String Byte)
SCASB recherche dans une chane l'octet spcifi par le contenu de AL.
L'oprande est un mot de 16 bits : SCASW (Scan String Word)
SCASW recherche dans une chane le mot spcifi par le contenu de AX.
ES:DI contiennent l'adresse de la chane analyse.
Pour chaque octet ou mot de la chane une soustraction est effectue avec le
caractre recherch, dont le rsultat est utilis pour mettre jour les
indicateurs,
puis DI est incrment ou dcrment suivant la valeur DF.

REP (Repeat String)


Syntaxe : REP MOVS ou REP STOS
Prfixe de rptition de chane.
L'instruction prfixe est rpte le nombre de fois spcifi par le
contenu du registre CX.
Pour chaque lment de la chane, l'instruction est excute et le
contenu de CX est dcrment.
Lorsque le contenu de CX atteint 0, l'excution continue
l'instruction suivante.
En principe REP est utilis avec l'une des instructions MOVS ou STOS.

Exemple
Ecrire un programme en assembleur 8086 qui copie la chane Msg1
dans Msg2 (avec Msg1 = Hello).
Msg1 DB Hello
Msg2 DB ?
MOV SI, OFFSET Msg1
MOV DI, OFFSET Msg2
MOV CX, 5
REP MOVSB
HLT

REPE (Repeat String while Equal)


REPZ (Repeat String while Zero)
Syntaxe : REPE CMPS / REPZ CMPS ou REPE SCAS / REPZ SCAS
Rpter tant que ZF = 1.
L'instruction prfixe est rpte tant que la condition est vraie et au
maximum le nombre de fois spcifi par le contenu du registre CX.
Pour chaque lment de la chane, l'instruction est excute et le contenu de
CX est dcrment.
Lorsque le contenu de CX atteint 0, ou lorsque la condition est fausse,
l'excution continue l'instruction suivante.
REPE / REPZ ne peut tre utilise qu'avec l'une des instructions SCAS ou CMPS :
ce sont les seules instructions de chane modifiant l'indicateur ZF.

REPNE (Repeat String while Not Equal)


REPNZ (Repeat String while Not Zero)
Syntaxe : REPNE CMPS / REPNZ CMPS ou REPNE SCAS / REPNZ SCAS
Rpter tant que ZF = 0.
L'instruction prfixe est rpte tant que la condition est vraie et au
maximum le nombre de fois spcifi par le contenu du registre CX.
Pour chaque lment de la chane, l'instruction est excute et le contenu de
CX est dcrment.
Lorsque le contenu de CX atteint 0, ou lorsque la condition est fausse,
l'excution continue l'instruction suivante.
REPNE / REPNZ ne peut tre utilise qu'avec l'une des instructions SCAS ou
CMPS : ce sont les seules instructions de chane modifiant l'indicateur ZF.

Exemple
Ecrire un programme qui permet de vrifier si le caractre contenu
dans AL est une minuscule ou un majuscule.
Si cest une minuscule BL = 0, si non BL = 1.
Si ce nest ni minuscule ni majuscule BL = -1.