Processeur8086 PDF

Vous aimerez peut-être aussi

Vous êtes sur la page 1sur 53

Microprocesseur 8086

par A. Oumnad

MICROPROCESSEURS
DE LA FAMILLE
8086

Microprocesseur 8086

par A. Oumnad

Sommaire
1

Structure dun processeur En gnral............................................................ 6


1.1
L'unit de calcul.............................................................................................. 6
1.2
L'unit de control ............................................................................................ 7

Le microprocesseur 8086 ............................................................................... 8


2.1
La segmentation de la mmoire ....................................................................... 9
2.2
Les registres du 8086.................................................................................... 10
2.2.1 Les registres gnraux............................................................................... 10
2.2.2 Les registres d'adressage (offset) ............................................................... 11
2.2.3 Les registres de segment ........................................................................... 11
2.2.4 Format dune adresse ................................................................................ 12
2.2.5 Le registre d'tat (flags)............................................................................. 13
2.3
Les modes d'adressage ................................................................................. 14
2.4
Taille des changes avec la mmoire ............................................................. 16
2.5
Les instructions du 8086................................................................................ 18
2.5.1 Les instructions de transfert ....................................................................... 18
2.5.2 Les instructions Arithmtiques .................................................................... 19
2.5.3 Les instructions logiques ............................................................................ 22
2.5.4 Les masques logiques :.............................................................................. 23
2.5.5 Les instructions de dcalage....................................................................... 24
2.5.6 Instructions agissant sur les indicateurs ...................................................... 25
2.5.7 Les instructions de contrle de boucle......................................................... 26
2.5.8 Les instructions de branchement ................................................................ 26
2.5.9 Instructions d'accs aux ports d'E/S ............................................................ 29
2.6
Ce quil ne faut pas faire................................................................................ 30

Lassembleur NASM ...................................................................................... 33


3.1
Les directives de NASM ................................................................................. 33
3.2
Les pseudo instruction de NASM .................................................................... 34
3.3
Les expressions ............................................................................................ 34

Les entre sorties ......................................................................................... 35


4.1.1 L'interruption 10h du BIOS......................................................................... 35
4.1.2 L'interruption 21h du DOS.......................................................................... 37
4.2
Accs direct la mmoire Vido .................................................................... 39
4.3
les temporisations ......................................................................................... 40

Code machine des instructions .................................................................... 42


5.1
Les codes REG, ADR et MOD ......................................................................... 43
5.2
Tableau des codes binaires............................................................................ 43

ANNEXE ........................................................................................................ 48
6.1
Instructions d'ajustement dcimal .................................................................. 48
6.2
Les instructions de manipulation de chanes ................................................... 49
6.3
Instructions de transfert d'adresse ................................................................. 52
6.4
Instructions diverses ..................................................................................... 52

Microprocesseur 8086

par A. Oumnad

Objectif du cours
Dans ce cours on va prsenter le Microprocesseur 8086 de Intel, on va
tudier son jeux d'instruction complet, on va apprendre le programmer en
assembleur et finir par tudier les codes machines.

Pourquoi un cours sur les Microprocesseurs et l'assembleur ? : Parce que c'est la


seule faon de comprendre comment fonctionne un ordinateur l'intrieur. Il devient
ainsi beaucoup plus facile de le programmer l'aide d'autres langages plus volu
comme le Pascal, le C/C++, et les langages visuels.

Pourquoi le 8086 d'Intel ? : Parce que la majeure partie des Ordinateurs individuels
utiliss de nos jours (2007) sont des PCs quips de microprocesseurs Intel
compatibles avec le 8086. C'est--dire que tout programme crit pour tourner sur un
8086 peut tre excut sur un Pentium 4. Ce qui signifie que si on matrise la
programmation

en assembleur du 8086, on a fait un grand pas vers la

programmation de nos PC actuels que ce soit en assembleur ou l'aide d'autres


langages plus volu comme le C/C++.

Attention : Le 8086 est un microprocesseur qui tait destin fonctionner dans des
ordinateurs monotches. C'est--dire qui ne peuvent excuter qu'un seul programme
la fois. Il fonctionnait alors en mode rel, c..d que le programme en cours
d'excution peut accder n'importe quelle ressource de la machine y compris
n'importe quelle zone mmoire. Avec les systmes d'exploitation rcents comme
Windows ou Linux, les ordinateurs sont devenus multitches c'est--dire que le
processeur peut travailler sur plusieurs programmes la fois. Il devient alors
impratif de "rglementer" les accs la mmoire afin qu'un programme ne puisse
pas aller crire dans une zone mmoire utilise par un autre programme. Pour cela,
Les processeurs actuels fonctionnent en mode protg. Ils interagissent avec le
systme d'exploitation qui gre les ressources de la machine et vite les conflits
entre les programmes qui s'excutent simultanment.
Pas de panique, dans la plupart des cas, on peut excuter les programmes destins
au 8086 sur un PC rcent sans aucun problme.

Microprocesseur 8086

par A. Oumnad

INTRODUCTION
Le "Job" d'un processeur est d'excuter des programmes. Un programme est une
suite d'instructions crites une par ligne. Une instruction peut tre plus ou moins
sophistique selon le langage utilis. Pour un langage de bas niveau comme l'assembleur,
une instruction ralise une tache lmentaire comme une addition par exemple. Avec un
langage de haut niveau comme le C++, une instruction peut raliser un ensemble de
taches qui ncessiterait plusieurs instructions en Assembleur. Il va falloir claircir un peut
tout a pour bien comprendre le fonctionnement d'une machine informatique.
Un processeur quel qu'il soit sait excuter un ensemble bien dfini de codes machines
(jeux d'instructions). Chaque code machine est un nombre binaire de quelques octets, il
correspond une instruction lmentaire bien dfinie. Sur papier, on a pris l'habitude de
les reprsenter en hexadcimal pour faciliter.
excutable

Codes machine tels qu'ils


seront prsents au processeur

Codes machine comme


on a pris l'habitude de
les reprsenter sur papier
10111101 01000001 00000000 BD 41 00
10111110 01100101 01000001 BE 65 41
00000001 11011000
01 D8
00111000 01000111 00000011 38 47 03

Source

Ecriture plus lisible dite


Mnmonique
ou Assembleur
MOV BP,41h
MOV SI,4165h
ADD AX,BX
CMP [BX+3],AL

Par exemple, l'instruction (assembleur) MOV BP,41h qui signifie : placer le nombre 41h
dans le registre BP est code (en hexadcimal) par les trois octets BD 41 00 , Dans la suite
de ce cours, nous dsignerons ces octets par : lments d'instruction.
Quand on veut crire un programme, on dispose d'un choix trs important de langages
de programmation diffrents les uns des autres : Assembleur, Basic/Qbasic, Pascal,
C/C++, Visual Basic, Visual C++, Delphi, Java,
En fait, les lignes de programme que nous crivons constituent ce qu'on appelle un
programme source qui sera stock dans un fichier texte dont l'extension dpend du
langage choisi (test.pas pour le pascal, test.cpp pour le c++ etc )
Ces programmes sources sont comprhensibles par nous mais pas par le processeur.
Pour que le processeur puisse les comprendre il faut les traduire (compiler) en langage
machine qui est une suite de codes machine. Sur les PCs, se sont les fichiers avec
l'extension .exe (test.exe). Chaque langage de programmation a son compilateur qui
permet de transformer le programme source en un programme excutable
comprhensible par le processeur. Tous les excutables se ressemblent et le processeur
ne sait pas avec quel langage ils ont t crits.
Avec un langage de haut niveau comme le C++, une instruction que nous crivons
peut tre trs sophistique. C'est le compilateur C++ qui la traduit en un ensemble
d'instructions lmentaires comprhensible par le processeur.

Microprocesseur 8086

par A. Oumnad

L'intrt du langage assembleur est que chaque instruction que nous crivons
correspond une instruction lmentaire du processeur. C'est comme si on travaillait
directement en langage machine. Ainsi, on sait exactement tout ce que fait le processeur
lors de l'excution d'un programme.
Quand on demande l'excution d'un programme, celui-ci est charg par le systme
d'exploitation ( partir du disque dur) dans une zone de la mmoire RAM. Celle-ci tant
organise en octets, chaque lment d'instruction est stock dans une position mmoire.
L'adresse (le numro) de la case mmoire de dbut est communique au processeur pour
qu'il commence l'excution au bon endroit.
Adresses

4000
4001
4002
4003
4004
4005
4006

BD
41
00
BE
65
41
65

Dbut du programme

Microprocesseur 8086

par A. Oumnad

1 STRUCTURE DUN PROCESSEUR EN GENERAL


Les diffrents constituants du Processeur peuvent tre regroups dans deux blocs
principaux, l'unit de calcul et l'unit de control.
Unit de Calcul

Unit de Control
BUS

registre

registre

registre

registre

registre

registre

PC

RI
Decodeur

ALU

Squenceur
RE

registre

Horloge

Fig. 1.1 : Architecture simplifie d'un processeur

1.1 L'UNITE DE CALCUL


Elle est constitue de lUnit Arithmtique et logique UAL et dun certain nombre de
registres
L'ALU :
Elle est constitue d'un circuit logique
combinatoire qui reoit deux oprandes A (An
. . . A1 A0) et B (Bn . . . B1 B0) et produit le
rsultat S (Sm . . . S1 S0) selon l'indication
applique sur l'entre C (Ck . . . C1 C0). Les
oprations ralises peuvent tre soit
arithmtiques, S=A+B, S=A-B, S=AxB ou
logiques S=A OU B, S=A ET B, S= A XOR B
Les registres :
Ce sont des mmoires lmentaires
pouvant contenir chacun un oprande. Les
registres peuvent tre de 8, 16 ou 32 bits.

B
...

...
An

Bn

A2 A1 A0

B2 B1 B0
C0

. C1
.
.
Ck
Sm

S2S1S0

...
S
Fig. 1.2 : Unit arithmtique et logique

Microprocesseur 8086

par A. Oumnad

1.2 L'UNITE DE CONTROL


C'est l'unit de control qui supervise le droulement de toutes les oprations au sein
du Processeur. Elle est constitue principalement de :
l'horloge
C'est l'horloge qui gnre les signaux qui permettent le cadencement et la
synchronisation de toutes les oprations. Attention, l'horloge n'est pas une montre au sens
commun du terme, c'est juste un signal carr qui a une frquence fixe (3 Ghz par
exemple), a chaque coup (front) d'horloge, le microprocesseur (qui ne l'oublions pas n'est
qu'un circuit lectronique) ralise une tache lmentaire. L'excution d'une instruction
ncessite plusieurs coups d'horloges.

Il existe des processeurs qui excutent une instruction par coup d'horloge, ce n'est pas
le cas du 8086.
Le compteur programme PC
Le compteur programme (PC : program counter) est un registre (pointeur) qui
contient l'adresse de la case mmoire o est stocke le prochain lment d'instruction qui
devra tre charg dans le processeur pour tre analys et excut. Au dbut de
l'excution d'un programme, le PC est initialis par le systme d'exploitation l'adresse
mmoire o est stocke la premire instruction du programme. Le compteur programme
est incrment automatiquement chaque fois qu'un lment d'instruction est est charge
dans le processeur
Le registre d'instruction RI
C'est l o le CPU stocke l'instruction en cours d'excution.
Le dcodeur
C'est lui qui va "dcoder" l'instruction contenue dans RI et gnrer les signaux logiques
correspondant et les communiquer au squenceur.
Le squenceur
Il gre le squencement des oprations et gnre les signaux de commande qui vont
activer tous les lments qui participeront l'excution de l'instruction et spcialement
l'ALU.
Le registre d'tat
Le registre d'tat est form de plusieurs bits appels drapeaux ou indicateurs (Flags )
qui sont positionns par l'ALU aprs chaque opration. Par exemple lindicateur Z indique
quand il est positionn que le rsultat de l'opration est gal Zro. Lindicateur C indique
que l'opration a gnr une retenue. Le bit N indique que le rsultat est ngatif
On dispose d'un jeu d'instructions conditionnes par l'tat de diffrents drapeaux

Microprocesseur 8086

par A. Oumnad

2 LE MICROPROCESSEUR 8086
Disponible depuis 1987, le 8086 fut le premier microprocesseur 16 bits fabriqu par
Intel. Parmi ses caractristiques principales, on peut citer :

Il se prsente sous forme d'un botier de 40 broches aliment par une alimentation
unique de 5V.
Il possde un bus multiplex adresse/donne de 20 bits.
Le bus de donne occupe 16 bits ce qui permet d'changer des mots de 2 octets
Le bus d'adresse occupe 20 bits ce qui permet d'adresser 1 Moctets (220)
Il est entirement compatible avec le 8088, le jeu d'instruction est identique. La
seule diffrence rside dans la taille du bus de donnes, celui du 8088 fait seulement
8 bits. Les programmes tourneront donc un peu plus lentement sur ce dernier
puisqu'il doit changer les mots de 16 bits en deux tapes.
Tous les registres sont de 16 bits, mais pour garder la compatibilit avec le
8085/8088, certains registres sont dcoups en deux et on peut accder sparment
la partie haute et la partie basse.

AX
BX
CX
DX
BP
SP
SI
DI

CS
DS
SS
ES

RE

Calcul
d'adresse

Interface avec
BUS externes

BUS interne 16 bits

RT

RT
dcodage
contrle
squencement

File d'attente

RE
Fig. 2.1 : Synoptique fonctionnel du 8086

BUS externe

Microprocesseur 8086

par A. Oumnad

2.1 LA SEGMENTATION DE LA MEMOIRE


Le 8086 possde 20 bits d'adresse, il peut donc adresser 220 octets soit 1 Mo.
L'adresse de la premire case mmoire est 0000 0000 0000 0000 0000 celle de la dernire
casse est 1111 1111 1111 1111 1111 1111. Il me parat inutile de justifier pourquoi
partir de cet instant, nous allons reprsenter les adresses en hexadcimal, et notre 8086
peut donc adresser 1 Mo allant de 00000 FFFFF. Le problme qui se pose est comment
reprsenter ces adresses au sein du P puisque les registres ne font que 16 bits soit 4
digits au maximum en hexadcimal. La solution adopte par Intel a t la suivante :
Puisque avec 16 bits en peut adresser 216 octets = 65535 octets = 64 ko, La mmoire
totale adressable de 1 Mo est fractionne en pages de 64 ko appels segments. On utilise
alors deux registres pour adresser une case mmoire donne, Un registre pour adresser le
segment qu'on appelle registre segment et un registre pour adresser l'intrieur du
segment qu'on dsignera par registre d'adressage ou offset. Une adresse se prsente
toujours sous la forme segment:offset
A titre d'exemple, procdons au dcoupage de la mmoire en 16 segments qui ne se
chevauche pas.
Segment

Adresse dbut

Adresse fin

Segment 0
Segment 1
Segment 2

00000
10000
20000

0FFFF
1FFFF
2FFFF

Pointeur de
segment
00000
10000
20000

Segment 14
Segment 15

E0000
F0000

EFFFF
FFFFF

E0000
F0000

Considrons la case mmoire d'adresse 20350, appele adresse absolue ou adresse


linaire. Cette case mmoire se situe dans le segment 2, son adresse relative ce
segment est 350, on peut donc la rfrencer par le couple segment:offset = 20000:350,
Se pose maintenant le problme de la reprsentation de cette adresse au sein du CPU
car les registres de 16 bits ne peuvent contenir que 4 digits. S'il n'y a aucun problme
pour reprsenter 350 dans un registre d'offset, on ne peut pas reprsenter 20000 dans un
registre segment. La solution adopte par Intel est la suivante :
Dans le registre segment, on crit l'adresse segment sans le chiffre de faible poids
Dans le registre d'adressage (d'offset) on crit l'adresse relative dans le segment
Pour calculer l'adresse absolue qui sera envoye sur le bus d'adresse de 20 bits, le
CPU procde l'addition des deux registres aprs avoir dcal le registre segment
d'un chiffre gauche :

X X X X 0
+

X X X X
X X X X X

Segment
Offset
Adresse absolue

Fig. 2.2 : calcul d'adresse dans un 8086

Dans notre exemple, l'adresse de la case mmoire considre devient 2000:350 soit :
Segment = 2000
Offset = 350

Microprocesseur 8086

10

par A. Oumnad

L'adresse absolue est calcule ainsi :

Segment

2 0 0 0
3 5 0

2 0 3 5

Offset
Adresse absolue

Fig. 2.3 : exemple de calcul d'adresse

Remarque :
Les zones rserves aux segments ne sont pas exclusives, elles peuvent se
chevaucher. La seule rgle respecter lors du choix d'un segment est que le digit de plus
faible poids soit nul. Nous pouvons donc commencer un segment tous les 16 octets.
Adresse absolue valide
pour dbut de segment
00000
00010
00020
...

segment
0000
0001
0002
...

Exercice 1)
1. Donner les adresses linaires (absolues) des mmoires 3500:AB00, 0022:FFFF,
2. Proposer au moins deux adresses segment:offset diffrentes pour les mmoires
d'adresse linaire 10000, FFFFF, 00000

2.2 LES REGISTRES DU 8086


Registres gnraux

Registres d'adressage Registres de segment Registres de commande

AX

AH

AL

SP

CS

IP

BX

BH

BL

BP

DS

FLAGS

CX

CH

CL

SI

SS

DX

DH

DL

DI

ES

Fig. 2.4 : les registres du 8086

Tous les registres et le bus interne du 8086 sont structurs en 16 bits.


Vu de l'utilisateur, le 8086 comprend 3 groupes de 4 registres de 16 bits, un registre
d'tat de 9 bits et un compteur programme de 16 bits non accessible par l'utilisateur.
2.2.1 Les registres gnraux
Les registres gnraux participent aux oprations arithmtiques et logiques ainsi qu'
l'adressage. Chaque demi-registre est accessible comme registre de 8 bits, le 8086 peut
donc effectuer des oprations 8 bits d'une faon compatible avec le 8080.

Microprocesseur 8086

AX :

par A. Oumnad

11

Accumulateur
Usage gnral,
Obligatoire pour la multiplication et la division,
Ne peut pas servir pour l'adressage

BX : Base
Usage gnral,
Adressage, (Par dfaut, son offset est relatif au segment DS)
CX :

Comptage et calcul
Usage gnral,
Utilis par certaines instruction comme compteur de rptition.
Ne peut pas servir pour l'adressage

DX : Data
Usage gnral,
Dans la multiplication et la division 16 bits, il sert comme extension au registre AX
pour contenir un nombre 32 bits,
Ne peut pas servir pour l'adressage
2.2.2 Les registres d'adressage (offset)
Ces registres de 16 bits permettent l'adressage d'un oprande l'intrieur d'un
segment de 64 ko (216 positions mmoires)
SP : Pointeur de Pile
Utilis pour l'accs la pile. Pointe sur la tte de la pile.
Par dfaut, son offset est relatif SS
BP : Pointeur de Base
Adressage comme registre de base, (Par dfaut, son offset est relatif SS)
Usage gnral
SI : Registre d'index (source)
Adressage comme registre dindex, (Par dfaut, son offset est relatif DS)
Certaines instruction de dplacement de donns l'utilise comme index de l'oprande
source. L'oprande destination tant index par DI
Usage gnral
DI : Registre d'index (destination)
Adressage comme registre dindex, (par dfaut, son offset est relatif DS)
Certaines instruction de dplacement de donns l'utilise comme index de l'oprande
destination, l'oprande destination tant index par SI
2.2.3 Les registres de segment
Ces registrent sont combin avec les registres doffset pour former les adresses. Une
case mmoire est repre par une adresse de la forme RS:RO. On place le registre
segment au dbut dune zone mmoire de de 64Ko, ensuite on fait varier le registre
doffset qui prcise ladresse relative par rapport cette position.

Microprocesseur 8086

12

par A. Oumnad

CS : Code Segment
Dfinit le dbut de la mmoire programme. Les adresses des diffrentes instructions
du programme sont relatives CS
DS : Data Segment
Dbut de la mmoire de donnes dans laquelle sont stockes toutes les donnes
traites par le programme
SS : Stack Segment
Dbut de la pile.
La pile est une zone mmoire gre dune faon particulire. Elle est organise comme
une pile dassiettes. On pose et on retire les assiettes toujours sur le haut de la pile. Un
seul registre dadresse suffit donc pour la grer, cest le stack pointer SP. On dit que cest
une pile LIFO (Last IN, First Out).
Empiler une donne : sauvegarder une donne sur (le sommet) de la pile
Dpiler une donne : retirer une donne (du sommet) de la pile
ES : Extra Segment
Dbut d'un segment auxiliaire pour donnes
2.2.4 Format dune adresse
Rien
DS

Une adresse doit avoir la forme [Rs : Ro] avec les possibilits ES

CS
ES

Valeur
BX
BP

SI
DI

Si le registre segment nest pas spcifi (cas rien), alors le processeur lajoute par dfaut
selon loffset choisit :
Offset utilis
Registre Segment par dfaut
qui sera utilis par le CPU

Valeur

DI

SI

BX

DS
Tableau 2.1 : segment par dfaut

Dans la suite de ce cours, On accdera souvent la mmoire


en prcisant seulement la partie offset de l'adresse. Par
dfaut on considre qu'on est dans le segment DATA

BP
SS

Microprocesseur 8086

13

par A. Oumnad

2.2.5 Le registre d'tat (flags)


15
O

2
T

0
C

Six bits refltent les rsultats d'une opration arithmtique ou logique et 3 participent
au control du processeur.

C : (Carry) indique le dpassement de capacit de 1 sur une opration 8 bits ou 16


bits. Ce flag peut tre utilis par des instructions de saut conditionnel, des calculs
arithmtique en chane ou dans des opration de rotation.

P : (Parit) indique que le nombre de 1 est un nombre pair. Ce flag est utilis avec
certains sauts conditionnels.

A : (retenue Arithmtique) indique une retenue sur les 4 bits (digit) de poids faible.
Par exemple quand la somme des 2 digits de poids faible dpasse F (15)

Z : (Zro) Indique que le rsultat d'une opration arithmtique ou logique est nul. Il
est utilis dans plusieurs instructions de sauts conditionnels.

S : (Signe) reproduit le bit de poids fort d'une quantit signe sur 8 bits ou sur 16
bits. L'arithmtique signe fonctionne en complment 2. S=0 : positif, S=1 :
ngatif. Ce flag sert lors de sauts conditionnels.

T : (Trap) met le CPU en mode pas pas pour faciliter la recherche des dfauts
d'excution.

I : (Interruption) autorise ou non la reconnaissance des interruptions


I = 0 Interruptions autorises
I = 1 Interruptions non autorises

D : (Direction) fixe la direction de l'auto-inc/dcrmentation de SI et DI lors des


instruction de manipulation de chanes.
D = 0 Incrmentation des index
D = 1 dcrmentation des index

O : (Overflow ) indique un dpassement de capacit quand on travaille avec des


nombres signs. Comme par exemple si la somme de 2 nombres positifs donne un
nombre ngatif ou inversement. (40h + 40h = 80h et O=1)

Microprocesseur 8086

par A. Oumnad

2.3 LES MODES D'ADRESSAGE


Dans la suite on utilisera les abrviations suivantes :
INST : instruction,
R
: Registre quelconque,
Rseg : Registre Segment
Roff : Registre doffset
Adr : Adresse
[ adr] : contenu Mmoire
Off : Offset de ladresse
Im : donne (constante)
Dep : dplacement (constante)
Op : Oprande
Os : Oprande source
Od : oprande destination
La structure la plus gnrale dune instruction est la suivante :
INST

Oprande1 , Oprande2

Lopration est ralise entre les 2 oprandes et le rsultat est toujours rcupr dans
loprande de gauche.
Il y a aussi des instructions qui agissent sur un seul oprande
Les oprandes peuvent tre des registres, des constantes ou le contenu de cases
mmoire, on appelle a le mode dadressage

Adressage registre (R)


L'opration se fait sur un ou 2 registres
INST R , R
INST R

Exemples :
INC AX
: incrmenter le registre AX
MOV AX, BX : Copier le contenu de BX dans AX

Adressage Immdiat (IM)


Un des oprande est une constante (valeur) :
INST R , im
INST taille [adr] , im

Exemples :
MOV AX, 243 : charger le registre AX par le nombre dcimal 243
ADD AX, 243h : additionner le registre AX avec le nombre hexadcimal 243
MOV AX, 0xA243 : Quand le chiffre de gauche du nombre hexadcimal est une lettre,
il est prfrable d'utiliser le prfix 0x pour l'hexadcimal

14

Microprocesseur 8086

MOV AL, 'a'

: Charger le registre AL par le code ASCII du caractre 'a'

MOV AX, 'a'

: Charger le registre AH par 00 et le registre AL par le code ASCII du


caractre 'a'
: Charger AH par 'a' et AL par 'b'

MOV AX,'ab'

par A. Oumnad

Adressage direct (DA)


Un des deux oprandes se trouve en mmoire. Ladresse de la case mmoire ou plus
prcisment son Offset est prcis directement dans linstruction. Ladresse Rseg:Off
doit tre place entre [ ], si le segment nest pas prcis, DS est pris par dfaut,
INST R , [adr]
INST [adr] , R
INST taille [adr] , im

Exemples :
MOV AX,[243]
MOV [123],AX
MOV AX, [SS:243]

: Copier le contenu de la mmoire d'adresse DS:243 dans AX


: Copier le contenu de AX dan la mmoire d'adresse DS:123
: Copier le contenu de la mmoire SS:243 dans AX

Adressage indirect (IR)


Un des deux oprandes se trouve en mmoire. Loffset de ladresse nest pas prcis
directement dans l'instruction, il se trouve dans lun des 4 registres doffset BX, BP, SI
ou DI et cest le registre qui sera prcis dans linstruction : [Rseg : Roff]. Si Rseg n'est
pas spcifi, le segment par dfaut sera utilis (voir Tableau 2.1)
INST R , [Rseg : Roff]
INST [Rseg : Roff] , R
INST taille [Rseg : Roff] , im

Exemples :
MOV AX, [BX]
MOV AX, [BP]
MOV AX, [SI]
MOV AX, [DI]
MOV AX, [ES:BP]

;
;
;
;
;

Charger
Charger
Charger
Charger
Charger

AX
AX
AX
AX
AX

par
par
par
par
par

le contenu de la mmoire d'adresse DS:BX


le contenu de la mmoire d'adresse SS:BP
le contenu de la mmoire d'adresse DS:SI
le contenu de la mmoire d'adresse DS:DI
le contenu de la mmoire d'adresse ES:BP

Ladressage indirect est divis en 3 catgories selon le registre doffset utilis. On


distingue ainsi, ladressage Bas, ladressage index et ladressage bas index,
Adressage Bas (BA)
Loffset se trouve dans lun des deux registres de base BX ou BP. On peut prciser un
dplacement qui sera ajout au contenu de Roff pour dterminer loffset,
INST R , [Rseg : Rb+dep]
INST [Rseg : Rb+dep] , R
INST taille [Rseg : Rb+dep] , im

15

Microprocesseur 8086

16

par A. Oumnad

Exemples :
MOV AX, [BX] : Charger AX par le contenu de la mmoire d'adresse DS:BX
MOV AX, [BX+5] : Charger AX par le contenu de la mmoire d'adresse DS:BX+5
MOV AX, [BP-200] : Charger AX par le contenu de la mmoire d'adresse SS:BX-200
MOV AX, [ES:BP] : Charger AX par le contenu de la mmoire d'adresse ES:BP

Adressage Index (X)


Loffset se trouve dans lun des deux registres dindex SI ou DI. On peut prciser un
dplacement qui sera ajout au contenu de Ri pour dterminer loffset,
INST R , [Rseg : Ri+dep]
INST [Rseg : Ri+dep] , R
INST taille [Rseg : Ri+dep] , im

Exemples :
MOV AX, [SI]
MOV AX, [SI+500]
MOV AX, [DI-8]
MOV AX, [ES:SI+4]

;
;
;
;

Charger
Charger
Charger
Charger

AX
AX
AX
AX

par
par
par
par

le
la
la
la

contenu de la mmoire d'adresse DS:SI


mmoire d'adresse DS:SI+500
mmoire d'adresse DS:DI-8
mmoire d'adresse ES:SI+4

Adressage Bas Index (BXI)


L'offset de ladresse de l'oprande est la somme d'un registre de base, d'un registre
d'index et d'un dplacement optionnel.
Si Rseg n'est pas spcifi, le segment par dfaut du registre de base est utilis :
INST R , [Rseg : Rb+Ri+dep]
INST [Rseg : Rb+Ri+dep] , R
INST taille [Rseg : Rb+Ri+dep] , im

Exemples :
MOV AX,[BX+SI]
MOV AX,[BX+DI+5]
MOV AX,[BP+SI-8]
MOV AX,[BP+DI]

;
;
;
;

AX
AX
AX
AX

est
est
est
est

charg
charg
charg
charg

par
par
par
par

la
la
la
la

mmoire d'adresse
mmoire d'adresse
mmoire d'adresse
mmoire d'adresse

DS:BX+SI
DS:BX+DI+5
SS:BP+SI-8
SS:BP+DI

2.4 TAILLE DES ECHANGES AVEC LA MEMOIRE


La mmoire est organise en octets.
Quand on fait une instruction entre un registre et une donne qui se trouve en
mmoire, cest le registre qui dtermine la taille de lopration.
Si le registre est un registre simple (8 bits), lopration se fera avec une seule case
mmoire.
MOV [adresse], AL

donne

adresse AL

Microprocesseur 8086

17

par A. Oumnad

Si le registre est un registre double (2 octets), lopration se fera avec deux cases
mmoires
MOV [adresse], AX

donne

Remarquer que c'est la partie basse du


registre qui est traite en premier, et
ceci dans les deux sens

adresse AL

AH

Quand on fait une opration entre une constante et une case mmoire, il y a
ambigut, le processeur ne sait pas sil faut considrer la constante sur 8 bits ou sur 16
bits. Il faut utiliser les prfixes BYTE et WORD pour prciser le nombre doctets crire :
MOV BYTE

[adresse],4Ah

; On crit 4A dans la position adresse

adresse 4A

MOV WORD [adresse],4Ah ; On crit 004A, 4A adresse, et 00 adresse+1


adresse 4A

00

Exercice 2) (ram.asm) : tracer le programme ci-dessous


mov bx,4000h
; adresse
mov ax,2233h
mov [bx],ax
mov word [bx+2],4455h
mov byte [bx+4],66
mov byte [bx+5],77
Afficher la ram en hexadcimal partir de la position 4000H
Afficher la ram en dcimal partir de la position 4000H

Microprocesseur 8086

18

par A. Oumnad

2.5 LES INSTRUCTIONS DU 8086


2.5.1 Les instructions de transfert
MOV Od , Os
Copie l'oprande Source dans l'oprande Destination
MOV
MOV
MOV
MOV
MOV

copier un registre dans un autre


copier le contenu dune case mmoire dans un registre
copier un register dans une case mmoire
copier une constante dans un registre
copier une constante dans une case mmoire
(taille = BYTE ou WORD)

R1 , R2
R,M
M,R
R , im
taille M , im

MOV M , M

PUSH Op
Empiler loprande Op (Op doit tre un oprande 16 bits)
- Dcrmente SP de 2
- Copie Op dans la mmoire ponte par SP
PUSH R16
PUSH word [adr]
PUSH

im

PUSH

R8

POP Op
Dpiler dans loprande Op (Op doit tre un oprande 16 bits)
- Copie les deux cases mmoire pointe par SP dans l'oprande Op
- Incrmente SP de 2
POP R16
POP word M

POP

R8

L'exemple de la figure 2.4 illustre plusieurs situations :


X
X
CX
BX
AX
X
X
(a)

SP

X
DX
CX
BX
AX
X
X
(b)

SP

X
DX
CX
BX
AX
X
X
(c)

Fig. 2.5 : fonctionnement dune pile

X
SP

BP
CX
BX
AX
X
X
(d)

SP

Microprocesseur 8086

par A. Oumnad

(a)

Situation de la pile aprs empilement des registres AX, BX et CX

(b)

Situation de la pile aprs empilement du registre DX

(c)

Situation de la pile aprs un dpilement. On remarquera que DX reste dans la

19

mmoire mais s'il ne fait plus partie de la pile. La pile s'arrte son sommet qui est
point par le pointeur de pile.
(d)

Situation de la pile aprs empilement du registre BP. On remarque que la valeur BP


crase la valeur DX dans la mmoire.

Exercice 3) : (pile.asm) : tracer le programme ci-dessous. La valeur initiale de SP est


quelconque
mov
push
mov
push
mov
push
mov
mov
mov

ax,2233h
ax
ax,4455h
ax
ax,6677h
ax
bp,sp
al,[bp+3]
bx,[bp+1]

PUSHA
Empile tous les registres gnraux et dadressage dans l'ordre suivant :
AX, CX, DX, BX, SP, BP, SI, DI
POPA
Dpile tous les registres gnraux et dadressage dans l'ordre inverse de PUSHA afin
que chaque registre retrouve sa valeur. La valeur dpile de SP est ignore
Remarque : Les deux instructions PUSHA et POPA ne sont pas reconnues par le 8086. Elles ont
t introduites partir du 80186. Nous avons jug bon de les introduire dans ce cours car elles sont
trs utiles et comme nous travaillons sur des Pentium, on peut les utiliser sans problme.
XCHG OD , OS
Echange l'oprande Source avec l'oprande Destination. Impossible sur segment.
XCHG R1 , R2
XCHG [adr] , R
XCHG R , [adr]
XCHG [ ] , [ ]

2.5.2 Les instructions Arithmtiques


Le 8086 permet d'effectuer les Quatre oprations arithmtiques de base, l'addition, la
soustraction, la multiplication et la division. Les oprations peuvent s'effectuer sur des
nombres de 8 bits ou de 16 bits signs ou non signs. Les nombres signs sont
reprsents en complment 2. Des instructions d'ajustement dcimal permette de faire

Microprocesseur 8086

par A. Oumnad

des calculs en dcimal (BCD).


Addition :
ADD Od , Os

Additionne l'oprande source et l'oprande destination avec rsultat dans


l'oprande destination,
Od + Os Od
ADD AX,123
ADD AX,BX
ADD [123],AX
ADD BX,[SI]

ADC Od , Os

Additionne l'oprande source, l'oprande destination et le curry avec


rsultat dans l'oprande destination,
Od + Os + C Od

INC Op
Incrmente l'oprande Op
Op + 1 Op
Attention, lindicateur C nest pas positionn quand il y a dbordement, C'est
lindicateur Z qui permet de dtecter le dbordement
Pour incrmenter une case mmoire, il faut prciser la taille :
INC byte [ ]
INC word [ ]

Exercice 4) :
En partant chaque fois de la situation illustre droite. Quelle est la
situation aprs chacune des instructions suivantes
4000h 25h
33h
INC byte [4000h]
INC word [4000h]
En partant chaque fois de la situation illustre droite. Quelle est la
situation aprs chacune des instructions suivantes
4000h FFh
33h
INC byte [4000h]
INC word [4000h]
Soustraction
SUB Od , Os

Soustrait l'oprande source et l'oprande destination avec rsultat dans


l'oprande destination.
Od - Os Od

SBB Od , Os

Soustrait l'oprande source et le curry de l'oprande destination avec


rsultat dans l'oprande destination.
Od - Os - C Od

20

Microprocesseur 8086

21

par A. Oumnad

DEC Op
Dcrmente l'oprande Op
Op - 1 Op
NEG Op
Donne le complment 2 de l'oprande Op : remplace Op par son ngatif
C2(Op) Op
CMP Od , Os Compare (soustrait) les oprandes Os et Od et positionne les drapeaux en
fonction du rsultat. Loprande Od nest pas modifi
Multiplication
MUL Op

instruction un seul oprande. Elle effectue une multiplication non signe


entre l'accumulateur (AL ou AX) et l'oprande Op. Le rsultat de taille
double est stock dans l'accumulateur et son extension (AH:AL ou
DX:AX).

MUL Op8
MUL Op16

AL x Op8
AX x Op16

AX
DX:AX

L'oprande Op ne peut pas tre une donne, cest soit un registre soit une position
mmoire, dans ce dernier cas, il faut prciser la taille (byte ou word)

MUL
MUL
MUL
MUL

BL
;
CX
;
byte [BX] ;
word [BX] ;
MUL

AL x BL

AX
AX x CX

DX:AX
AL x (octet point par BX)
AX x (word point par BX)

im

MUL

AX,R

AX
DX :AX
MUL

AX, im

Les drapeaux C et O sont positionns si la partie haute du rsultat est non nulle. La
partie haute est AH pour la multiplication 8 bits et DX pour la multiplication 16 bits

Exercice 5) : (mul.asm) Tracer le programme ci-dessous en indiquant chaque fois la


valeur des indicateurs C et O
mov al,64h
mov bl,2
mul bl
mov al,64h
mov cl,3
mul cl
IMUL Op

(Integer Multiply ) Identique MUL except qu'une multiplication signe


est effectue.

Exercice 6) (imul.asm) : diffrence entre MUL et IMUL


Tracer le programme ci-dessous

Microprocesseur 8086
MOV
mov
mul
MOV
mov
imul

22

par A. Oumnad

al,11111111b
bl,00000010b
bl
al,11111111b
bl,00000010b
bl

Division
DIV Op

Effectue la division AX/Op8 ou (DX|AX)/Op16 selon la taille de Op qui doit


tre soit un registre soit une mmoire. Dans le dernier cas il faut prciser
la taille de loprande, exemple : DIV byte [adresse] ou DIV
Op8
AX
word [adresse].
AH
AL
;AX / Op8 , Quotient AL , Reste AH

DIV Op8
DIV S16

;DX:AX / S16 , Quotient AX , Reste DX

- S ne peut pas tre une donne (immdiat)

DIV 125h

DX:AX
DX

Op16
AX

- Aprs la division L'tat des indicateurs est indfini


- La division par 0 dclenche une erreur
IDIV Op

Identique DIV mais effectue une division signe

(Convert Byte to Word ) Effectue une extension de AL dans AH. On crit le


contenu de AL dans AX en respectant le signe
Si AL contient un nombre positif, On complte par des 0 pour obtenir la reprsentation
sur 16 bits.
Si AL contient un nombre ngatif, On complte par des 1 pour obtenir la
reprsentation sur 16 bits.
+5 = 0000 0101 0000 0000 0000 0101
5 = 1111 1011 1111 1111 1111 1011

CBW

CWD

(Convert Word to Double Word ) effectue une extension de AX dans DX en


respectant le signe. On crit AX dans le registre 32 bits obtenu en collant
DX et AX
DX | AX

2.5.3 Les instructions logiques


NOT Op

Complment 1 de l'oprande Op

AND Od , Os

ET logique
Od ET Os Od

OR Od , Os

OU logique
Od OU Os Od

Microprocesseur 8086

XOR Od , Os

par A. Oumnad

OU exclusif logique
Od OUX Os Od

TEST Od , Os Similaire AND mais ne retourne pas de rsultat dans Od, seuls les
indicateurs sont positionns

Exercice 7) : (logic.asm) Tracer en binaire le programme ci-dessous


MOV
AX,125h
AND
AL,AH
Exercice 8) : (xor.asm) Programme qui fait AX BX sans utiliser linstruction XOR
2.5.4 Les masques logiques :
Le 8086 ne possde pas d'instructions permettant d'agir sur un seul bit. Les masques
logiques sont des astuces qui permettent d'utiliser les instructions logiques vues cidessus pour agir sur un bit spcifique d'un octet out d'un word

Forcer un bit 0 :
xxxx xxxx
Pour forcer un bit 0 sans modifier les autres bits, on utilise
AND 1110 1101
l'oprateur logique AND et ces proprits :
xxx0 xx0x
- x AND 0 = 0
(0 = lment absorbant de AND)
- x AND 1 = x
(1 = lment neutre de AND)
On fait un AND avec une valeur contenant des 0 en face des bits qu'il faut forcer 0 et
des 1 en face des bits qu'il ne faut pas changer
Forcer un bit 1 :
Pour forcer un bit 1 sans modifier les autres bits, on utilise
xxxx xxxx
l'oprateur logique OR et ces proprits :
OR 0010 0000
- x OR 1 = 1
(1 = lment absorbant de OR)
xx1x xxxx
- x OR 0 = x
(0 = lment neutre de OR)
On fait un OR avec une valeur contenant des 1 en face des bits qu'il faut forcer 1 et
des 0 en face des bits qu'il ne faut pas changer
Inverser un bit :
Pour inverser la valeur d'un bit sans modifier les autres bits, on
xxxx xxxx
utilise l'oprateur logique XOR et ces proprits :
XOR 0010 0000
- X XOR 1 = X
xxXx xxxx
- X XOR 0 = X
(0 = lment neutre de XOR)
Donc, on fait un XOR avec une valeur contenant des 1 en face des bits qu'il faut
inverser et des 0 en face des bits qu'il ne faut pas changer
Exercice 9) : (masque.asm) Tracer le programme ci-dessous
MOV
AX,1A25h
AND
AX,F0FFh

23

Microprocesseur 8086

24

par A. Oumnad

2.5.5 Les instructions de dcalage


Dans les instructions de dcalage, l'oprande k peut tre soit une constante
(immdiat) soit le registre CL :
INST AX,1 ; dcaler AX de 1 bit
INST BL,4 ; dcaler BL de 4 bits
INST BX,CL ; dcaler BX de CL bits
On peut aussi dcaler le contenu d'une case mmoire mais il faut prciser la taille
INST byte [BX],1
; dcaler une fois le contenu de la case
mmoire d'adresse BX
SHL R/M,k
SAL R/M,k

(SHift Logical Left ) dcalage logique gauche de k bits


(SHift Arithm Left) dcalage arithmtique gauche
C

SHR R/M,k

MSB

(SHift Logical right ) dcalage logique droite


MSB

SAR R/M,k

LSB

LSB

(SHift Arithmetic right ) dcalage arithmtique droite


MSB

LSB

Les dcalages arithmtiques permettent de conserver le signe. Ils sont utiliss pour
effectuer des oprations arithmtiques comme des multiplications et des
divisions par 2.
ROL R/M,k

(Rotate Left ) Rotation gauche


C

ROR R/M,k

MSB

(Rotate Right ) Rotation droite


MSB

RCL R/M,k

LSB

LSB

(Rotate Through CF Left ) Rotation gauche travers le Carry


C

MSB

LSB

Microprocesseur 8086

RCR R/M,k

25

par A. Oumnad

(Rotate Through CF Right) Rotation droite travers le Carry


MSB

LSB

2.5.6 Instructions agissant sur les indicateurs


15
O

CLC

(CLear Carry ) positionne le drapeau C 0

STC

(Set Carry ) positionne le drapeau C 1

CMC

Complmente le drapeau C

CLD

Positionne le Drapeau D 0

STD

Positionne le Drapeau D

CLI

Positionne le Drapeau I 0

STI

Positionne le Drapeau I 1

0
C

LAHF
Copier l'octet bas du registre d'tat dans AH
Aprs l'opration, on a :

AH :

SAHF
Opration inverse de LAHF : Transfert AH dans l'octet bas du registre d'tat
PUSHF
Empile le registre d'tat,
POPF
Dpile le registre d'tat,

Exercice 10) :
1. programme qui positionne lindicateur P 0 sans modifier les autres indicateurs
2. programme qui positionne lindicateur O 1 sans modifier les autres indicateurs

Microprocesseur 8086

par A. Oumnad

2.5.7 Les instructions de contrle de boucle


LOOP xyz

L'instruction loop fonctionne automatiquement avec le registre CX


(compteur). Quant le processeur rencontre une instruction loop, il
dcrmente le registre CX. Si le rsultat n'est pas encore nul, il reboucle
la ligne portant l'tiquette xyz, sinon il continue le programme la ligne
suivante
MOV CX,une valeur
ici: XXX xx,yy
XXX xx,yy

XXX xx,yy
XXX xx,yy
loop ici
XXX xx,yy

Remarque sur l'tiquette :


L'tiquette est une chane quelconque qui permet de reprer une ligne. Le caractre ':'
la fin de l'tiquette n'est obligatoire que si l'tiquette est seule sur la ligne
LOOPZ xyz

(Loop While Zero ) Dcrmente le registre CX (aucun flag n'est positionn)


on reboucle vers la ligne xyz tant que CX est diffrent de zro et le flag Z
est gal 1. La condition supplmentaire sur Z, donne la possibilit de
quitter une boucle avant que CX ne soit gal zro.

LOOPNZ xyz Dcrmente le registre CX et reboucle vers la ligne xyz tant que CX est
diffrent de zro et le flag Z est gal 0. Fonctionne de la mme faon
que loopz,
JCXZ xyz

branchement la ligne xyz si CX = 0 indpendamment de l'indicateur Z

Exercice 11) : (boucle.asm) Programme qui ajoute la valeur 3 au contenu des 100 cases
mmoire du segment DATA dont l'adresse (offset) commence 4000h

Exercice 12) : (boucle2.asm) Programme qui multiplie par 3 les 100 words contenu
dans le segment DATA partir de l'offset 4000h. On suppose que les rsultats tiennent
dans 16 bits (< 65536)
2.5.8 Les instructions de branchement
3 types de branchement sont possibles :

Branchements inconditionnels
Branchements conditionnels
Appel de fonction ou dinterruptions

26

Microprocesseur 8086

27

par A. Oumnad

Tous ces transferts provoquent la poursuite de l'excution du programme partir


d'une nouvelle position du code. Les transferts conditionnels se font dans une marge de
-128 +127 octets partir de la position de transfert.

Branchements inconditionnels

JMP xyz Provoque un saut sans condition la ligne portant l'tiquette xyz.
CALL xyz
Appel d'une procdure (sous programme) qui commence la ligne xyz.
La position de l'instruction suivant le CALL est empile pour assurer une poursuite
correcte aprs l'excution du sous programme.
RET

Retour de sous
programme. L'excution
du programme continue
la position rcupre dans
la pile.

INT n

appel linterruption
logicielle n n

programme appelant
------------------------------------------------------------CALL xxx
-------------------------------------------------

sous programme

xxx- - - ------------RET

Branchements conditionnels
Les branchements conditionnels sont
conditionns par l'tat des indicateurs (drapeaux) qui sont eux mme positionns par
les instructions prcdentes.
Dans la suite nous allons utiliser la terminologie :
- suprieur ou infrieur pour les nombres non signs
- plus petit ou plus grand pour les nombres signs
- + pour l'oprateur logique OU
JE/JZ xyz

(Jump if Equal or Zero ) Aller la ligne xyz si rsultat nul ou si galit.


C'est--dire si Z=1

JNE/JNZ xyz (Jump if Not Equal or Not Zero ) Aller la ligne xyz si rsultat non nul ou si
diffrent. C'est--dire si Z=0
JA

xyz

(Jump if Above ) aller la ligne xyz si suprieur (non sign). C'est--dire si


C+Z=0

JAE xyz

(Jump if Above or Equal ) aller la ligne xyz si suprieur ou gal (non


sign).
C'est--dire si C = 0

JB xyz

(Jump if Bellow ) Branche si infrieur (non sign). C'est--dire si C = 1

JBE xyz

(Jump if Bellow or Equal ) aller la ligne xyz si infrieur ou gal (non


sign). C'est--dire si C + Z = 1

JC xyz

(Jump if CArry ) aller la ligne xyz s'il y a retenu. C'est--dire si C = 1

Microprocesseur 8086

par A. Oumnad

JNC xyz

(Jump if No CArry) aller la ligne xyz s'il n'y a pas de retenu. C'est--dire
si C = 0

JG xyz

(Jump if Grater) aller la ligne xyz si plus grand (sign). C'est--dire si


(S O) + Z = 1

JGE xyz

(Jump if Grater or Equal ) aller la ligne xyz si plus grand ou gal


(sign). C'est--dire si S O = 0

JL xyz

(Jump if Less ) aller la ligne xyz si plus petit (sign). C'est--dire si


SO=1

JLE xyz

(Jump if Less or Equal ) aller la ligne xyz si plus petit ou gal (sign).
C'est--dire si (S O) + Z = 1

JO xyz

(Jump if Overflow ) aller la ligne xyz si dpassement. C'est--dire si


O=1

JNO xyz

(Jump if No Overflow ) aller la ligne xyz s'il n'y a pas de dpassement


O=0

JP/JPE xyz (Jump if Parity or Parity Even ) aller la ligne xyz si parit paire. C'est-dire si P = 1
JNP/JPO xyz (Jump if No Parity or if Parity Odd ) aller la ligne xyz si parit impaire.
C'est--dire si P = 0
JS xyz

(Jump if Sign ) aller la ligne xyz si signe ngatif. C'est--dire si S = 1

JNS xyz

(Jump if No Sign ) aller la ligne xyz si signe positif. C'est--dire si S = 0

Exercice 13) :
Ecrire la suite dinstructions pour raliser les tapes suivantes :
1. Mettre 1 dan AX
2. incrmenter AX
3. si AX 200 recommencer au point 2
4. sinon copier AX dans BX
Exercice 14) :
Ecrire la suite dinstructions pour raliser les tapes suivantes :
1. copier le contenu de la case mmoire [1230h] dan CX
2. Comparer CX 200
a. si incrmenter CX et recommencer au point 2
b. si dcrmenter CX et recommencer au point 2
c. si = copier CX dans AX et continuer le programme
Exercice 15) : (cherche.asm)
Programme qui cherche la valeur 65 dans le RAM partir de la position 4000h. Une

28

Microprocesseur 8086

par A. Oumnad

fois trouve, placer son adresse dans le registre AX

Exercice 16) : (boucle3.asm) Programme qui divise par 3 les 100 octets contenus dans
les 100 cases mmoires commenant l'adresse 4000h. Ne pas utiliser l'instruction loop
2.5.9 Instructions d'accs aux ports d'E/S
IN AL/AX,port
lire un port dentre sortie.
IN AL , port ; charge le contenu du port dadresse port dans AL
IN AX , port ; charge le contenu du port dadresse port dans AL et le contenu du port
dadresse port+1 dans AH
Si l'adresse port tient sur 8 bits, elle peut tre prcise immdiatement, sinon il faut
passer par le registre DX
IN AL , 4Dh
MOV DX , 378h
IN
AL , DX
OUT port , AL/AX
Ecriture dans un port dE/S
Ladressage du port se fait de la mme faon que pou IN
Out port , AX ; crit AL dans port et AH dans port+1

29

Microprocesseur 8086

2.6

par A. Oumnad

30

CE QUIL NE FAUT PAS FAIRE

Voici une liste non exhaustive de quelques erreurs viter

Une opration ne peut pas se faire entre deux cases mmoire, il faut que a passe
par un registre. On ne peut pas avoir des instructions du style :
MOV [245],[200]
ADD [BX],[BP]

Bien que le registre SP soit un registre dadressage, il ne peut tre utilis directement
pour accder la pile, on peut toutefois le copier dans un registre valide pour
ladressage (BX, BP,SI, DI) et utiliser ensuite ce dernier :
MOV AX,[SP]

MOV BP,SP
MOV AX,[BP]

On ne peut pas faire des oprations directement sur un registre segment, il faut
passer par un autre registre. On ne peux pas non plus copier un registre segment
dans un autre
MOV ES,02F7H

MOV BX,02F7h
MOV ES,BX

MOV

ES,DS

MOV AX,DS
MOV ES,AX

INC

ES

MOV BX,ES
INC BX
MOV ES,BX

ADD

ES,2

MOV BX,ES
ADD BX,2
MOV ES,BX

On ne peut pas utiliser directement une adresse segment dans une instruction, il faut
passer par un registre segment.
MOV

INST [ ] , [ ]

[2A84h : 55],AX

MOV BX,2A84h
MOV ES,BX
MOV [ES : 55] , AX

On ne peut pas faire une multiplication ou une division sur une donne (immdiat)
MUL
DIV

im
im

Microprocesseur 8086

31

par A. Oumnad

On ne peut pas empiler/dpiler un oprande 8 bits


PUSH R/M8

Le segment et loffset sont spar par le caractre ":" et non ","


[DS , BX]

[DS : BX]

On ne peut pas utiliser les oprateurs + - x sur des registre ou des mmoires
MOV AX, BX+2
MOV AX, DX x 2

Microprocesseur 8086

32

par A. Oumnad

A signifie Accumulateur qui peut tre AL ou AX selon la taille de lopration 8 bits ou 16 bits
X est lextension de laccumulateur. (8 bits : X =AH X:A = AH:AL = AX) (16 bits : X = DX X:A = DX:AX)
AX
BX
CX
DX

AH
BH
CH
DH

AL
BL
CL
DL

SP
BP
SI
DI

O D I

CS
DS
SS
ES

Transfert
O S
D S
empile R/M (16 bits)
dpile R/M (16 bits)
D S
AL [BX+AL]
R16 offset de M
R16 [a], DS[a+2]
R16 [a], ES[a+2]
Arithmtique
ADD D , S
DS+D
* *
ADC D , S
DS+D+C
* *
INC D
DD+1
* *
SUB D,S
DD-S
* *
SBB D,S
DDS-C
* *
NEG D
D -D
* *
CMP D,S
D-S
* *
DEC D
DD-1
* *
MUL S
X:A A x S
* ?
IMUL S
X:A A x S (signe)
* ?
DIV S
A(X:A) / S, XRst
? ?
IDIV S
division signe
? ?
CBW
Byte(AL) to word(AX) ( sign)
CWD
Word(AX) to Dword (DX|AX) (sign)
DAA
Dec. adj. after ADD
? *
AAA
ascii adj after ADD
? ?
DAS
dec adj after SUB
? *
AAS
ascii adj after SUB
? ?
AAM
ascii adj after MUL
? *
AAD
ascii adj before DIV
? *
Logique
NOT R/M
R/M R/M
AND D , S
D D AND S
0 *
OR D , S
D D OR S
0 *
XOR D , S
D D XOR S
0 *
TEST D , S
D AND S
0 *
0
SHL/SHL R/M C
* *
0
C
SHR R/M
* *
SAR R/M
* *
C
C

ROR R/M
RCL R/M

C
C

RCR R/M
MOVSb/w
SCASb/w
LODSb/w
CMPSb/w
STOSb/w

Chanes
[ES:DI] [DS:SI],
AL/AX [ES:DI];
AL/AX [DS:SI]
[ES:DI] - [DS:SI],
AL/AX [ES:DI]

S Z

* : Positionn selon le rsultat


? : Modifi, rsultat non dfini

Z A P C

*
*
*
*
*
*
*
*
?
?
?
?

*
*
*
*
*
*
*
*
?
?
?
?

*
*
*
*
*
*
*
*
?
?
?
?

*
*
!
*
*
*
*
*
*
*
?
?

*
?
*
?
*
*

*
*
*
*
?
?

*
?
*
?
*
*

*
*
*
*
?
?

*
*
*
*
*
*
*

?
?
?
?
?
?
?

*
*
*
*
*
*
*

0
0
0
0
*
*
*

Branchement
O S Z A P C
JMP a
branche l'adresse a
JE/JZ a
saut si = (Z lev)
JNE/JNZ a
saut si (Z baiss)
JA a
saut si (non sign)
JAE a
saut si (non sign)
JB a
saut si (non sign)
JBE a
saut si (non sign)
JG a
saut si (sign)
JGE a
saut si (sign)
JL a
saut si (sign)
JLE a
saut si (sign)
JC a
saut si C = 1
JNC a
saut si C = 0
JO a
saut si O = 1
JNC a
saut si C = 0
JP/JPE a
saut si P = 1
JNP/JPO a
saut si P = 0
JS
a
saut si S = 1
JNS a
saut si S = 0
CALL a
saut sous programme
RET
retour de sous programme
LOOP A
dec CX, saut si CX 0
LOOPZ a
dec CX, saut si :CX 0 et Z = 1
LOOPNZ a dec CX, saut si :CX 0 et Z = 0
JCXZ a
saut si CX = 0 ( Z)
action sur Indicateurs
LAHF
AH RE L
SAHF
REL AH
* * * * *
PUSHF
empile RE
POPF
dpile RE
* * * * * *
CLC
Clear Carry flag
0
STC
Set Carry flag
1
CMC
complmente Carry
*
CLD
Clear Direction flag
STD
Set Direction flag
CLI
Clear Interrupt flag
STI
Set Interrupt flag
Divers

INT n

dclenche l'interrupt n

INTO n

interrupt si Overflow

IRET

Retour d'interruption

HALT

entre en mode vail

MOV D , S
PUSH R/M
POP R/M
XCHG D , S
XLAT
LEA R16 , M
LDS R16 , [a]
LES R16 , [a]

ROL R/M

WAIT
NOP
* * * * * * IN al/ax,port
out port,al/ax
* * * * * *
* * * * * *

entre en attente
ne fait rien
Lit un port d' E/S
crit dans un port

* * * *

* *

Microprocesseur 8086

par A. Oumnad

33

3 LASSEMBLEUR NASM
La syntaxe des mnmoniques que nous avons utilise jusqu prsent est la syntaxe de
lassembleur NASM. Rappelons que le rle de lassembleur est de convertir le programme
source crit en mnmonique en codes machines comprhensible par le processeur.

3.1 LES DIRECTIVES DE NASM


Les directives ne sont pas des instructions du 8086, elles sont destines l'assembleur
qui les utilise pour savoir de quelle manire il doit travailler.

BITS
Cette directive indique NASM s'il doit produire un code 16 bits ou un code 32 bits.
Elle est utilise sous la forme : BITS 16 ou BITS 32

ORG
Cette directive indique l'assembleur l'adresse partir de laquelle le programme sera
implant dans la RAM. Pour les programmes ".com", cette adresse doit tre 100h

SEGMENT
Cette directive prcise dans quel segment, les instructions ou les donnes qui la
suivent seront assembles :
SEGMENT .text
Les instructions ou les donnes initialise (par db ou dw) qui suivent cette 'dclaration'
seront plac dans le segment programme (Code segment)
SEGMENT .data
Les donnes (initialise) dclare aprs cette directive sont place dans le segment de
donnes (Data segment)
SEGMENT .bss
Les donnes dclares aprs cette directive seront places dans le segment de
donnes mais cette partie est rserve la dclaration des variables non initialise.

%INCLUDE
Comme en langage C, cette directive permet d'inclure un fichier source avant la
compilation.
EQU : Dfinition de constante
mille EQU

1000

Chaque fois que l'assembleur rencontrera la chane mille , il la remplacera par le


nombre 1000 (tout simplement).

%DEFINE
La directive %define permet de dfinir une constante un peut de la mme faon que la
directive EQU . La diffrence subtile est que %define dfinit une macros qu'on peur
redfinir dans la suite du programme ce qui n'est pas possible avec EQU .

Microprocesseur 8086

par A. Oumnad

34

3.2 LES PSEUDO INSTRUCTION DE NASM


Les pseudo instructions ne sont pas des instructions du 8086. Elles ne seront donc pas
traduites en langage machine lors de l'assemblage. NASM les interprte et ralise les
fonctions correspondantes. Les pseudo instructions les plus courantes servent la
dclaration des variables initialises ou non initialises, dfinition de constantes et la
rptition des instructions :

db : (define byte) dfinit une variable initialise de 1 octet

dw : (define word) dfinit une variable initialise de 2 octets

resb : rserve un octet pour une variable non initialise

resw : rserve un mot de 2 octets pour une variable non initialise

3.3 LES EXPRESSIONS


NASM peut valuer des expressions entre constantes. Les oprateur reconnus sont :
+, - , *

: addition, soustraction et multiplication

: division non signe

//

: division signe

: modulo non sign

%% : modulo sign
~

: complment logique

&

: ET logique

: OU logique

: XOR logique

: dcalage gauche

: dcalage droite
x equ

0F00h

mov

ax,(2*x+6)/2

mov

ax,x << 4

mov

ax,(x >> 8)+(x << 4)

mov

ax,x & x >> 4;

>> est prioritaire sur &

mov

ax,x | x >> 4;

>> est prioritaire sur |

Attention, les expressions ne peuvent tre utiliss quavec des constantes. On ne peut
pas avoir des choses du genre :
MOV AX , DX+2

Microprocesseur 8086

35

par A. Oumnad

4 LES ENTREE SORTIES


Pour faire des entres sorties (essentiellement avec lcran et le clavier), on passe par
des interruptions du BIOS ou du DOS. Nous n'allons voir ici que ce dont nous avons
besoin.
4.1.1 L'interruption 10h du BIOS
Le BIOS est de relativement bas niveau et dpend fortement de la machine.
L'interruption 10h peut effectuer beaucoup de fonctions diffrentes, le numro de la
fonction dsire doit tre place dans AH avant l'appel de l'interruption. Nous ne parlerons
ici que de quelques fonctions.

Fonction 00
Cette fonction permet de choisir un mode texte ou un mode graphique. En changeant
de mode, on peut effacer l'cran, ce qui fait que l'on peut appeler cette fonction pour
effacer l'cran et rester dans le mme mode.
Paramtres :
AH = 00
AL

mode

00h
01h
02h
03h
04h
05h
06h
07h
0Dh
0Eh
0Fh
10h
11h
12h
13h

T
T
T
T
G
G
G
T
G
G
G
G
G
G
G

Rsolution dimensions Rsolution


texte
caractre graphique
40x25
9x16
360x400
40x25
9x16
360x400
80x25
9x16
720x400
80x25
9x16
720x400
40x25
8x8
320x200
40x25
8x8
320x200
80x25
8x8
640x200
80x25
9x16
720x400
40x25
8x8
320x200
80x25
8x8
640x200
80x25
8x14
640x350
80x25
8x14
640x350
80x30
8x16
640x480
80x30
8x16
640x480
40x25
8x8
320x200

Couleurs
16
16
16
16
4
4
2
mono
16
16
mono
16
mono
16
256

pages Segment
8
8
8
8
.
.
.
.
8
4
2
.
.
.
.

B800
B800
B800
B800
B800
B800
B800
B000
A000
A000
A000
A000
A000
A000
A000

Tableau 4.1 : modes cran

Pour les modes texte, on peut doubler le nombre de ligne en chargeant un jeux de
caractre de hauteur 8 pixels. Voir fonction 11
Pour ne pas effacer l'cran, placer le bit 7 de AL 1 (Ajouter 80h)

Fonction 09
couleur
couleur
Cette fonction permet d'crire un caractre
texte
arrire plan
- Permet les rptitions,
- Gre la couleur en mode texte et en mode
R V B
R V B
graphique,
- Ne gre pas le curseur.
clignotement
brillance
Paramtres :
AH = 09h
Fig. 4.1 : couleur en mode texte
AL = caractre crire
BH = page cran
BL = attribut de couleur (RVB :111=Blanc, 000=Noir)

Microprocesseur 8086

par A. Oumnad

36

CX = nombre de fois
Les caractres spciaux ne sont pas reconnus (le 7 ne fait pas bip). Le bit 7 de la
couleur fait un ou exclusif en mode graphique et un clignotement (uniquement en
mode plein cran) en mode texte.
En mode graphique, l'attribut de couleur ne concerne que le caractre ou le pixel, il
n'agit pas sur la couleur de l'arrire plan. Ceci est valable pour les autres fonctions qui
grent la couleur.

Fonction 0Eh
Cette fonction permet d'crire un caractre,
- Fonctionne en mode graphique,
- Gre le curseur
- Gre la couleur seulement en mode graphique. Seule la couleur du caractre est
gre, la couleur du fond nest pas gre.
paramtres :

AH = 0Eh
AL = code ascii du caractre crire
BL = couleur du caractre (mode graphique uniquement).

Les caractres spciaux sont reconnus :


- 10 (LF : Line Feed ) descend le curseur d'une ligne
- 13 (CR : Carriage Return ) ramne le curseur en dbut de lignes
- 08 (BS : Back Space ) ramne le curseur d'une position gauche
- 07 (BEL) fait bip
mov ah,0Eh
mov al,'A'
int 10h

; affiche le caractre A la position courante du curseur

Fonction 02
Cette fonction permet de positionner le curseur o on le dsire, dans la page courante
ou dans une page cache.
Paramtres :

AH = 02h
BH = numro de la page
DH = ligne (ordonne)
DL = colonne (abscisse)
En mode 25x80 les cordonnes vont de (0,0) (24,79).

Exercice 17) (affcar.asm)


Programme qui place l'cran en mode texte (3) et affiche le caractre A en vert sur bleu
la position (l=4,c=10)
Exercice 18) (couleurs.asm)
Programme qui place l'cran en mode texte (3) et affiche les 16 premiers caractres de
l'alphabet, chacun sur une line, chacun rpt 40 fois et chacun avec une couleur
diffrente sur fond noir (on commence avec la couleur 0 et on incrmente).

Microprocesseur 8086

37

Fonction 05
Cette fonction permet de slectionner la page active de l'affichage.
Paramtres :

par A. Oumnad

AH = 05h
AL = numro de la page

Fonction 11h, sous fonction 12h


Cette fonction permet de charger le jeu de caractre de hauteur 8 pixels pour avoir un
cran de 50 lignes. (Cette fonction doit tre appele aprs la fonction 00)
Paramtres
AX = 1112h
BL = 30h (08h semble marcher aussi)

Exercice 19) (diag.asm)


Programme qui place l'cran en mode 50 lignes et affiche ensuite l'alphabet (A Z) en
Diagonal

Fonction 0Ch

: allumer un pixel

AH = 0Ch
BH = 0 (numro de page)
AL = couleur du pixel
si bit 7 = 1 on trace en mode XOR sauf en mode 256 couleur
CX = x (abscisse)
DX = y (ordonne)

Exercice 20) (pixel.asm)


Programme qui place l'cran en mode graphique 640x480, 16 couleur et allume le pixel de
coordonnes (200,300) en jaune (14)
4.1.2 L'interruption 21h du DOS
Normalement le DOS est de relativement haut niveau et ne dpend pas de la machine.
Il fait souvent appel au bios qui fonctionne un niveau plus proche de la machine.
L'interruption 21h peut raliser plusieurs fonctions diffrentes. Nous ne citerons ici que
celles que nous utiliserons.

Fonction 02
Cette fonction permet d'crire un caractre. Le caractre est envoy vers la sortie
standard, l'criture peut donc tre redirige dans un fichier.
Paramtres :
AH = 02h
DL = Caractre crire

Fonction 09
Cette fonction permet en un seul appel, d'crire une suite de caractres.
Paramtres :
AH = 09h
DX = Adresse de la chane de caractres
La chane doit tre termine par le caractre $

Microprocesseur 8086

par A. Oumnad

Remarque : Cette interruption retourne $ dans le registre AL et ceci mme si la


documentation officielle affirme le contraire. Donc attention, si vous avez
quelque chose dans AL avant d'appeler cette interruption, ce sera perdu
Exemple : (phrase.asm)
;*********************************************************
; affiche une phrase l'aide de int21_fct09
;*********************************************************
BITS 16
ORG 0x0100
SEGMENT .data
txt
db 'MON PREMIER PROGRAMME NASM$'
SEGMENT .text
MOV AH,9
MOV DX,txt
INT 21h
MOV AX,4C00h
int 21h

;
;
;
;

fonction 9 de int21
adresse du dbut de la phrase
crit la phrase
fin programme

Remarques :
Pour revenir la ligne la fin de la chane : Bonjour,10,13 ,$
Si la chane contient apostrophe : Ecole dingnieurs Ecole d,39,ingnieurs$

Fonction 07
Cette fonction permet de lire un caractre du clavier sans qu'il n'y ait d'cho l'cran.
Paramtre pass :
AH = 07
Paramtre retourn : AL = caractre lu
Les touches fonction retourne 2 caractres, d'abord un octet nul, puis le code tendu
de la touche, il faut donc faire 2 appels conscutifs de la fonction 07.

Exercice 21) (getchar.asm)


Programme qui :
- Affiche l'invit 'Veuillez taper un caractre'
- Attend l'entre d'un caractre au clavier
- Affiche sur la ligne suivante 'Voici le caractre tap ' suivi du caractre

Fonction 0Bh
Cette fonction permet de savoir si un caractre est disponible dans la mmoire tampon
du clavier. Elle est l'quivalente de la fonction kbhit (du C) ou de Keypressed (du
Pascal). Il ne faut pas oublier de vider le buffer par une lecture l'aide de la fonction
07 ou 08, sinon on risque d'avoir des surprises la prochaine lecture du clavier.
Paramtre pass :
AH = 0B
Paramtre retourn : AL = 0 aucun caractre n'a t tap
AL = 255 (-1) au moins un caractre a t tap

38

Microprocesseur 8086

39

par A. Oumnad

Fonction 0Ah
Permet de saisir une chane de caractre au clavier. La saisie s'arrte quand on tape la
touche , le caractre CR (13) est mmoris avec la chane
Paramtres :
DX : adresse du buffer (zone mmoire tampon) o seront stocks la longueur de la
chane ainsi que la chane saisie
[DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet
du buffer la longueur max ne pas dpasser, il faut compter le CR.

Une fois la saisie termine, la fonction place dans le deuxime octet du buffer le
nombre de caractre effectivement saisi. La chane saisie est place tous de suite derrire.

On doit placer ici le nombre de caractre max


saisir, il faut compter le CR

Chane saisie

DX doit
pointer ici

la fonction inscrit ici le


nombre de caractres
effectivement lus

0Dh

la fonction inscrit ici


la chane saisie
suivie de CR

Tableau 4.2 : illustration de la fonction 0AH de int 21h

Exercice 22) : (gets.asm)


Programme qui permet de saisir une chane de moins de 20 caractres et l'affiche ensuite
en diagonale

4.2 ACCES DIRECT A LA MEMOIRE VIDEO


La mmoire vido est une zone mmoire qui
B8000
constitue une image de lcran. Si on crit quelque
chose dans cette mmoire, elle apparat lcran.
Mmoire
cran
En mode texte, chaque position de lcran,
vido
correspondent deux positions (octets) de la
mmoire vido. Le premier octet correspond au
caractre
attribut
caractre affich, le deuxime correspond son
attribut de couleur. La premire paire d'octets
reprsente le caractre en haut gauche de l'cran
Pour le codage de la couleur, voir int 10h, fonction
09.
La mmoire cran commence ladresse B8000h correspondant ladresse
Segment:Offset = B800:0000
Si lcran est configur en mode 80 caractres par ligne. Chaque ligne correspond
160 octets dans la mmoire vido. Pour crire un "A" en rouge sur noir la colonne 20 de
la ligne 10, il faudra crire A=65=41h (code ascii de A) la position 10*160 + 20*2 =
1640 et 04 dans la position suivante. La ligne 0 dbute la position mmoire 0, la ligne 1

Microprocesseur 8086

par A. Oumnad

40

la position 160..., la ligne 10 la position 1600


Quand on programme en assembleur sur un PC, la modification de la valeur du
segment DS peut donner des rsultats inatendus. Nous utiliserons donc le registre
segment ES pour accder la mmoire vido.

4.3 LES TEMPORISATIONS


On peut faire une temporisation en rptant plusieurs fois des instructions qui ne font
rien. Cette mthode l'inconvnient de dpendre de l'horloge systme et ne donnera pas
le mme effet sur des machines diffrentes.
Une autre mthode consisterait se servir du
balayage de l'cran qui est peu prs le mme sur toutes
les machines. L'cran d'un ordinateur est balay ligne par
ligne, de haut en bas, par un spot d'lectrons. Le
balayage de tout l'cran dure peu prs 1/60 s. quand le
spot arrive au coin bas-droite, il remonte directement au
point haut-gauche pour recommencer. Pendant le
balayage de l'cran, le bit 3 (4me) du port 03DAh est gal
0, pendant le retour 'vertical' du spot, ce bit est plac 1. Fig. 4.2 : organigramme de la temporisation
On peut donc essayer de faire une temporisation de l'ordre
de 1/70 s en surveillant le retour du spot. Dans ce qui suit, le bit 3 du port 03DAh sera
dsign par 'spot'.
Un appel unique cette temporisation n'est pas intressant car il peut contenir une
erreur importante dpendant de la position du spot dans l'cran au moment de l'appel.
Mais si on la rpte plusieurs fois pour faire des temporisations plus longues, l'erreur est
minimise car c'est seulement le premier appel qui ne donne pas une temporisation
prcise. Si on la rpte N fois on obtient une temporisation de lordre de N x 1/70 s
spot
dbut

Attend que le spot soit 0


: descente

Rpter N fois

lire le spot

=1?

oui

lire le spot

=0?

fin

Attend que le spot


passe 1 : remonte
oui

Microprocesseur 8086

par A. Oumnad

Aide mmoire :

Mode cran
Ecrit char
Ecrt char
Ecrt char
INT 10h
Pos Curs
Choisir page
Allumer pixel
50 lignes
Ecrt char
Ecrit chane
Lit car !cho
INT 21h
Lit chaine
kbhit

Quelques interruptions
AH
AL
BH
BL
CX DH DL
commentaire
00 mode
09
car
page coul t/g rep
!Curs !CarSpec
0A
car
page
rep
!Curs !CarSpec
0E
car
Coul g
Curs CarSpec
02
page
ligne col
05
page
0Ch couleur page
x
y
11h
12h
30h
02
car ^C^B -> int 23h
09
adresse
$= fin chane
07 Car lu
0Ah
adresse
Voir cours
0B 0 : non
FF : oui

DB
DW
RESB
RESW
EQU
BITS
ORG
SEGMENT
%DEFINE
%INCLUDE

Pseudo instructions et directives


Dfinir byte
X db 123
Dfinir word
X dw 1234h
Rserver byte
X resb 2
Rserver word
X resw 5
Dfinir constante
Port equ 0x378
Gnrer code de n bits
BITS 16
Adresse dbut programme
ORG 0x100 (.com)
Segment de saisie
SEGMENT .text
Dfinir une constante
%define x 1000
Inclure un programme source %include nasmlib.asm

Oprateur
+,-,*
/
//
%
%%
~
&
|
^
<< >>
''

arithmtiques et logique du prproceseur de NASM


arithmtique
mov ax, (2*x+3)/6
Division non signe
Division signe
Modulo non sign
Modulo sign
Complment binaire
ET binaire
OU binaire
XOR binaire
Dcalage gauche et droite
code ascii
'A' = 65

41

Microprocesseur 8086

par A. Oumnad

42

5 CODE MACHINE DES INSTRUCTIONS


Une instruction peut comporter de 1 7 octets dont 1 ou 2 octets pour coder
l'opration, les autres servent dfinir les oprandes.
Dans le cas le plus gnral, linstruction se fait entre un registre et une case mmoire.
Dans le code machine de linstruction, on trouvera le code de lopration (CO), le code du
registre utilis (REG), le code du mode dadressage utilis (MOD) et le code permettant de
dterminer ladresse de la case mmoire (ADR):

Le premier octet est un octet optionnel qui reprsente un prfix qui peut tre un
prfix de rptition ou un prfix de changement de segment.

Le 2me octet dit Code Opration se prsente comme suit :

CO

CO : C'est le code proprement dit de l'instruction


d : dsigne la destination du rsultat
d=0
Rsultat dans mmoire ou opration entre 2 registres
d=1
Rsultat dans registre

w : Opration 8 bits ou 16 bits


w=0
8 bits
w=1
16 bits
Le 3me octet permet de dfinir les oprandes

MOD

REG

ADR

MOD : Ce champ de 2 bits nous informe sur le mode d'adressage : registre,


directe ou la nature du dplacement dans les autres cas,

REG :

Ce champ de 3 bits dsigne le registre constituant un oprande

ADR :

Ce champs de 3 bits prcise ladresse de lautre oprande quand il sagit


dune position mmoire.

Pour une opration entre deux registres R R :


REG = Registre source
ADR = Registre destination
Les octets suivants concernent :

Les dplacements sur 8 ou 16 bits utiliss dans le calcul d'adresse


Les donns sur 8 ou 16 bits dans le cas de l'adressage immdiat
...

Microprocesseur 8086

43

par A. Oumnad

5.1 LES CODES REG, ADR ET MOD


REG
w=1
000
001
010
011
100
101
110
111
00
ES

MOD

ADR

AX
CX
DX
BX
SP
BP

w=0
000
AL
001
CL
010
DL
011
BL
100
AH
101
CH

000
001
010
011
100
101

SI

110

DH

110

DI
111
REG Segment
01
10
CS
SS

BH

111

BX+SI+d
BX+DI+d
BP+SI+d
BP+DI+d
SI+d
DI+d
- BP+d
- Direct
BX+d

00

- Directe
- Indirecte avec dep = 0

Indirect dplacement court :


8 bits, 127, 1 ou 2 chiffres hex
Indirect dp. long : 16 bits,
10
128 , + de 2 chiffres hex
R R ou R im
11 Dans ce cas :
ADR= code registre destination
01

Prfix de changement de segment

11
DS

ES
26h

CS
2Eh

5.2 TABLEAU DES CODES BINAIRES


AAA
AAD
AAM
AAS
ADC
R/M R
R/M im
AL/AX im
ADD
R/M R
R/M im (**)
AL/AX im
AND
R/M R
R/M im
Ac im
BOUND
CALL
intra segment direct
intra segment indirect
inter segment direct
inter segment indirect
CBW
CLC
CLD
CLI
CMC
CMP
R/M R
R/M im
AL/AX im

0011 0111
1101 0101
1101 0100
0011 1111

0000 1010
0000 1010

0001 00dw
1000 00sw
0001 010w

MOD REG ADR


MOD 010 ADR
donne

(Adr ou dep)
(Adr ou dep)

donne

0000 00dw
1000 00sw
0000 010w

MOD REG ADR


MOD 000 ADR
donne

(Adr ou dep)
(Adr ou dep)

donne

0010 00dw
1000 000w
0010 010w
0110 0010

MOD REG ADR


MOD 100 ADR
donne
MOD REG ADR

(Adr ou dep)
(Adr ou dep)

donne

1110 1000
1111 1111
1001 1010

adresse
MOD 010 ADR
Adresse

(Adr ou dep)
(Dep)
Segment

1001 1000
1111 1000
1111 1100
1111 1010
1111 0101
0011 10dw
1000 00sw
0011 110w

MOD REG ADR


MOD 111 ADR
Donne

(Adr ou dep)
(Adr ou dep)

donne

SS
36h

DS
3Eh

Microprocesseur 8086

44

par A. Oumnad

CMPS
CWD
DAA
DAS
DEC
R/M 8 bits
R 16 bits
DIV R/M
ENTER
EDC
HLT
IDIV R/M
IMUL R/M
IN
Port dfini
Port dans DX
INC
R/M 8 bits
R 16 bits
INS
INT
INTO
IRET
JA
JAE
JB
JBE
JC
JCXZ
JE
JG
JGE
JL
JLE
JMP
intra segment direct
intra segment direct court
intra segment indirect
inter segment direct
inter segment indirect

1010 011w
1001 1001
0010 0111
0010 1111

JNC
JNE
JNO
JNS
JNP
JO
JP
JS
LAHF
LDS

0111 0011
0111 0101
0111 0001
0111 1001
0111 1011
0111 0000
0111 1010
0111 1000
1001 1111
1100 0101

1111 111w
01001 REG
1111 011w
1100 1000
1111 0100
1111 011w
1111 011w

MOD 001 ADR

(Adr ou dep)

MOD 110 ADR


donne

(Adr ou dep)

MOD 111 ADR


MOD 101 ADR

(Adr ou dep)
(Adr ou dep)

1110 010w
1110 110w

Port

1111 111w
01000 REG
0110 110w
1100 1101
1100 1110
1100 1111
0111 0111
0111 0011
0111 0010
0111 0110
1110 0010
1110 0011
0111 0100
0111 1111
0111 1101
0111 1100
0111 1110

MOD 000 ADR

1110 1001
1110 1011
1111 1111
1110 1010
1111 1111

(Adr ou dep)

Num. interruption
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
(jmp etiq)
Dep_Relatif_16
Dep_Relatif_8. (jmp short etiq)
MOD 100 ADR
Adr. branch.16
SegL
MOD 101 ADR
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
MOD REG ADR

(Adr ou dep)

SegH

Microprocesseur 8086

LEA
LEAVE
LES
LOCK
LODS
LOOP
LOOPZ
LOOPNZ
MOV
R/M R
m im
R im
AX/AL M_direct
M_direct AX/AL
Rseg R/M
R/M Rseg
MOVS
MUL R/M
NEG
NOP
NOT
OR
R/M R
R/M im
AX/AL im
OUT
port dfini
port dans DX
OUTS
POP
M
R
Rseg
POPA (*)
POPF
PUSH
M
R
Rseg
PUSHA (*)
PUSHF
RCL
R/M,1
R/M,CL
R/M,im8 (*)
RCR
R/M,1
R/M,CL
R/M,im8 (*)
REP/REPZ, REPNZ

45

par A. Oumnad

10001101
11001001
1100 0100
1111 0000
1010 110w
1110 0010
1110 0001
1110 0000

MOD REG ADR

(Adr ou dep)

MOD REG ADR

(Adr ou dep)

DepRel_8
DepRel_8
DepRel_8

1000 10dw
MOD REG ADR (Adr ou dep)
1100 011w
MOD 000 ADR (Adr ou dep)
1011 w REG
done
1010 000w
Adresse
1010 001w
Adresse
1000 1110 MOD 0 Rseg ADR (Adr ou dep)
1000 1100 MOD 0 Rseg ADR (Adr ou dep)
1010 010w
1111 011w
MOD 100 ADR (Adr ou dep)
1111 011w
MOD 011 ADR (Adr ou dep)
1001 0000
1111 011w
MOD 010 ADR (Adr ou dep)

donne

0000 10dw
1000 000w
0000 110w

MOD REG ADR


MOD 001 ADR
donne

1110 011w
1110 111w
0110 111w

port

1000 1111
0101 1REG
000REG111
0100 0001
1001 1101

MOD 000 ADR

(Adr ou dep)

1111 1111
01010 REG
000REG110
0110 0000
1001 1100

MOD 000 ADR

(Adr ou dep)

1101 000w
1101 001w
1100 000w

MOD 010 ADR


MOD 010 ADR
MOD 010 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

1101 000w
1101 001w
1100 000w
1111 001z

MOD 011 ADR


MOD 011 ADR
MOD 011 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

(Adr ou dep)
(Adr ou dep)

donne

Microprocesseur 8086

RET
intra segment
inter segment
ROL
R/M,1
R/M,CL
R/M,im8 (*)
ROR
R/M,1
R/M,CL
R/M,im8 (*)
SAHF
SAL/SHL
R/M,1
R/M,CL
R/M,im8 (*)
SAR
R/M,1
R/M,CL
R/M,im8 (*)
SBB
R/M R
R/M im
AL/AX im (*)
SCAS
SHR
R/M,1
R/M,CL
R/M,im8 (*)
STC
STD
STI
STOS
SUB
R/M R
M im (**)
R im (**)
AL/AX im
TEST
R/M R
R/M im
AL/AX im
WAIT
XCHG
R/M R
R AX
XLAT
XOR R/M R
R/M im
AL/AX im

46

par A. Oumnad

1100 0011
1100 1011
1101 000w
1101 001w
1100 000w

MOD 000 ADR


MOD 000 ADR
MOD 000 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

1101 000w
1101 001w
1100 000w
1001 1110

MOD 001 ADR


MOD 001 ADR
MOD 001 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

1101 000w
1101 001w
1100 000w

MOD 100 ADR


MOD 100 ADR
MOD 100 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

1101 000w
1101 001w
1100 000w

MOD 111 ADR


MOD 111 ADR
MOD 111 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

0001 10dw
1000 00sw
0001 110w
1010 111w

MOD REG ADR


MOD 011 ADR
donne

(Adr ou dep)
(Adr ou dep)

donne

1101 000w
1101 001w
1100 000w
1111 1001
1111 1101
1111 1011
1010 101w

MOD 101 ADR


MOD 101 ADR
MOD 101 ADR

(Adr ou dep)
(Adr ou dep)
(Adr ou dep)

Donne_8

0010 10dw
1000 00sw
1000 00sw
0010 110w

MOD REG ADR


MOD 101 ADR
11 101 REG
donne

(Adr ou dep)
(Adr ou dep)
donne

1000 010w
1111 011w
1010 100w
1001 1011

MOD REG ADR


MOD 000 ADR
donne

(Adr ou dep)
(Adr ou dep)

1000 011w
10010 REG
1101 0111
0011 00dw
1000 000w
0011 010w

MOD REG ADR

(Adr ou dep)

MOD REG ADR


MOD 110 ADR
donne

(Adr ou dep)
(Adr ou dep)

donne

donne

donne

Microprocesseur 8086

par A. Oumnad

Les champs entre ( ) sont prsents dans le cas de ladressage direct [aaaa] ou de ladressage
indirect avec dplacement [R+dep] ou [Rb + Ri + dep]
Un champ adresse est toujours constitu de 2 octets : AdrL AdrH
Un champ de donne peut tre de 1 ou de 2 octets selon linstruction, DL suivie
ventuellement de DH

(*) Ces instructions ne tournent pas sur le 8086 mais sur les processeurs qui lon suivi
(**) s=1 dans le cas R/M16 im8, une extension de signe 8 bits vers 16 bits est effectus
sur la donne immdiate avant lopration.
Exemples :
mov ax , 3456h
R16 im16
1011 w REG donne
1011 1 000 5634
B8 56 34

mov CL , [BP+SI]
R8 M
1000 10dw MOD REG ADR
1000 1010 00
001 010
8A 0A

Mov bx , 56h
R16 im16
1011 w REG donne
1011 1 011 56 00
BB 56 00

Mov bl, 56h


R8 im8
1011 w REG donne
1011 0 011 56
B3 56

Mov DX , [123h]
R16 M
1000 10dw MOD REG ADR adresse
1000 1011 00
010 110 2301
8B 16 23 01

Mov AX , BX
R16 R16
1000 10dw MOD REG ADR
1000 1001 11
011 000
89 D8

Mov [SI + 146h] , BL


M R8
1000 10dw MOD REG ADR deplong
1000 1000 10
011 100 4601
88 9C 46 01

Mov [BX+DI + 46h] , CX


M R16
1000 10dw MOD REG ADR depcourt
1000 1001 01
001 001 46
89 49 46

mov AX , [3456h]
AX Mdirect
1010 000w adresse
1010 0001 5634
A1 56 34

AND BL , 38h
R8 im
1000 000w MOD 100 ADR done
1000 0000 11 100 011 38
80 E3 38

47

Microprocesseur 8086

48

par A. Oumnad

6 ANNEXE
6.1 INSTRUCTIONS D'AJUSTEMENT DECIMAL
DAA
(Decimal Adjust AL after addition )

AAA

Instruction sans oprande qui agit sur le registre AL pour obtenir un rsultat
BCD aprs laddition de deux nombres BCD (avec rsultat dans AL). AL est un
registre 8 bits, il ne peut reprsenter que 2 chiffres BCD, le rsultat de
laddition ne doit pas dpasser 99.
Algorithme : Aprs laddition, si le drapeau A est positionn ou si les 4 bits de
poids faible de AL reprsente un nombre suprieur 9 alors le processeur
ajoute 6 AL.
AL + BL
AL A
AL

03 + 04
07 0
DAA 07
ADD AL , BL

05
+
07
0C
0
DAA 12
DAA
39 + 28 61 1
DAA 67
(ASCII Adjust after Addition )
Instruction similaire DAA sauf quici, il sagit de la reprsentation BCD
tendue pour laquelle chaque chiffre est cod sur 8 bits (unpacked BCD form ).
Ceci facilite la conversion vers l ASCII, do le nom de linstruction.
Algoritjme : Si laddition des deux chiffres dpasse 9, linstruction AAA recopie
le chiffre des units dans AL, incrmente AH. Si AH tait = 0, on obtient les
dizaines dans AH. Les drapeaux C et A sont positionns.
Ce qui (dune faon plus informatique) peut tre reprsent par :
Si ( LSD(AL) 9 OU A = 1)
AL (AL + 6) AND 0Fh
AL AH + 1
C 1
A 1
Sinon
C 0
A 0
FinSI
MOV AH, 5
ADD AL , BL
AAA

DAS

AAS

AAM

AL
03
05
09

+
+
+
+

BL
AL A
04 07 0
07 0C 0
08 11 1

AH
AAA 05
AAA 06
AAA 06

AL
07
02
07

C
0
1
1

A
0
1
1

(Decimal Adjust AL after Substraction ).


Ajustement dcimal de AL aprs soustraction de deux oprandes BCD pour
que le rsultat soit aussi en BCD. (voir DAA)
(ASCII Adjust after Substraction )
Ajustement dcimal de AL aprs soustraction de deux oprandes BCD au
format tendu (1 chiffre par 8 bits) pour que le rsultat soit de mme type.
(Voir AAA)
(ASCII Adjust AX after multiply ) Ajustement dcimal aprs multiplication
de deux oprandes BCD au format tendu pour que le rsultat soit de

Microprocesseur 8086

par A. Oumnad

49

mme type. L'opration est faite implicitement sur le registre AX. (voir
AAA)
AAD

(ASCII Adjust AX before Division)


Si AX contient un nombre BCD tendu (1 chiffre par 8 bits), cette instruction
effectue un ajustement dcimal inverse c.a.d. une conversion BCD vers binaire.
Cette instruction est utile avant une division, car cette dernire se fait en
binaire. Aprs la division, le quotient prsent dans AL peut tre convertit en
BCD laide de linstruction DAA.
Si AX contient la reprsentation BCDL du nombre dcimal 98, soit
AX=0000100100001000. Si on dsire faire une division, il faut d'abord convertir
AX en binaire (AAD), raliser la division (DIV) et convertir ensuite le rsultat en
BCD (DAA) :
- AAD donne la reprsentation de 98 en binaire AX = 0000 0000 0110 0010
- DIV BL (avec BL=8) donne AH=02 = reste, et AL = 0C = quotient
Si on veut que le quotient soit reprsent en BCD, on peut utiliser linstruction
DAA et on obtient AL = 0001 0010 = 12 (BCD)

6.2 LES INSTRUCTIONS DE MANIPULATION DE CHAINES


Les instructions de manipulation de chanes sont au nombre de 5 :
MOVS, LODS, STOS sont des instructions de transfert, elles peuvent tre rptes
l'aide du prfix REP
CMPS et SCAS sont des instructions de comparaisons, elles peuvent tre rptes
l'aide du prfix REPZ
Chacune des instructions existe en deux versions, l'une se fait entre deux octets
XXXXB , l'autre se fait entre 2 words XXXXW
Ces instructions sont utilises sans oprandes. Les oprations se font implicitement
entre 2 oprandes points par les registres d'index SI et DI. L'oprande point par SI
constitue l'oprande source, celui point par DI constitue l'oprande destination.
L'oprande source est pris par dfaut dans le segment DATA moins que l'on prcise
dans l'instruction un prfix de changement de segment qui oblige le processeur prendre
l'oprande source dans un autres segment.
L'oprande destination est toujours situ dans le segment EXTRA, on ne peut pas le
modifier.
[DS:SI] [ES:DI]
Aprs chaque opration SI et DI sont automatiquement incrments ou dcrments
selon la valeur de l'indicateur D :
o D = 0 SI et DI sont incrments, (voir instruction CLD)
o D = 1 SI et DI sont dcrments. (Voir instruction STD)
SI et DI sont incrments de 1 ou de 2 selon que l'opration s'effectue sur un octet
(byte) ou sur un mot de 16 bits (word).

Microprocesseur 8086

50

par A. Oumnad

MOVS : Copie l'oprande source dans l'oprande destination

MOVSB :

Copie un octet depuis la case source [DS:SI] vers la case destination


[ES:DI] puis auto inc/decrmente les registre SI et DI

DATA segment

EXTRA segment

EXTRA segment

EXTRA segment

SI

DI

SI

DI
ES MOVSB

MOVSB

MOVSW :

Transfert deux octets depuis la source vers la destination puis auto


inc/decrmente de 2 les registre SI et DI

DATA segment

EXTRA segment

EXTRA segment

EXTRA segment

SI

DI

SI

DI

MOVSW

ES MOVSW

Grce au prfixe de rptition REP, les instructions MOVSB et MOVSW sont rptes CX
fois ce qui permet de copier une zone mmoire dans une autre.

Exercice 23)
Programme qui recopie 500 octets de la position 4000h du DATA segment vers la position
6000h du EXTRA segment
Exercice 24)
Programme qui recopie 500 octets de la position 4000h du EXTRA segment vers la
position 6000h du mme segment
Exercice 25)
Programme qui recopie 500 octets de la position 4000h du DATA segment vers la position
6000h du mme segment

Microprocesseur 8086

par A. Oumnad

51

LODS
LODSB : Copie l'octet source dans AL puis inc/decr le registre SI.
LODSW : Copie le mot source dans AX puis inc/decr de 2 le registre SI
La rptition de cette instruction est sans intrt.
STOS
STOSB : Copie AL dans loctet destination et inc/decr le registre DI.
STOSW : Copie AX dans le mot destination et inc/dec de 2 le registres DI.
Avec le prfix de rptions REP, Cette instruction permet dinitialiser une chane
(une zone mmoire) avec le mme caractre.
CMPS
CMPSB :
CMPSW :

Compare l'octet source avec l'octet destination, positionne les indicateurs


puis inc/decrmente les registres SI et DI.
Compare le mot source avec mot destination, positionne les indicateurs
puis inc/decrmente de 2 les registres SI et DI

Avec le prfixe de rptition REPZ (repeat while Z) , cette instruction est rpte CX
fois tant que Z=1
Avec le prfixe de rptition REPNZ (repeat while not Z) , cette instruction est
rpte CX fois tant que Z=0

La rptition de cette instruction permet par exemple la comparaison de deux chanes


de caractres

Exercice 26) (compstr.asm)


Donner le programme qui compare deux chanes de 30 caractres situs
respectivement aux adresses 4000h et 6000h et positionne AL comme suit :
AL = 0 si galit, AL = -1 si diffrents
SCAS
SCASB :
SCASW :

Compare AL avec l'octet destination, positionne les indicateurs puis


inc/decrmente le registre DI.
Compare AX avec le mot destination, positionne les indicateurs puis
inc/dec le registre DI de 2

Avec le prfixe de rptition REPZ (repeat while Z) , cette instruction est rpte CX
fois tant que Z=1
Avec le prfixe de rptition REPNZ (repeat while not Z) , cette instruction est
rpte CX fois tant que Z=0

Avec rptition cette opration permet (par exemple) de chercher l'occurrence d'une

Microprocesseur 8086

52

par A. Oumnad

valeur dans une chane

Exercice 27) (findchar.asm)


Donner le programme qui cherche le caractre 'X' dans la chane de 30 caractres
situe l'adresse 4000h du data segment.
- trouv

DI = adresse
- non trouv

DI = -1

6.3 INSTRUCTIONS DE TRANSFERT D'ADRESSE


LEA R16 , M
(Load Effective Adress ) Transfert l'offset de ladresse de M dans le registre R16.
LEA AX, [BX+124]
; Copier dans AX la valeur de BX + 124
Remarquer que lon serait tent dutiliser la syntaxe suivante :
MOV AX, BX+124 ;incorrect car pour raliser une addition il faut utiliser linstruction
ADD
LDS R16 , [adr] (Load pointer into DS )
Le mot point par adr est recopi dans R16 et le mot suivant est recopi dans DS
LDS BX,[200h]
Aprs linstruction ci-dessus on aura :
BX = 3130h
et DS = 3332h

30h 200h
31h
32h
33h
34h
35h

Cette instruction doit tre utilise avec beaucoup de prcaution, car on changeant la
valeur de DS, les donnes dclares dans le DATA segment ne seront plus accessibles.
LES R16,[adr] (Load pointer into ES )
Similaire LDS, ici le 2me mot est charg dans ES

6.4 INSTRUCTIONS DIVERSES


XLAT
Instruction sans oprande qui recopie dans AL le contenu de la case mmoire pointe
par BX+AL
Peut servir dans des oprations de transcodage en faisant correspondre au contenu de
AL une valeur pralablement range dans un tableau. BX doit tre initialis pour pointer
sur le dbut de la table et AL sert de registre d'index par rapport BX pour localiser
l'lment dsir dans la table.
La figure ci-contre montre une table contenant les codes ASCII
de quelques chiffres. Pour dterminer le code ASCII dun chiffre, il (0)
(1)
suffit de placer le chiffre dans AL et dexcuter linstruction XLAT
(2)
(3)
(4)
(5)

48
49
50
51
52
53

2FA3

Microprocesseur 8086

par A. Oumnad

MOV BX,2FA3h
MOV AL,3
XLAT
Le code ASCII de du chiffre 3 se trouve maintenant dan AL
HALT

Met le processeur en mode veille. On peut sortir de cet tat soit par une
interruption externe autorise soit par un RESET.

WAIT

Met le processeur en mode WAIT. On peut sortir de cet tat quand la


broche test du processeur passe au niveau 1. Cette instruction sert
synchroniser le processeur sur des vnements externes. Si une
interruption externe autorise intervient lors du mode WAIT, elle est
excute puis le processeur revient en mode WAIT.

53

Vous aimerez peut-être aussi