Académique Documents
Professionnel Documents
Culture Documents
Oumnad 1
MICROPROCESSEURS
DE LA FAMILLE
8086
Microprocesseur 8086 par A. Oumnad 2
Sommaire
Objectif du cours
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 4
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 Source
Codes machine tels qu'ils Codes machine comme Ecriture plus lisible dite
seront prsents au processeur
on a pris l'habitude de Mnmonique
les reprsenter sur papier ou Assembleur
10111101 01000001 00000000 BD 41 00 MOV BP,41h
10111110 01100101 01000001 BE 65 41 MOV SI,4165h
00000001 11011000 01 D8 ADD AX,BX
00111000 01000111 00000011 38 47 03 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 5
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
BD Dbut du programme
4000
4001 41
4002 00
4003 BE
4004 65
4005 41
4006 65
Microprocesseur 8086 par A. Oumnad 6
Les diffrents constituants du Processeur peuvent tre regroups dans deux blocs
principaux, l'unit de calcul et l'unit de control.
registre registre
registre registre RI PC
registre registre
Decodeur
ALU Squenceur
RE
registre Horloge
L'ALU : A B
Elle est constitue d'un circuit logique
combinatoire qui reoit deux oprandes A (An ... ...
. . . A1 A0) et B (Bn . . . B1 B0) et produit le An A2 A1 A0 Bn B2 B1 B0
rsultat S (Sm . . . S1 S0) selon l'indication C0
applique sur l'entre C (Ck . . . C1 C0). Les . C1
.
oprations ralises peuvent tre soit .
arithmtiques, S=A+B, S=A-B, S=AxB ou Ck
Sm S2S1S0
logiques S=A OU B, S=A ET B, S= A XOR B ...
Les registres : S
Ce sont des mmoires lmentaires Fig. 1.2 : Unit arithmtique et logique
pouvant contenir chacun un oprande. Les
registres peuvent tre de 8, 16 ou 32 bits.
Microprocesseur 8086 par A. Oumnad 7
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 8
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.
CS
AX
DS
BX
SS
CX
RE ES
DX
BP
SP
SI Calcul
DI d'adresse
RT RT
dcodage
contrle File d'attente
squencement
RE
X X X X 0 Segment
+ X X X X Offset
X X X X X 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 par A. Oumnad 10
2 0 0 0 Segment
+ 3 5 0 Offset
2 0 3 5 0 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.
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
AX AH AL SP CS IP
BX BH BL BP DS FLAGS
CX CH CL SI SS
DX DH DL DI ES
AX : 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
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
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
Si le registre segment nest pas spcifi (cas rien), alors le processeur lajoute par dfaut
selon loffset choisit :
Six bits refltent les rsultats d'une opration arithmtique ou logique et 3 participent
au control du processeur.
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.
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
Lopration est ralise entre les 2 oprandes et le rsultat est toujours rcupr dans
loprande de gauche.
Les oprandes peuvent tre des registres, des constantes ou le contenu de cases
mmoire, on appelle a le mode dadressage
Exemples :
INC AX : incrmenter le registre AX
MOV AX, BX : Copier le contenu de BX dans AX
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
Microprocesseur 8086 par A. Oumnad 15
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'
MOV AX,'ab' : Charger AH par 'a' et AL par 'b'
INST R , [adr]
INST [adr] , R
INST taille [adr] , im
Exemples :
MOV AX,[243] : Copier le contenu de la mmoire d'adresse DS:243 dans AX
MOV [123],AX : Copier le contenu de AX dan la mmoire d'adresse DS:123
MOV AX, [SS:243] : Copier le contenu de la mmoire SS:243 dans AX
Exemples :
MOV AX, [BX] ; Charger AX par le contenu de la mmoire d'adresse DS:BX
MOV AX, [BP] ; Charger AX par le contenu de la mmoire d'adresse SS:BP
MOV AX, [SI] ; Charger AX par le contenu de la mmoire d'adresse DS:SI
MOV AX, [DI] ; Charger AX par le contenu de la mmoire d'adresse DS:DI
MOV AX, [ES:BP] ; Charger AX par le contenu de la mmoire d'adresse ES:BP
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
Exemples :
MOV AX, [SI] ; Charger AX par le contenu de la mmoire d'adresse DS:SI
MOV AX, [SI+500] ; Charger AX par la mmoire d'adresse DS:SI+500
MOV AX, [DI-8] ; Charger AX par la mmoire d'adresse DS:DI-8
MOV AX, [ES:SI+4] ; Charger AX par la mmoire d'adresse ES:SI+4
Exemples :
MOV AX,[BX+SI] ; AX est charg par la mmoire d'adresse DS:BX+SI
MOV AX,[BX+DI+5] ; AX est charg par la mmoire d'adresse DS:BX+DI+5
MOV AX,[BP+SI-8] ; AX est charg par la mmoire d'adresse SS:BP+SI-8
MOV AX,[BP+DI] ; AX est charg par la mmoire d'adresse SS:BP+DI
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.
Si le registre est un registre double (2 octets), lopration se fera avec deux cases
mmoires
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 :
adresse 4A
00
MOV Od , Os
Copie l'oprande Source dans l'oprande Destination
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)
X X X X
X DX SP DX BP SP
CX SP CX CX SP CX
BX BX BX BX
AX AX AX AX
X X X X
X X X X
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 [ ] , [ ]
Addition :
Exercice 4) :
Soustraction
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).
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 BL ; AL x BL AX
MUL CX ; AX x CX DX:AX
MUL byte [BX] ; AL x (octet point par BX) AX
MUL word [BX] ; AX x (word point par BX) DX :AX
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
mov al,64h
mov bl,2
mul bl
mov al,64h
mov cl,3
mul cl
MOV al,11111111b
mov bl,00000010b
mul bl
MOV al,11111111b
mov bl,00000010b
imul bl
Division
CBW (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
AND Od , Os ET logique
Od ET Os Od
OR Od , Os OU logique
Od OU Os Od
Microprocesseur 8086 par A. Oumnad 23
TEST Od , Os Similaire AND mais ne retourne pas de rsultat dans Od, seuls les
indicateurs sont positionns
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
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
C MSB LSB
MSB LSB C
MSB LSB C
Les dcalages arithmtiques permettent de conserver le signe. Ils sont utiliss pour
effectuer des oprations arithmtiques comme des multiplications et des
divisions par 2.
C MSB LSB
MSB LSB C
C MSB LSB
Microprocesseur 8086 par A. Oumnad 25
MSB LSB C
LAHF
Copier l'octet bas du registre d'tat dans AH
AH : S Z A P C
Aprs l'opration, on a :
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 26
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,
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)
Branchements inconditionnels
Branchements conditionnels
Appel de fonction ou dinterruptions
Microprocesseur 8086 par A. Oumnad 27
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.
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
JBE xyz (Jump if Bellow or Equal ) aller la ligne xyz si infrieur ou gal (non
sign). C'est--dire si C + Z = 1
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
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
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 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
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
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 :
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 :
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
On ne peut pas utiliser directement une adresse segment dans une instruction, il faut
passer par un registre segment.
On ne peut pas faire une multiplication ou une division sur une donne (immdiat)
MUL im
DIV im
Microprocesseur 8086 par A. Oumnad 31
PUSH R/M8
On ne peut pas utiliser les oprateurs + - x sur des registre ou des mmoires
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 AH AL SP CS O D I T S Z A P C
BX BH BL BP DS
CX CH CL SI SS * : Positionn selon le rsultat
DX DH DL DI ES ? : Modifi, rsultat non dfini
Transfert O S Z A P C Branchement O S Z A P C
MOV D , S D S JMP a branche l'adresse a
PUSH R/M empile R/M (16 bits) JE/JZ a saut si = (Z lev)
POP R/M dpile R/M (16 bits) JNE/JNZ a saut si (Z baiss)
XCHG D , S D S JA a saut si (non sign)
XLAT AL [BX+AL] JAE a saut si (non sign)
LEA R16 , M R16 offset de M JB a saut si (non sign)
LDS R16 , [a]
R16 [a], DS[a+2] JBE a saut si (non sign)
LES R16 , [a]
R16 [a], ES[a+2] JG a saut si (sign)
Arithmtique JGE a saut si (sign)
ADD D , S DS+D * * * * * * JL a saut si (sign)
ADC D , S DS+D+C * * * * * * JLE a saut si (sign)
INC D DD+1 * * * * * ! JC a saut si C = 1
SUB D,S DD-S * * * * * * JNC a saut si C = 0
SBB D,S DDS-C * * * * * * JO a saut si O = 1
NEG D D -D * * * * * * JNC a saut si C = 0
CMP D,S D-S * * * * * * JP/JPE a saut si P = 1
DEC D DD-1 * * * * * * JNP/JPO a saut si P = 0
MUL S X:A A x S * ? ? ? ? * JS a saut si S = 1
IMUL S X:A A x S (signe) * ? ? ? ? * JNS a saut si S = 0
DIV S A(X:A) / S, XRst ? ? ? ? ? ? CALL a saut sous programme
IDIV S division signe ? ? ? ? ? ? RET retour de sous programme
CBW Byte(AL) to word(AX) ( sign) LOOP A dec CX, saut si CX 0
CWD Word(AX) to Dword (DX|AX) (sign) LOOPZ a dec CX, saut si :CX 0 et Z = 1
DAA Dec. adj. after ADD ? * * * * * LOOPNZ a dec CX, saut si :CX 0 et Z = 0
AAA ascii adj after ADD ? ? ? * ? * JCXZ a saut si CX = 0 ( Z)
DAS dec adj after SUB ? * * * * * action sur Indicateurs
AAS ascii adj after SUB ? ? ? * ? * LAHF AH RE L
AAM ascii adj after MUL ? * * ? * ? SAHF REL AH * * * * *
AAD ascii adj before DIV ? * * ? * ? PUSHF empile RE
Logique POPF dpile RE * * * * * *
NOT R/M R/M R/M CLC Clear Carry flag 0
AND D , S D D AND S 0 * * ? * 0 STC Set Carry flag 1
OR D , S D D OR S 0 * * ? * 0 CMC complmente Carry *
XOR D , S D D XOR S 0 * * ? * 0 CLD Clear Direction flag
TEST D , S D AND S 0 * * ? * 0 STD Set Direction flag
SHL/SHL R/M C 0 * * * ? * * CLI Clear Interrupt flag
SHR R/M 0 C * * * ? * * STI Set Interrupt flag
SAR R/M C * * * ? * * Divers
ROL R/M C * INT n dclenche l'interrupt n
ROR R/M C * INTO n interrupt si Overflow
RCL R/M C * IRET Retour d'interruption * * * * * *
RCR R/M C * HALT entre en mode vail
Chanes WAIT entre en attente
MOVSb/w [ES:DI] [DS:SI], NOP ne fait rien
SCASb/w AL/AX [ES:DI]; * * * * * * IN al/ax,port Lit un port d' E/S
LODSb/w AL/AX [DS:SI] out port,al/ax crit dans un port
CMPSb/w [ES:DI] - [DS:SI], * * * * * *
STOSb/w AL/AX [ES:DI] * * * * * *
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.
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.
%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
: 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 par A. Oumnad 35
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
Rsolution dimensions Rsolution
AL mode Couleurs pages Segment
texte caractre graphique
00h T 40x25 9x16 360x400 16 8 B800
01h T 40x25 9x16 360x400 16 8 B800
02h T 80x25 9x16 720x400 16 8 B800
03h T 80x25 9x16 720x400 16 8 B800
04h G 40x25 8x8 320x200 4 . B800
05h G 40x25 8x8 320x200 4 . B800
06h G 80x25 8x8 640x200 2 . B800
07h T 80x25 9x16 720x400 mono . B000
0Dh G 40x25 8x8 320x200 16 8 A000
0Eh G 80x25 8x8 640x200 16 4 A000
0Fh G 80x25 8x14 640x350 mono 2 A000
10h G 80x25 8x14 640x350 16 . A000
11h G 80x30 8x16 640x480 mono . A000
12h G 80x30 8x16 640x480 16 . A000
13h G 40x25 8x8 320x200 256 . 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
Cette fonction permet d'crire un caractre couleur couleur
arrire plan texte
- 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.
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).
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).
Fonction 05
Cette fonction permet de slectionner la page active de l'affichage.
Paramtres : AH = 05h
AL = numro de la page
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)
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 38
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 ; fonction 9 de int21
MOV DX,txt ; adresse du dbut de la phrase
INT 21h ; crit la phrase
MOV AX,4C00h ; fin programme
int 21h
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.
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
Microprocesseur 8086 par A. Oumnad 39
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.
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
oui
=1?
Rpter N fois
fin
Microprocesseur 8086 par A. Oumnad 41
Aide mmoire :
Quelques interruptions
AH AL BH BL CX DH DL commentaire
Mode cran 00 mode
Ecrit char 09 car page coul t/g rep !Curs !CarSpec
Ecrt char 0A car page rep !Curs !CarSpec
Ecrt char 0E car Coul g Curs CarSpec
INT 10h
Pos Curs 02 page ligne col
Choisir page 05 page
Allumer pixel 0Ch couleur page x y
50 lignes 11h 12h 30h
Ecrt char 02 car ^C^B -> int 23h
Ecrit chane 09 adresse $= fin chane
Lit car !cho 07 Car lu
INT 21h
Lit chaine 0Ah adresse Voir cours
kbhit 0B 0 : non
FF : oui
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.
7 6 5 4 3 2 1 0
CO d w
7 6 5 4 3 2 1 0
REG MOD
ADR
w=1 w=0
- Directe
000 AX 000 AL 000 BX+SI+d 00
- Indirecte avec dep = 0
001 CX 001 CL 001 BX+DI+d
010 DX 010 DL 010 BP+SI+d Indirect dplacement court :
01
011 BX 011 BL 011 BP+DI+d 8 bits, 127, 1 ou 2 chiffres hex
100 SP 100 AH 100 SI+d Indirect dp. long : 16 bits,
10
101 BP 101 CH 101 DI+d 128 , + de 2 chiffres hex
- BP+d R R ou R im
110 SI 110 DH 110
- Direct 11 Dans ce cas :
111 DI 111 BH 111 BX+d ADR= code registre destination
REG Segment Prfix de changement de segment
00 01 10 11 ES CS SS DS
ES CS SS DS 26h 2Eh 36h 3Eh
RET
intra segment 1100 0011
inter segment 1100 1011
ROL
R/M,1 1101 000w MOD 000 ADR (Adr ou dep)
R/M,CL 1101 001w MOD 000 ADR (Adr ou dep)
R/M,im8 (*) 1100 000w MOD 000 ADR (Adr ou dep) Donne_8
ROR
R/M,1 1101 000w MOD 001 ADR (Adr ou dep)
R/M,CL 1101 001w MOD 001 ADR (Adr ou dep)
R/M,im8 (*) 1100 000w MOD 001 ADR (Adr ou dep) Donne_8
SAHF 1001 1110
SAL/SHL
R/M,1 1101 000w MOD 100 ADR (Adr ou dep)
R/M,CL 1101 001w MOD 100 ADR (Adr ou dep)
R/M,im8 (*) 1100 000w MOD 100 ADR (Adr ou dep) Donne_8
SAR
R/M,1 1101 000w MOD 111 ADR (Adr ou dep)
R/M,CL 1101 001w MOD 111 ADR (Adr ou dep)
R/M,im8 (*) 1100 000w MOD 111 ADR (Adr ou dep) Donne_8
SBB
R/M R 0001 10dw MOD REG ADR (Adr ou dep)
R/M im 1000 00sw MOD 011 ADR (Adr ou dep) donne
AL/AX im (*) 0001 110w donne
SCAS 1010 111w
SHR
R/M,1 1101 000w MOD 101 ADR (Adr ou dep)
R/M,CL 1101 001w MOD 101 ADR (Adr ou dep)
R/M,im8 (*) 1100 000w MOD 101 ADR (Adr ou dep) Donne_8
STC 1111 1001
STD 1111 1101
STI 1111 1011
STOS 1010 101w
SUB
R/M R 0010 10dw MOD REG ADR (Adr ou dep)
M im (**) 1000 00sw MOD 101 ADR (Adr ou dep) donne
R im (**) 1000 00sw 11 101 REG donne
AL/AX im 0010 110w donne
TEST
R/M R 1000 010w MOD REG ADR (Adr ou dep)
R/M im 1111 011w MOD 000 ADR (Adr ou dep) donne
AL/AX im 1010 100w donne
WAIT 1001 1011
XCHG
R/M R 1000 011w MOD REG ADR (Adr ou dep)
R AX 10010 REG
XLAT 1101 0111
XOR R/M R 0011 00dw MOD REG ADR (Adr ou dep)
R/M im 1000 000w MOD 110 ADR (Adr ou dep) donne
AL/AX im 0011 010w donne
Microprocesseur 8086 par A. Oumnad 47
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 mov CL , [BP+SI]
R16 im16 R8 M
1011 w REG donne 1000 10dw MOD REG ADR
1011 1 000 5634 1000 1010 00 001 010
B8 56 34 8A 0A
6 ANNEXE
6.1 INSTRUCTIONS D'AJUSTEMENT DECIMAL
DAA (Decimal Adjust AL after addition )
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
ADD AL , BL 03 + 04 07 0 DAA 07
DAA 05 + 07 0C 0 DAA 12
39 + 28 61 1 DAA 67
AAA (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 AL + BL AL A AH AL C A
ADD AL , BL 03 + 04 07 0 AAA 05 07 0 0
AAA 05 + 07 0C 0 AAA 06 02 1 1
09 + 08 11 1 AAA 06 07 1 1
DAS (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)
mme type. L'opration est faite implicitement sur le registre AX. (voir
AAA)
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]
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
SI DI SI DI
MOVSB ES MOVSB
MOVSW : Transfert deux octets depuis la source vers la destination puis auto
inc/decrmente de 2 les registre SI et DI
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.
STOS
STOSB : Copie AL dans loctet destination et inc/decr le registre DI.
Avec le prfix de rptions REP, Cette instruction permet dinitialiser une chane
(une zone mmoire) avec le mme caractre.
CMPS
CMPSB : Compare l'octet source avec l'octet destination, positionne les indicateurs
puis inc/decrmente les registres SI et DI.
CMPSW : 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
SCAS
SCASB : Compare AL avec l'octet destination, positionne les indicateurs puis
inc/decrmente le registre 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
Avec rptition cette opration permet (par exemple) de chercher l'occurrence d'une
Microprocesseur 8086 par A. Oumnad 52
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
XLAT
Instruction sans oprande qui recopie dans AL le contenu de la case mmoire pointe
par BX+AL
La figure ci-contre montre une table contenant les codes ASCII 2FA3
de quelques chiffres. Pour dterminer le code ASCII dun chiffre, il (0) 48
suffit de placer le chiffre dans AL et dexcuter linstruction XLAT (1) 49
(2) 50
(3) 51
(4) 52
(5) 53
Microprocesseur 8086 par A. Oumnad 53
MOV BX,2FA3h
MOV AL,3
XLAT
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.