50 Chapitre 5 - La Programmation en Assembleur Du Microprocesseur 8086
50 Chapitre 5 - La Programmation en Assembleur Du Microprocesseur 8086
50 Chapitre 5 - La Programmation en Assembleur Du Microprocesseur 8086
6.1 Définitions
Une interface d’entrées/sorties est un circuit intégré permettant au microprocesseur de
communiquer avec l’environnement extérieur (périphériques) : clavier, écran, imprimante,
modem, disques, processus industriel, ...
Les interfaces d’E/S sont connectées au microprocesseur à travers les bus d’adresses, de
données et de commandes.
données
adresses
commandes
D0 - Dn
lignes de
données
A0 - Ap circuit
microprocesseur
lignes d'E/S
périphériques
d'adresses
(p = 1 ou 2, lignes
en général) d'E/S
commandes RD
de lecture/
écriture WR
signal de
CS
selection
de boîtier
00000H
Conséquences :
– l’espace d’adressage des mémoires diminue ;
– l’adressage des ports d’E/S se fait avec une adresse de même longueur (même
nombre de bits) que pour les cases mémoires ;
– toutes les instructions employées avec des cases mémoires peuvent être ap-
pliquées aux ports d’E/S : les mêmes instructions permettent de lire et écrire
dans la mémoire et les ports d’E/S, tous les modes d’adressage étant valables
pour les E/S.
• adressage indépendant : le microprocesseur considère deux espaces distincts :
– l’espace d’adressage des mémoires ;
– l’espace d’adressage des ports d’E/S.
C’est le cas du microprocesseur 8086 :
FFFFFH
circuits
1 Mo mémoire
FFFFH
64 Ko circuits
d'E/S
00000H 0000H
espace mémoire espace E/S
Conséquences :
– contrairement à l’adressage cartographique, l’espace mémoire total adressable
n’est pas diminué ;
– l’adressage des port d’E/S peut se faire avec une adresse plus courte (nombre
de bits inférieur) que pour les circuits mémoires ;
– les instructions utilisées pour l’accès à la mémoire ne sont plus utilisables pour
l’accès aux ports d’E/S : ceux-ci disposent d’instructions spécifiques ;
– une même adresse peut désigner soit une case mémoire, soit un port d’E/S : le
microprocesseur doit donc fournir un signal permettant de différencier l’adres-
sage de la mémoire de l’adressage des ports d’E/S.
Remarque : l’adressage indépendant des ports d’E/S n’est possible que pour les micro-
processeurs possédant un signal permettant de différencier l’adressage de la mémoire de
l’adressage des ports d’E/S ainsi que les instructions spécifiques pour l’accès aux ports
d’E/S. Par contre, l’adressage cartographique est possible pour tous les microprocesseurs.
Ce signal est utilisé pour valider le décodage d’adresse dans les deux espaces :
décodeur 3 vers 8
bus d'adresses
A Y0
B Y1
C Y2 signaux de
74138 Y3 validation
Y4 des circuits
validation
mémoire
G2B Y5
G2A Y6
M/IO
G1 Y7
bus d'adresses
A Y0
B Y1
C Y2 signaux de
74138 Y3 validation
Y4 des circuits
validation
d'E/S
G2B Y5
G2A Y6
+5 V G1 Y7
Les instructions de lecture et d’écriture d’un port d’E/S sont respectivement les instruc-
tions IN et OUT. Elles placent la ligne M/IO à 0 alors que l’instruction MOV place
celle-ci à 1.
Lecture d’un port d’E/S :
• si l’adresse du port d’E/S est sur un octet :
IN AL,adresse : lecture d’un port sur 8 bits ;
IN AX,adresse : lecture d’un port sur 16 bits.
• si l’adresse du port d’E/S est sur deux octets :
IN AL,DX : lecture d’un port sur 8 bits ;
IN AX,DX : lecture d’un port sur 16 bits.
où le registre DX contient l’adresse du port d’E/S à lire.
Ecriture d’un port d’E/S :
• si l’adresse du port d’E/S est sur un octet :
OUT adresse,AL : écriture d’un port sur 8 bits ;
OUT adresse,AX : écriture d’un port sur 16 bits.
• si l’adresse du port d’E/S est sur deux octets :
OUT DX,AL : écriture d’un port sur 8 bits ;
OUT DX,AX : écriture d’un port sur 16 bits.
où le registre DX contient l’adresse du port d’E/S à écrire.
Exemples :
• lecture d’un port d’E/S sur 8 bits à l’adresse 300H :
mov dx,300H
in al,dx
• écriture de la valeur 1234H dans le port d’E/S sur 16 bits à l’adresse 49H :
mov ax,1234H
out 49H,ax
adresses
commandes
Le 8255 est une interface parallèle programmable : elle peut être configurée en entrée
et/ou en sortie par programme.
Brochage du 8255 :
PA3 1 40 PA4
PA2 2 39 PA5
PA1 3 38 PA6
PA0 4 37 PA7
RD 5 36 WR
CS 6 8255 35 RESET
GND 7 34 D0
A1 8 33 D1
A0 9 32 D2
PC7 10 31 D3
PC6 11 30 D4
PC5 12 29 D5
PC4 13 28 D6
PC0 14 27 D7
PC1 15 26 VCC
PC2 16 25 PB7
PC3 17 24 PB6
PB0 18 23 PB5
PB1 19 22 PB4
PB2 20 21 PB3
Schéma fonctionnel :
alimentation
VCC GND
RD 8
port A
WR (PA0 - PA7)
groupe A
lignes de A0
contrôle A1 8255 4 port C
haut
RESET (PC4 - PC7)
CS
4 port C
bas
groupe B
D0 - D7 (PC0 - PC3)
bus de
données 8 port B
(PB0 - PB7)
D7 D6 D5 D4 D3 D2 D1 D0
drapeau
1 = actif
Groupe A Groupe B
sélection de port C bas
mode : 1 = entrée
00 = mode 0 0 = sortie
01 = mode 1 port B
1x = mode 2 1 = entrée
port A 0 = sortie
1 = entrée
0 = sortie sélection de
mode :
port C haut 0 = mode 0
1 = entrée 1 = mode 1
0 = sortie
Connexion du 8255 sur les bus du 8086 : le bus de données du 8255 est sur 8 bits
alors que celui du microprocesseur 8086 est sur 16 bits. On peut donc connecter le bus de
données du 8255 sur les lignes de données de poids faible du 8086 (D0 - D7) ou sur celles
de poids fort (D8 - D15).
Une donnée est envoyée (ou reçue) par le microprocesseur 8086 :
• sur la partie faible du bus de données lorsque l’adresse à écrire (ou à lire) est paire :
validation par A0 ;
• sur la partie haute lorsque l’adresse est impaire : validation par BHE.
Ainsi l’un de ces deux signaux A0 ou BHE doit être utilisé pour sélectionner le 8255 :
D0 - D7 D0
.
ou . 8255
D8 - D15 .
D7
M/IO
validation RD RD
décodeur WR WR
A3 - A15 d'adresses
CS
A0 ou BHE
A1 A0
A2 A1
Conséquence : les adresses des registres du 8255 se trouvent à des adresses paires (valida-
tion par A0) ou impaires (validation par BHE).
D0
.
D0 - D7 . 8255
.
D7
A8 A Y0
RD RD
A9 B Y1
WR WR
A10 C Y2
74138 Y3
CS
Y4 A0
validation
G2B Y5 A1 A0
M/IO G2A Y6 A2 A1
+5 V G1 Y7
transmetteur
8 bidirectionnel
D0 - D7 A B
8286
8 D0
DT/R DIR .
.
EN . PA
D7
8
D8 - D15 A B 8255
8286
DIR
BHE
EN
PB
M/IO
validation
décodeur
A2- A15 d'adresses
CS
A1 A1 PC
A0 A0
RD RD
WR WR
K0 0
PA0
1
D0
. K1 0
8086 D0 - D7 .. 8255 PA1
1
D7 K2 0
PA2
1
adresse
de base PB0
= 300H
LED
données
adresses
commandes
Exemple : transmission du caractère ’E’ (code ASCII 45H = 01000101B) sous forme série
selon la norme RS232 :
+9 à +15 V
LSB MSB
-9 à -15 V
1 0 1 0 0 0 1 0
horloge
• 8251 (Intel) ;
• 6850 (Motorola).
Connexion de deux équipements par une liaison série RS232 : les équipements
qui peuvent être connectés à travers une liaison série RS232 sont de deux types :
Pour connecter ces équipements, on utilise des connecteurs normalisés DB9 ou DB25 :
1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13
6 7 8 9 14 15 16 17 18 19 20 21 22 23 24 25
Seuls les 2 signaux TxD et RxD servent à transmettre les données. Les autres signaux
sont des signaux de contrôle de l’échange de données.
TxD TxD
RxD RxD
RTS RTS
DTE CTS CTS DCE
(ordinateur) DTR DTR (modem)
DSR DSR
DCD DCD
RI RI
GND GND
DTR
RTS DTE
TxD donnée
DSR
DCD DCE
CTS
DTE DTE
microprocesseur
microprocesseur
interface série
interface série
DCE ligne téléphonique DCE
modem modem
Le modem transforme les signaux numériques produits par l’interface série en si-
gnaux analogiques acceptés par la ligne téléphonique et inversement (modulations
numériques FSK, PSK, ...)
• liaison série directe entre deux DTE :
– liaison simple à 3 fils : rebouclage (strapping) des signaux de contrôle :
TxD TxD
RxD RxD
RTS RTS
CTS CTS
DTR DTR
DSR DSR
DCD DCD
RI RI
DTE 1 GND GND DTE 2
Ce câblage ne permet pas le contrôle matériel du flux entre les deux DTE.
– liaison complète : câble Null Modem :
TxD TxD
RxD RxD
RTS RTS
CTS CTS
DTR DTR
DSR DSR
DCD DCD
RI RI
DTE 1 GND GND DTE 2
Ce câblage simule la présence d’un modem (DCE) en croisant les signaux de
contrôle et permet le contrôle matériel du flux.
Brochage du 8250 :
D0 1 40 VCC
D1 2 39 RI
D2 3 38 DCD
D3 4 37 DSR
D4 5 36 CTS
D5 6 8250 35 MR
D6 7 34 OUT1
D7 8 33 DTR
RCLK 9 32 RTS
SIN 10 31 OUT2
SOUT 11 30 INTRPT
CS0 12 29 NC
CS1 13 28 A0
CS2 14 27 A1
BAUDOUT 15 26 A2
XTAL1 16 25 ADS
XTAL2 17 24 CSOUT
DOSTR 18 23 DDIS
DOSTR 19 22 DISTR
GND 20 21 DISTR
Schéma fonctionnel :
interface
microprocesseur UART
D0 - D7
ou D0 - D7 XTAL1 1.8432 MHz
D8 - D15 diviseur ou
d'horloge 2.4576 MHz
RESET MR et XTAL2 ou
générateur 3.072 MHz
RD DISTR de baud
WR DOSTR contrôle RCLK
DISTR et état de BAUDOUT
ligne adaptateur
DOSTR RS232/TTL
M/IO récepteur
validation SIN 1489 RxD
+5 V CS0
décodeur émetteur
A4 - A15 d'adresses CS1 SOUT 1488 TxD
CS2 adaptateur
A0
TTL/RS232 modem
ou
A3 interface modem
BHE A2
A2 A1 RTS 1488 RTS ligne
A1 téléphonique
A0 contrôle DTR 1488 DTR
ADS modem OUT1
OUT2
demande
INTRPT
d'interruption
CTS 1489 CTS
commandes DDIS DSR DSR
état 1489
d'amplificateurs
de bus CSOUT modem DCD 1489 DCD
RI 1489 RI
+5 V VCC GND GND
8250
Accès aux registres du 8250 : le 8250 possède 11 registres. Comme il n’y a que 3 bits
d’adresses (A0, A1 et A2), plusieurs registres doivent se partager la même adresse :
DLAB A2 A1 A0 registre
0 0 0 0 RBR : Receiver Buffer Register, registre de réception
(accessible seulement en lecture)
0 0 0 0 THR : Transmitter Holding Register, registre
d’émission (accessible seulement en écriture)
1 0 0 0 DLL : Divisor Latch LSB, octet de poids faible du di-
viseur d’horloge
1 0 0 1 DLM : Divisor Latch MSB, octet de poids fort du divi-
seur d’horloge
0 0 0 1 IER : Interrupt Enable Register, registre d’autorisation
des interruptions
X 0 1 0 IIR : Interrupt Identification Register, registre d’iden-
tification des interruptions
X 0 1 1 LCR : Line Control Register, registre de contrôle de
ligne
X 1 0 0 MCR : Modem Control Register, registre de contrôle
modem
X 1 0 1 LSR : Line Status Register, registre d’état de la ligne
X 1 1 0 MSR : Modem Status Register, registre d’état du mo-
dem
X 1 1 1 SCR : Scratch Register, registre à usage général
En fonction de l’état de DLAB (Divisor Latch Access Bit = bit de poids fort du registre
LCR), on a accès soit au registre d’émission/réception, soit au diviseur d’horloge, soit au
masque d’interruptions.
Structure des registres :
• Line Control Register (LCR) :
bits 0 et 1 : longueur du mot transmis, bit 1 bit 0
0 0 → 5 bits
0 1 → 6 bits
1 0 → 7 bits
1 1 → 8 bits
bit 2 : nombre de bits de stop, 0 → 1 bit de stop,
1 → 1.5 bits de stop si 5 bits sont
transmis, 2 bits de stop sinon ;
bit 3 : autorisation de parité, 0 → pas de parité,
1 → parité générée et vérifiée ;
bit 4 : sélection de parité, 0 → parité impaire,
1 → parité paire ;
bit 5 : forçage de parité, 0 → parité non forcée
1 → parité fixe ;
fréquence d horloge(quartz)
vitesse (bit/s) =
16 × (DLM, DLL)
Les interruptions
périphérique
microprocesseur interface
Il y a deux méthodes possibles pour recevoir les données provenant des périphériques :
• scrutation périodique (ou polling) : le programme principal contient des ins-
tructions qui lisent cycliquement l’état des ports d’E/S.
Avantage : facilité de programmation.
Inconvénients :
– perte de temps s’il y a de nombreux périphériques à interroger ;
– de nouvelles données ne sont pas toujours présentes ;
– des données peuvent être perdues si elles changent rapidement.
• interruption : lorsqu’une donnée apparaı̂t sur un périphérique, le circuit d’E/S le
signale au microprocesseur pour que celui-ci effectue la lecture de la donnée : c’est
une demande d’interruption (IRQ : Interrupt Request) :
demande
périphérique
d'interruption
microprocesseur interface
Avantage : le microprocesseur effectue une lecture des ports d’E/S seulement lors-
qu’une donnée est disponible, ce qui permet de gagner du temps et d’éviter de perdre
des données.
• port série : demande d’interruption lors de l’arrivée d’un caractère sur la ligne de
transmission.
demande
périphérique
d'interruption
microprocesseur interface
interruption
acceptée
• après l’exécution de l’ISR, les registres sont restaurés à partir de la pile et le micro-
proceseur reprend l’exécution du programme qu’il avait abandonné :
programme
sous-programme
principal
de service
de l'interruption
e
ice d
arrivée de serv uption
err
la demande l'int
d'interruption reto
ur a
prin u prog
cipa ra
l (IR mme
ET )
sous-programme
d'interruption no j
sous-programme
d'interruption no i
mémoire centrale
Lorsque les adresses des sous-programmes d’interruptions sont gérées de cette manière,
on dit que les interruptions sont vectorisées.
Avantage de la vectorisation des interruptions : l’emplacement d’une ISR peut être n’im-
porte où dans la mémoire, il suffit de spécifier le vecteur d’interruption correspondant.
3FFH
type FFH : libre
3FCH
interruptions
libres : disponibles
pour l'utilisateur
103H
type 40H : libre
100H
FCH type 3FH :
FFH réservé par Microsoft interruptions
réservées par
Microsoft dans
un PC : utilisées
par MS-DOS,
83H type 20H : Windows, ...
80H réservé par Microsoft
7FH type 1FH :
7CH réservé par Intel
interruptions
réservées par
Intel
17H type 05H :
14H réservé par Intel
13H type 04H :
10H overflow
0FH type 03H :
0CH instruction int sur 1 octet
0BH type 02H : CS 2 octets
08H NMI IP 2 octets
07H type 01H :
04H pas à pas
03H type 00H :
00H division par zéro
Schéma fonctionnel :
+5 V
D0 - D7 VCC
ou D0 - D7 IR0
D8 - D15 IR1
RD RD IR2
M/IO 8259 entrées de
validation WR WR IR3
demandes
décodeur IR4
A2 - A15 d'adresses d'interruptions
IR5
CS IR6
A0
ou IR7
A1 A0
BHE
CAS0 mise en
INTR INT
CAS1 cascade
INTA INTA
CAS2 de plusieurs
GND SP/EN 8259
Transfert de données :
Général
MOV Déplacement d’un octet ou d’un mot
PUSH Ecriture d’un mot au sommet de la pile
POP Lecture d’un mot au sommet de la pile
XCHG Echange d’octets ou de mots
XLAT ou Traduction d’un octet à l’aide d’une table
XLATB
Entrées/Sorties
IN Lecture d’un port d’E/S
OUT Ecriture d’un port d’E/S
Transfert d’adresses
LEA Chargement d’une adresse effective
LDS Chargement d’un pointeur utilisant DS
LES Chargement d’un pointeur utilisant ES
Transfert des flags
LAHF Transfert des 5 flags bas dans AH
SAHF Transfert de AH dans les 5 flags bas
PUSHF Sauvegarde des flags sur la pile
POPF Restauration des flags à partir de la pile
Instructions arithmétiques :
Addition
ADD Addition d’octets ou de mots
ADC Addition d’octets ou de mots avec retenue
INC Incrémentation de 1 d’un octet ou d’un mot
AAA Ajustement ASCII de l’addition
DAA Ajustement décimal de l’addition
Soustraction
SUB Soustraction d’octets ou de mots
SBB Soustraction d’octets ou de mots avec retenue
DEC Décrémentation de 1 d’un octet ou d’un mot
NEG Complémentation à 2 d’un octet ou d’un mot (change-
ment de signe)
CMP Comparaison d’octets ou de mots
AAS Ajustement ASCII de la soustraction
DAS Ajustement décimal de la soustraction
Multiplication
MUL Multiplication non signée d’octets ou de mots
IMUL Multiplication signée d’octets ou de mots
AAM Ajustement ASCII de la multiplication
Division
DIV Division non signée d’octets ou de mots
IDIV Division signée d’octets ou de mots
AAD Ajustement ASCII de la division
CBW Conversion d’octet en mot
CWD Conversion de mot en double mot
Instructions logiques :
Logique
NOT Complément à 1 d’un octet ou d’un mot
AND ET logique de deux octets ou de deux mots
OR OU logique de deux octets ou de deux mots
XOR OU exclusif logique de deux octets ou de deux mots
TEST Comparaison, à l’aide d’un ET, d’octets ou de mots
Décalages
SHL/SAL Décalage à gauche arithmétique ou logique (octet ou
mot)
SHR Décalage logique à droite d’un octet ou d’un mot
SAR Décalage arithmétique à droite d’un octet ou d’un mot
Rotations
ROL Rotation à gauche d’un octet ou d’un mot)
ROR Rotation à droite d’un octet ou d’un mot
RCL Rotation à gauche incluant CF (octet ou mot)
RCR Rotation à droite incluant CF (octet ou mot)
Préfixes
REP Répétition tant que CX n’est pas nul
REPE ou REPZ Répétition tant qu’il y a égalité et que CX n’est pas nul
REPNE ou Répétition tant qu’il n’y a pas égalité et que CX n’est
REPNZ pas nul
Instructions
MOVS ou Déplacement de blocs d’octets ou de mots
MOVSB/MOVSW
CMPS ou Comparaison de blocs d’octets ou de mots
CMPSB/CMPSW
SCAS ou Exploration d’un bloc d’octets ou de mots
SCASB/SCASW
LODS ou Tranfert d’un octet ou d’un mot dans AL ou AX
LODSB/LODSW
STOS ou Chargement d’un bloc d’octets ou de mots par AL ou
STOSB/STOSW AX
Instructions de branchements :
Branchements inconditionnels
CALL Appel de procédure
RET Retour d’une procédure
JMP Saut inconditionnel
Contrôles d’itérations
LOOP Bouclage tant que CX = 0
LOOPE ou Bouclage tant que CX = 0 et ZF = 1 (égalité)
LOOPZ
LOOPNE ou Bouclage tant que CX = 0 et ZF = 0 (inégalité)
LOOPNZ
JCXZ Saut si CX est nul
Interruptions
INT Interruption logicielle
INTO Interruption si OF = 1 (overflow)
IRET Retour d’une interruption
Sauts conditionnels
JA ou JNBE (1) Saut si « supérieur » (si CF + ZF = 0)
JAE ou JNB (1) Saut si « supérieur ou égal » (si CF = 0)
JB ou JNAE (1) Saut si « inférieur » (si CF = 1)
JBE ou JNA (1) Saut si « inférieur ou égal » (si CF + ZF = 1)
JC Saut en cas de retenue (si CF = 1)
JE ou JZ Saut si « égal » ou « nul » (si ZF = 1)
JG ou JNLE (2) Saut si « plus grand » (si (SF ⊕ OF) + ZF = 0)
JGE ou JNL (2) Saut si « plus grand ou égal » (si SF ⊕ OF = 0)
JL ou JNGE (2) Saut si « plus petit » (si SF ⊕ OF = 1)
JLE ou JNG (2) Saut si « plus petit ou égal » (si (SF ⊕ OF) + ZF = 1)
JNC Saut si « pas de retenue » (si CF = 0)
JNE ou JNZ Saut si « non égal » ou « non nul » (si (ZF = 0)
JNO Saut si « pas de dépassement » (si OF = 0)
JNP ou JPO Saut si « parité impaire » (si PF = 0)
JNS Saut si « signe positif » (si SF = 0)
JO Saut si « dépassement » (si OF = 1)
JP ou JPE Saut si « parité paire » (si PF = 1)
JS Saut si « signe négatif » (si SF = 1)
(1)
concerne des nombres non signés.
(2)
concerne des nombres signés.