Microprocesseur , Assembleur

publicité
Microprocesseur , Assembleur
et Interfaces
Plan
Introduction :
1) Architecture d’un système à microprocesseur
2) Fonctionnement des liaisons par bus
3) L’assembleur
Chapitre 1 : Le microprocesseur 8086
1) Organisation externe
1.1) Modes de fonctionnement (minimal et maximal)
1.2) Signaux
1.3) Fonctionnement
2) Organisation interne
2.1)Unité d’interface bus et unité d’exécution
2.2) Registres internes
2.3) Organisation de la mémoire
3)
Assembleur 8086
3.1) Modes d’adressages
3.2) Jeu d’instructions
4) Interruptions du 8086
4.1) Interruptions logicielles
4.2) Interruptions matérielles
5) Structure d’un programme assembleur 8086/8088
5.1) Syntaxe des instructions
5.2) Les procédures
5.3) Déclaration des constantes numériques, variables et chaînes de
caractères
5.4) Déclaration des segments
5.5) Directive Assume
5.6) Macro-instructions
Chapitre 2 : Interface parallèle programmable 8255
1) Structure interne et signaux
2) Programmation du 8255
Chapitre 3 : Contrôleur d’interruptions programmable
1) Généralités sur la gestion des interruptions
2) Architecture et programmation du circuit 8259 de Intel
Chapitre 4 : Interface série programmable
1) Généralités sur la transmission série
2) Architecture et programmation du 8250
3) L’assembleur
La programmation en assembleur est utilisée par des spécialistes, généralement dans trois
buts :
-
-
efficacité du programme résultant : code beaucoup plus compact et s’exécutant beaucoup
plus vite que du code en langage de haut niveau. Or la rapidité est un facteur critique
pour un grand nombre d’applications telles que, pilotes de périphériques, cartes à puces,
téléphones portables, routines BIOS ou les boucles les plus internes d’une application
optimisation : pour tirer parti de l’architecture de la machine (accès à toutes les ressources
de la machine)
diagnostic d’erreurs (software et hardware) : on est obligé, pour certaines erreurs subtiles,
d’examiner le contenu de la mémoire et donc de reconstruire pas à pas l’évolution du
programme et ses effets sur le contenu des différents registres.
L’assembleur présente d’autres avantages, parmi lesquels nous citerons :
-
possibilité d’assigner des noms à des positions mémoire ou à des dispositifs d’E/S
indiquer au programme chargeur où loger en mémoire le programme et les données
réservation de zones en mémoire (pile)
la plupart des applications des P impliquent des échanges d’informations, données et
commandes avec des dispositifs périphériques, en entrée et en sortie. Souvent, les
informations de commande et d’états se traduiront par quelques digits binaires dont la
signification est étroitement liée au matériel.
Toutefois, l’assembleur présente deux inconvénients qui sont :
-
la connaissance détaillée des particularités du P que l’on emploie
langage non portable : chaque P possède son propre assembleur qui reflète son
architecture
Ainsi, généralement, les applications pour langage assembleur auront comme
caractéristiques :
-
petits à moyens programmes
commande en temps réel
beaucoup d’E/S et peu de calcul
traitement limité de données
Chapitre 1
Le microprocesseur 8086
1) Organisation externe
1.1) Modes de fonctionnement (voir figure 1):
a) Mode minimal (MN/MX = 1):
Dans ce mode, c’est le 8086 qui génère lui-même ses bus et les restrictions sont apportées par
une incapacité à utiliser les co-processeurs ou processeurs associés et à être employé en
multitraitement. Aussi, le 8086 ne peut adresser que 64Ko.
b) Mode maximal (MN/MX = 0):
Dans ce mode, le 8086 permet 2 caractéristiques supplémentaires :
. Bus local : employé pour placer des extensions au 8086 : processeur
d’E/S(8089), processeur mathématique (8087), processeur de système d’exploitation. Le 8086
et les co-processeurs se partagent l’accès aux bus communs.
. Bus système (Multibus): permettant le multiprocessing : ensemble
d’unités de traitement pouvant effectuer en parallèle diverses tâches et toutes étant connectées
sur un même bus système qui permet à chaque carte d’accéder soit à des ressources
communes (mémoire), soit de véhiculer des demandes d’interruptions. Chaque unité de
traitement doit alors posséder un contrôleur de bus (8288) pour élaborer les signaux de
contrôle multibus et un circuit de gestion du bus système (8289) pour gérer les accés au
multibus selon les priorités.
1.2) Signaux du 8086:
a) Signaux communs aux 2 modes:
GND : masse
Vcc : +5 volts
CLK :entrée horloge générée par le 8284
INTR :entrée de demande d’interruption(masquable)
NMI : entrée de demande d’interruption non masquable
Reset : entrée d’initialisation du 8086
Ready : entrée utilisée pour synchroniser le transfert entre le 8086 et un périphérique lent
Test : entrée utilisée pour synchroniser le 8086 sur un événement extérieur à la rencontre de
l’instruction WAIT
RD : sortie 3 états indiquant que le 8086 effectue une lecture
AD0 – AD15 : bus 3 états, multiplexé. Il véhicule la partie basse de l’adresse ou la donnée.
BHE/S7 : sortie 3 états. BHE valide l’octet supérieur du bus donnée (D8 – D15).
S7 : à l’état bas, c’est une reconnaissance d’interruption
MN/MX : 1 :mode minimal ; 0 : mode maximal
b) Signaux utilisés en mode minimal:
M/IO : sortie 3 états ; 1 : accès mémoire 0 : E/S
WR : sortie 3 états ; signal d’écriture
DEN : sortie 3 états ; autorise le transfert de données
ALE : sortie de validation du bus d’adresses
Hold : entrée de demande de bus
HLDA : sortie de cession du bus
INTA : accusé de réception d’une interruption
DT/R : sortie 3 états ; pour contrôler le sens de transfert des données
c) Signaux utilisés en mode maximal
S0 S1 S2 : sorties 3 états indiquant le cycle en cours :
S0 S1 S2
Type de transfert
0
0
0
0
1
1
1
1
prise en compte d’une interruption
sélection du mode d’entrée d’une donnée
sélection du mode de sortie d’une donnée
halt
recherche d’une instruction
sélection du mode de lecture de la mémoire
sélection du mode d’écriture de la mémoire
état de repos
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
LOCK : sortie 3 états interdisant aux autres processeurs l’usage du bus local. Son état actif est
commandé par le préfixe LOCK en tête d’une instruction
A16 (S3 ) - A19(S6 ) :bus bidirectionnel,3 états, multiplexé.
A16 - A19 :partie haute de l’adresse
S3 S4
Segment
S6 : = 0
S5 : = état du flag I
S3 et S4 : code représentant le registre de segment utilisé
0
0
1
1
ES
CS
SS
DS
0
1
0
1
QS0 QS1 : sorties indiquant l’opération effectuée sur la file d’attente
QS1QS0
RQ/GT0 RQ/GT1 :
0
0
0
1
1
1
0
1
opération
pas d’opération
recherche dans la file du premier octet d’une
instruction
effacement de la file
recherche de l’octet suivant
RQ : utilisé par un co-processeur pour une demande de bus local
GT : réponse du 8086 qui donne le bus en déconnectant l’UIB
RQ/GT0 est plus prioritaire que RQ/GT1
GND
AD14
AD13
AD12
AD11
AD10
AD9
AD8
AD7
AD6
AD5
AD4
AD3
AD2
AD1
AD0
NMI
INTR
CLK
GND
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
6
7
8
9
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
Vcc
AD15
A16/S3
A17/S4
A18/S5
A19/S6
BHE/S7
MN/MX
RD
RQ/GT0 / Hold
RQ/GT1 / Hlda
LOCK / WR
S2
/ M/IO
S1
/DT/R
S0
/ DEN
QS0
/ALE
QS1 /INTA
TEST
Ready
Reset
b)L’unité d’exécution (UE):
Elle se compose de l’UAL, les registres généraux, les registres d’index, les registres pointeurs,
un registre d’état et le décodeur d’instructions.
L’UE lit les codes opération dans la pile FIFO (file d’attente) alimentée par l’UIB.
2.2) Registres internes
a) Registres généraux :
Il y a 4 registres généraux de 16 bits pouvant être séparés en 8 registres de 8 bits :
AX
AH
AL
BX
BH
CH
BL
CL
DH
DL
CX
DX
Mis à part les opérations arithmétiques et logiques classiques, ils ont des fonctions précises :
AX : multiplication, division, entrée-sortie, traitement des chaînes.
BX : registre de base associé à DS
CX : compteur pour les boucles et opérations répétitives
CL : comptage des opération de décalage et rotation
DX : registre d’adresse d’E/S et extention à AX ( X et / sur 32 bits)
b) Registres d’index et pointeurs
Registres d’index :
2 registres SI et DI de 16 bits qui contiennent les déplacements des données vis à vis des
registres de segments ES et DS.
SI : source index
DI : destination index
Registres pointeurs :
2 registres SP et BP de 16 bits qui servent à la génération des adresses de données en
particulier en pile. Ils sont associés à SS.
c) Registres de segments
L’espace mémoire de 1 Mo est découpé en tranches de 64Ko, appelés segments référencés par
rapport aux registres de segments suivants :
CS : code segment
SS: stack segment
DS: data segment
ES: extra segment
CS : sert à l’adressage des octets de programme
SS: gère la pile
DS: sert à l’adressage des données
ES: complète DS
d) Compteur ordinal
Registre IP de 16 bits qui contient le déplacement de l’instruction courante vis à vis de CS.
IP est mis à jour par l’UIB.
e) Registre d’état
Registre de 16 bits contenant 9 indicateurs dont 3 sont des bits de contrôle et 6 des bits d’état :
X
X XX O D I T
S Z X
A X P X C
bits de contrôle :
T : trap, pour l’exécution pas à pas
I = 1 autorisation des interruptions externes masquables
= 0 interdiction
D : définit le sens de traitement des chaînes de caractères
bits d’état :
C : carry
P : parité (celle du nb de bits égaux à 1)
S : signe
A : retenue sur quartet LSB de AL
Z : zéro
O : overflow
2.3) Organisation de la mémoire
a) Segmentation et calcul de l’adresse physique :
L’espace adressable étant de 1MO, une adresse doit être sur 20 bits. Ne disposant que de
registre de 16 bits, on utilise donc 2 registres de 16 bits pour adresser 1Mo.
Le premier registre de 16 bits est complété par 4 zéro en LSB, ce qui donne une adresse sur
20 bits. Ce registre est appelé registre de segment : il contient l’adresse du début du segment
associé.
Le deuxième registre de 16 bits contient l’offset (adresse logique), que l’on ajoute à l’adresse
précédente sur 20 bits pour obtenir l’adresse physique.
adresse physique = 16 x (registre de segment ) + offset
L’espace adressable de 1Mo est dit segmenté ( 16 segments de 64Ko). Les segments peuvent
être disjoints ou se recouvrent plus ou moins.
C’est l’UIB qui calcule l’adresse physique à chaque accès à la mémoire.
b) Adresses logiques :
Adresse logique
Segment
IP
SP
BP
Dep
BX
SI
DI
BP+dep
BX+dep
SI+dep
DI+dep
BP+SI
BP+DI
BX+SI
BX+DI
BP+SI +dep
BP+DI +dep
BX+SI +dep
BX+DI+dep
CS
SS
SS
DS
DS
DS
DS
SS
DS
DS
DS
SS
SS
DS
DS
SS
SS
DS
DS
3) Assembleur 8086
3.1 Modes d’adressage :
a) Adressage implicite :
Expl : STC
CM : FE
b) Adressage immédiat :
L’opérande est la donnée définie dans l’instruction
Expl : CMP AL, 03
CMP AX, 1003
CM : 3C 03
CM :3D 0310
c) Adressage registre (R) :
Le registre concerné contient l’opérande
Expl : MOV AX, BX
CMP CL,BL
Rq : les 2 registres doivent avoir la même taille.
d) Adressage direct (DA) :
Le déplacement (8 ou 16 bits) de l’opérande vis à vis du début du segment concerné est
spécifié dans l’instruction
Expl : MOV AL, [0023] ou MOV AL, [23]
MOV AX, [0023] ou MOV AX, [23]
e) Adressage indirect par registre (IR, BA, X, BXD, BX) :
type d’adressage
AE
Segment
Exemples
BP
BX
SI
DI
SS
DS
DS
DS ou ES
indirect (IR)
MOV AL, [BP]
MOV AL, [BX]
MOV AL, [SI]
MOV AL, [DI]
BP+ dep
BX+dep
SS
DS
indirect (BA)
avec déplacement
MOV AL, [BP] [1000]
MOV [BX] [2000], AL
SI +dep
DI +dep
DS
DS
indexé(X)
MOV AL, [SI] [1000]
MOV [DI] [1000], AL
BP+ SI
BP+ DI
BX+ SI
BX+ DI
SS
SS
DS
DS
indirect
indexé(BX)
MOV AL, [BP] [SI]
MOV AL, [BP] [DI]
MOV AL, [BX] [SI]
MOV AL, [BX] [DI]
BP+ SI+dep
BP+ DI+dep
BX+ SI+dep
BX+ DI+dep
SS
SS
DS
DS
indirect (BXD)
indexé
avec déplacement
MOV AL, [BP] [SI] [1000]
Remarque :
On peut imposer aux pointeurs le segment désiré grâce au préfixe SEG :
Expl :
SEG ES
MOV AL, [BX]
ou
ES :
MOV AL, [BX]
AL
ou
MOV AL, ES : [BX]
( ES : (BX) )
3.2 Logiciel : (voir tableau logiciel)
4) Interruptions du 8086
Le 8086 peut recevoir 256 interruptions différentes. A chaque interruption est attribué un
numéro 0 à 255 appelé type d’interruption. A chaque type correspond un pointeur de 32 bits
( CS et IP ) donnant l’adresse de la procédure à exécuter.
type d’interruptions
0
1
2
3
adresses
fonctions
00 à 03
04 à 07
08 à 0B
0C à 0F
division par 0
pas à pas
NMI
INT3
La prise en compte d’une interruption provoque la sauvegarde dans la pile du registre d’état et
de l’adresse de retour (CS et IP) en décrémentant le contenu de SP et le branchement à un SPI
dont l’adresse de début est indiquée par la table d’interruptions. Si n est le type d’une
interruption, l’adresse de début du SPI est rangée en mémoire à partir de l’adresse 4 x n
( dans l’ordre : IP bas, IP haut, CS bas puis CS haut ).
Remarque : le SPI doit se terminer par l’instruction IRET.
4.1) Interruptions logicielles :
Elles sont provoquées par l’instruction INTn.
a) Interruptions automatiques:
Type 0 : division par 0
Type 1 : pas à pas
Type 4 : overflow
b) Interruptions logicielles :
Type 3 : arrêt du 8086 et affichage sur écran du contenu des registres
Type n : INT n
4.2) Interruptions matérielles :
Elles parviennent au CPU par les broches NMI et INTR
a) Interruption non masquable NMI :
Elle est sensible au front montant et provoque un déroutement de type 2. Elle est plus
prioritaire que INTR et intervient lors de perte d’alimentation, de détection d’erreur mémoire
ou d’erreur de parité sur le bus.
b) Interruption masquable INTR :
Elle est sensible à un niveau haut.
Pour NMI et INTR, le type de l’interruption est généré par le contrôleur d’interruption..
5) Structure d’un programme assembleur 8086
5.1) Syntaxe des instructions :
Les instructions sont codées sur 4 champs :
Etiquette :
code opération
opérandes ou adresses
;
commentaire
- champ 1 : l’étiquette est optionnelle et elle est constituée de 1 à 31 caractères au maximum.
Elle doit être suivie de 2 points si elle précède une instruction sinon pas de 2 points si elle
précède une pseudo-instruction (DB, DW, PROC, ENDP, ENDS, SEGMENT, ASSUME,
END). L’étiquette commence par une lettre ou par l’un des 3 signes : ? @ -
5.2) Procédures :
Les procédures sont le moyen d’implanter les sous-programmes. Un programme peut être
écrit sous forme de procédure.
A cause de la segmentation, il est nécessaire de distinguer entre les procédures locales se
trouvant dans le même segment que le programme appelant et les procédures éloignées où
l’on doit changer de segment.
Si le sous-programme est dans le même segment que le programme appelant, il est dit NEAR,
sinon il est FAR.
Structure d’une procédure :
Nom procédure
PROC
Nom procédure
RET
ENDP
FAR/NEAR
Appel d’une procédure :
CALL Nom procédure
Exemple :
Code1
Segment
Prince Proc Far
Call Rech ; appel procédure proche
Call Ident ; appel procédure éloignée
Ret
Prince Endp
Rech
; fin de procédure
Proc Near
Ret
Rech Endp
Code1
Ends
Code2
Segment
Ident Proc Far
Ret
Ident EndP
Code2
Ends
End Prince ; fin du programme
5.3) Constantes numériques, chaîne de caractères, variables :
-
a) Constantes numériques :
binaire : 0110101B
décimal : 65 ou 65D
hexadécimal : 72H, 10F2H, 0F4H
octal : 34O ou 34Q
b)Chaînes de caractères :
Définies en apostrophes, chaque caractère sera traduit en code ascii(1 octet par caractère).
‘A’
est équivalent à 41H
‘AG’
4167H
‘[‘
5BH
c) Variables
Différents types :
DB : byte, la variable est un octet
DW : mot ( 2 octets)
DD : 2 mots
DQ : 4 mots
DT : 10 octets
Remarque : après DB, on peut écrire jusqu’à 255 caractères
Exemples :
Var
DB 15D
Var
DB ?
Var
DB ‘A’
Var
DB 15D, 20H, 11110001B
Var
DB 10H DUP ( 0 )
5.4) Segmentation et variables :
A l’intérieur d’un segment, les variables sont caractérisées par :
- le segment dont elles dépendent
- leur adresse à l’intérieur du segment
Exemple1 :
TABLE
Segment
T1 DB ‘0123’
T2
TABLE
DB ‘ABC’
Ends
Seg T1= valeur du segment TABLE
Offset de T1=0
Offset de T2= 4
Exemple2 :
TABLE
Segment AT 80H
ORG 8FH
T1 DB ‘0123’
T2
TABLE
DB ‘ABC’
Ends
Seg T1= valeur du segment TABLE= 80H
Offset de T1= 8FH
Offset de T2 = 93H
5.5) Directive ASSUME
Nous avons donné des noms aux segments afin de clarifier la lecture du programme. Il faut
maintenant, pour la génération des codes, préciser quels sont les registres de segments. Cette
opération est réservée à la directive assume.
Exemple :
PILE
Segment STACK
DB 255 DUP (0)
PILE
Ends
TABLE
Segment
T1 DB ‘0123’
T2
DB ‘ABC’
TABLE
Ends
Code1
Segment
Assume CS : Code1, DS : TABLE, SS :PILE
Prince Proc Far
Mov AX, TABLE
Mov DS,AX
Call Rech
Ret
Prince Endp
Rech
Proc Near
Ret
Rech Endp
Code1
Ends
End Prince
5.6) MACRO :
Une macro instruction est un ensemble d’instructions regroupées sous un nom donné
Syntaxe :
nom macro
MACRO
ENDM
Utilisation :
-
on l’appelle par son nom
-
elle doit se situer au début du programme principal
-
une macro peut en appeler une autre
Chapitre 2
Interface parallèle programmable 8255
1) Structure interne et signaux:
Données
A0
A1
A0
A1
RD
RW
CS
Reset
8086
Adresses
A
8255
B
Périphérique
C
commande
8086
3 registres de 8 bits appelé ports : A, B, C
1 registre de commande de 8 bits
RD : lecture
WR : écriture
CS : sélection du 8255
Reset : initialisation
A0 et A1 : sélection d’un registre
A1 A0
0 0
0 1
1 0
1 1
Registre
port A
port B
port C
registre de commande
2) Fonctionnement en mode 0 :
-
Programmation séparée de chacun des 4 canaux (port A, port B, port C LSB,
port C MSB)
Le sens de transfert doit être le même à l’intérieur de chaque canal
Remarque : pour positionner un bit du port C (bit en sortie) à la valeur 0 ou 1, on envoie
dans le registre de commande le mot :
0000
Valeur du bit
Code du bit à positionner :
PC0 : 000
PC1 : 001
PC7 : 111
Mot de commande :
1
D4 : port A
D3 : port Cmsb
D1 : port B
D0 : port Clsb
0
0
D4 D3
0 D1
0 : sortie
1 : entrée
D0
Chapitre 3 :
Le contrôleur d’interruption 8259
Le 8259 traite 8 interruptions provenant de périphériques différents. A chaque interruption est
associée une entrée d’interruption permettant de classer les périphériques de niveau 0 à 7 par
priorité décroissante.
Lorsque 2 interruptions se produisent simultanément, celle de plus haute priorité est prise en
compte et l’autre est mise en attente jusqu’à l’achèvement de la précédente. De même que le
8086 dispose d’indicateurs autorisant ou interdisant les interruptions à l’aide des instructions
STI et CLI, il est possible d’activer ou de désactiver les interruptions de périphériques à l’aide
du registre de masque IMR situé à l’adresse du port 21H. Le bit n du registre est positionné à
1 si on veut masquer l’interruption n.
Le 8259 permet également qu’une interruption interrompt le processeur lorsque celui-ci traite
une autre interruption. Deux registres sont alors utilisés : IRR (Interrupt Request Register) et
ISR (Interrupt Service Register) ou le 8259 mémorise l’interruption en attente et celle traitée.
L’achèvement de la prise en compte d’une interruption est signalée par le programmeur par
une commande de fin d’interruption, ce qui permet le traitement éventuel d’une interruption
de niveau inférieur en attente.
La fin d’interruption non spécifique est la plus utilisée. Elle se fait en ajoutant à la fin de
chaque routine d’interruption, les instructions :
MOV AL, 20
OUT 20, AL
Remarque : Les interruptions sont vectorisées au niveau du 8259
Entrée d’interruption
Type
IR0
IR1
IR2
08
09
0A
IR7
0F
Structure du programme principal et du SPI :
PP :
Gestion de l’interruption (autorisation de l’interruption au niveau
Du 8259 et 8086)
Suite du PP
SPI :
Traitement de l’interruption
Fin d’interruption non spécifique
STI
IRET
Exemple : IR2 (Type 0A)
PP :
IN AL, 21
AND AL, FB
OUT 21, AL
STI
Gestion de l’interruption
Suite du PP
SPI :
1C02 : 0400
Traitement de l’interruption
MOV AL, 20
OUT 20, AL
STI
IRET
A x 4= 28h
00028
00029
0002A
0002B
00
04
02
1C
Fin d’interruption non spécifique
Téléchargement