You are on page 1of 46

CHAPITRE 4 .

Processeurs et jeux dinstructions


Processeurs et jeux dinstructions

1









4 4 C CH HA AP PI IT TR RE E 4 4





P Pr ro oc ce es ss se eu ur rs s
e et t
J Je eu ux x d d I In ns st tr ru uc ct ti io on ns s


D De e l l i in ns st t r r u uc ct t i io on n
A Au u p pr r o og gr r a am mm me e



Pile ou Procdure ?

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

2




Lobjectif de ce chapitre est de raliser le passage du matriel au logiciel,
permettant ainsi de faire voluer le petit automate quest le processeur vers un
ordinateur dusage gnral. Ce passage sappuie sur le modle de
programmation du processeur qui en est la vue offerte au programmeur : les
registres, le jeu dinstructions et le modle mmoire.
Le modle de programmation est lossature pour la dfinition du premier
niveau de langage de programmation dun processeur, c'est--dire le langage
assembleur.
Nous avons montr, dans les chapitres prcdents, comment il est possible de
construire un processeur partir de briques lmentaires, voyons-en
maintenant le fonctionnement avant daborder son utilisation au travers du
logiciel et en premier lieu avec le langage assembleur. Quel processeur choisir
pour en expliquer les principes de fonctionnement ?
Notre premier exemple est le Z80 (de Zilog), processeur 8 bits, compatible
ascendant du 8080 dIntel. Mme si ce processeur est de conception ancienne,
il est toutefois toujours en service et il se prte bien un premier exercice
pdagogique pour dcrire lexcution matrielle dune instruction.
La deuxime partie du chapitre est une introduction au jeu dinstructions dun
processeur et un langage de programmation assembleur. Le processeur
680x0 de Motorola est pris comme exemple pour son bon compromis entre
simplicit et lisibilit. La programmation fait rapidement apparatre le besoin
de structuration et de rutilisation que tous les langages modernes de haut
niveau intgrent. Ce besoin est concrtis par la notion de procdure.
La dernire partie est ddie la procdure et en particulier la relation
entre une procdure (ou fonction) dans un langage de haut niveau (ici le
langage C) et son implmentation au niveau dun langage assembleur. Seront
alors illustres toutes les implications de lutilisation dune procdure aussi
bien au niveau de la gestion dune pile que des techniques de passages de
paramtres. Les illustrations porteront sur des processeurs darchitectures
bien diffrentes, aussi bien CISC (Complex Instruction Set Computer), comme
le 680x0 et le Pentium, que RISC (Reduced Instruction Set Computer) comme
le MIPS, le SPARC et le PowerPc.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

3
4.1 Le modle de programmation dun processeur.
Le but fix est dabandonner progressivement les aspects physiques (architecture
interne, circuits logiques) dun processeur au profit des caractristiques dune
machine plus abstraite destine supporter lexcution des programmes de
lutilisateur. Cet utilisateur lancera une application traitement de texte, courrier
lectronique, navigateur, en slectionnant la bonne icne sur une interface
graphique. Lapplication rsout le problme rel de lutilisateur, par exemple
rcuprer son courrier, en chargeant et en faisant excuter un programme crit
gnralement dans un langage dit volu ou de haut niveau. Ainsi, Java, Fortran, C,
C++, ou autres, sont des langages conus pour faire abstraction du processeur
physique de la machine qui fait tourner lapplication. Le programmeur crit des
programmes avec des instructions virtuelles (celles du langage et pas celles du
processeur) et sur des variables abstraites au lieu des registres du processeur ou des
cases mmoires. Mais en fin de compte, toute application, tout programme de haut
niveau est traduit en programme en langage assembleur qui est excut en
sappuyant directement sur les caractristiques matrielles du processeur : le jeu
dinstruction et les registres. Le langage assembleur est un langage de bas niveau,
c'est--dire le plus proche des instructions du processeur. Dans la suite, quand nous
parlerons de programmeur, nous nous le mettrons dans le contexte dune
programmation en langage assembleur.
Le modle de programmation est linterface matriel/ logiciel qui permet cette
transition. Aussi appel I nstruction Set Architecture (I SA), il repose sur trois
lments principaux :
les registres : le processeur a besoin de mmoires internes pour stocker les
donnes sur lesquelles il va travailler. Ces mmoire internes ou registres sont les
lments que le programmeur doit connatre et manipuler pour programmer
lexcution dun algorithme. TOUTES les donnes dun programme passeront
par les quelques registres du processeur. Les registres peuvent tre de deux
natures : gnraux et ddis. Le Z80 a des registres ddis, c'est--dire rserv
des fonctions spcifiques, tandis que le MIPS possde des registres gnraux
banaliss. Le 680x0 est dans une situation intermdiaire : il a des registres
gnraux de donnes et des registres gnraux dadresses.
le jeu dinstructions : le processeur est accessible la programmation par
lintermdiaire de son jeu dinstructions c'est--dire lensemble des instructions
quil est capable dexcuter. Celles-ci correspondent en gnral des oprations
vraiment lmentaires comme nous avons pu en prsenter lors de la description
dune unit arithmtique et logique. Dvelopper un programme consiste
traduire un algorithme avec un langage de programmation (ici lassembleur)
dont les verbes sont pris dans le jeu dinstruction et dont les substantifs sont les
variables ou constantes mapps en mmoire ou dans les registres. Une
instruction comporte souvent deux parties : le code opratoire qui dfinit le type
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

4
dopration raliser et les paramtres (optionnels) qui dfinissent les
oprandes sur lesquels porte lopration.
le modle mmoire . Il sagit ici de la relation entre le contenu dun registre et
le contenu en mmoire une adresse donne. Ladressage de la mmoire se fait
en gnral sur la base de loctet. Dans le cas dun processeur 8 bits, les registres
de donnes sont de 8 bits. Pour faire un chargement de la mmoire vers un de
ces registres, il suffit de donner ladresse de loctet en mmoire. Par contre si
lon travaille sur une donnes occupant plus dun octet en mmoire, par
exemple un entier cod sur 16 bits ou une adresse, la variable occupe deux
octets en mmoire centrale et deux possibilits se prsentent. Dans lune,
ladresse en mmoire est ladresse de loctet de poids faible (convention little
endian comme le Z80 ou les processeurs x86 dIntel), dans lautre, ladresse en
mmoire est ladresse de loctet de poids fort (convention big endian, comme
par exemple le processeur 680x0).
Avant daborder les dtails dun modle de programmation, il est utile de dcrire,
dans un cas simple, le fonctionnement dun processeur. Le processeur est vu
comme un automate excutant un programme sous la forme dun enchanement
dinstructions. Chaque instruction est elle-mme dcompose en phases plus
lmentaires impliquant le cas chant des cycles mmoires. Prenons lexemple du
Z80.

4.2 Le fonctionnement du Z80.
La figure 4-1 donne larchitecture gnrale et simplifie du Z80 : il y a des
registres organiss autour du bus interne de donnes et du bus interne dadresses,
deux units arithmtiques et logiques (une pour les oprations sur les donnes,
lautre pour du calcul dadresse), un dcodeur dinstruction et un squenceur
(appel aussi unit de contrle ou unit de commande).
+1
PC
SP
IY
IX
B C
D E
H L
A
tmp A tmp
F
IR
+ -
A U
L
dcodeur
s

q
u
e
n
c
e
u
r
b
u
f
f
e
r
+1
PC
SP
IY
IX
B C
D E
H L
A
tmp A tmp
F
IR
+ -
A U
L
dcodeur
s

q
u
e
n
c
e
u
r
b
u
f
f
e
r
+1
PC
SP
IY
IX
B C
D E
H L
A
tmp A tmp
A
tmp A tmp
FF
IR
+ -
A U
L
dcodeur
s

q
u
e
n
c
e
u
r
b
u
f
f
e
r
Figure 41 Architecture gnrale du processeur Z80.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

5
4.2.1 Droulement dune instruction.
Le bus de donnes a une largeur de 8 bits et est bidirectionnel : cest le mme
chemin qui est utilis pour les transferts en lecture ou en criture. Les deux
oprations ne seffectuant jamais en mme temps, il ny a pas de conflits sur le bus.
Le bus dadresse a une largeur de 16 bits ce qui confre au processeur une capacit
maximale dadressage de mmoire centrale de 64 Ko (65536 octets, 1K = 2
10
=
1024). Le bus dadresse est unidirectionnel : seul le processeur peut dposer une
adresse sur ce bus et le tampon (buffer) en sortie de processeur permet de maintenir
une adresse vers lextrieur tout en dterminant une nouvelle adresse en interne.
Larchitecture prsente est simplifie, c'est--dire rduite aux lments minimaux
ncessaires la comprhension du fonctionnement du processeur. Cela concerne en
particulier les registres. Le Z80 possde 8 registres 8 bits : A, F, B, C, D, E, H et L.
Le registre A (Accumulateur) est le registre privilgi pour les oprations
arithmtiques et logiques : toutes les oprations se font par accumulation sur ce
registres. F est le registre des indicateurs doprations (flags ou drapeaux)
permettant de mmoriser de manire synthtique (1 seul bit) un rsultat positif,
ngatif, nul, dbordement, et ainsi servir de condition pour les instructions de
saut conditionnel. Lensemble de ces registres est complt par des registres dits
alterns A L permettant de permuter trs rapidement, si ncessaire, les alterns
avec les primaires A L.
Les registres (B, C), (D, E) et (H, L) peuvent tre apparis pour raliser quelques
oprations (addition, soustraction, incrmentation, dcrmentation) sur les entiers
de 16 bits, ils sont alors dnomms BC, DE et HL. La paire HL joue un rle
particulier comme pointeur (adresse) de donnes en mmoire centrale.
Il y a quatre registres strictement 16 bits et qui servent exclusivement ladressage.
IX et IY sont des registres dindex qui correspondent aux indices de donnes
structures (tableaux) dans les langages de haut niveau. Ils servent de dplacement
La naissance du Z80 est troitement lie celle de son an, le 8080 dIntel.
Federico Faggin, aprs son doctorat de physique Padoue en Italie, est
embauch en 1968 par Fairchild pour dvelopper les premiers circuits en
technologie MOS. Il participe ensuite, avec Tedd Hoff chez Intel, la
conception du 4004, et devient larchitecte du 8080, sorti en 1974.
En 1975, il fonde, avec Masatoshi Shima (ancien de Busicom, la socit japonaise
ayant command les circuits lorigine du 4004), la socit Zilog avec lide de
raliser une version amliore du 8080, ce quil navait pu faire chez Intel. Le Z80 doit
tre compatible ascendant en excutant toutes les 78 instructions du 8080 de la mme
manire que ce dernier. Lamlioration portera sur un jeu dinstructions plus tendu
(120 instructions de plus), plus de regis tres, une gestion intgre de la mmoire
(rafrachissement dynamique), une amorce de pipeline et fonctionne une frquence
de 2,5 MHz. Il est mis sur le march en juillet 1976 : une vraie russite technique et
commerciale, il est toujours sur le march et cote ... 1 .
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

6
(offset) par rapport un pointeur (HL) et en acclrent laccs. SP, Stack Pointer,
est le pointeur de pile particulirement utile pour la gestion des appels de
procdures. SP permet, avec des deux instructions spcifiques Push et Pop,
empiler et dpiler, de grer une zone de mmoire centrale comme pile, c'est--dire
une file dattente de type LIFO, (Last In-First Out, dernier arriv premier servi). Le
registre le plus important, pour lexplication du fonctionnement du processeur,
donc le droulement dun programme quel quil soit, est PC (Program Counter), le
compteur de programme.
4.2.1.1 Le droulement de lexcution dune instruction.
Le Z80 suit larchitecture Von Neumann : le programme (code) et les donnes sur
lequel ce programme travaille se trouvent dans la mme mmoire et sont donc
accessibles via le mme chemin, le bus.
Programmes et donnes se trouvent donc initialement en mmoire centrale.
Physiquement, une instruction est une suite doctets (comprenant le code opratoire
et les ventuels oprandes) qui pour tre excute par le processeur doit tre
repre par une adresse en mmoire. Avant lexcution dune linstruction, le
processeur doit donc connatre cette adresse : cest le registre PC qui la contient.
Dun point de vue automate, le contenu du registre PC dfinit les conditions
initiales pour lordonnancement de lexcution de linstruction par le processeur.
Pour le Z80, le droulement dune instruction se fait en deux tapes cadences par
lhorloge du processeur.
La premire tape appele fetch consiste aller chercher en mmoire
centrale le code opratoire (1 octet) de linstruction ladresse spcifie par le
registre PC, puis le stocker dans un registre particulier appel registre
dinstruction. Nous navons pas prsent ce registre avec les autres, car il ne fait
pas partie du modle de programmation du Z80 dans la mesure o il nest pas
accessible au programmeur. Pour toutes les instructions, la phase fetch se droule
sur trois coups dhorloge et correspond un cycle de lecture en mmoire (cf.
chapitre 3, section 3.6.2.2).
La seconde tape est celle de lexcution qui scoule sur un nombre variable de
coups dhorloge en fonction principalement des oprandes lire ou crire en
mmoire. Linstruction est dcode, puis opre.
Pour illustrer le droulement dune instruction, nous prenons lexemple de
linstruction ADD A, [HL] dont lobjectif est dajouter au contenu du registre A
(qui vaut b5h) une variable en mmoire ladresse 2323h dont la valeur est 08h.
Linstruction elle-mme est ladresse 5000h.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

7
La notation de linstruction est une notation oriente langage de programmation,
c'est--dire avec une syntaxe de linstruction base sur des mnmoniques.
Linstruction a deux paramtres (A et HL) de description des oprandes, mais
comme il sagit de registres, il faut peu de bits pour les coder et ceux-ci peuvent
tre intgrs directement au code opratoire. Linstruction tient de la sorte sur un
octet et son code est 86h.
Avant lexcution de linstruction, soit la fin de linstruction prcdente, le
compteur ordinal PC contient la valeur 5000h, adresse laquelle il faut aller
chercher le code opratoire de notre instruction.
Au front montant de la priode dhorloge T1, le processeur dpose le contenu
5000h sur le bus dadresse, valeur qui est mmorise temporairement dans un
tampon. La valeur de ladresse se propage sur le bus dadresse jusquau dcodeur
du contrleur de mmoire. Au front descendant de la demie priode les valeurs sont
stabilises sur le bus et le processeur active lordre de lecture vers le contrleur de
mmoire en positionnant au niveau bas le signal RD* et le signal de requte
mmoire MemReq*.
Figure 43 T2 phase fetch.
T3
MemReq
*
RD*
+1
PC
SP
IY
IX
B C
D E
tmp A tmp
F
+ -
A U
L
dcodeur
s

q
u
e
n
c
e
u
r
T1
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Contrleur Mmoire CPU Z80
5000
5000h
86h
5000
5
0
0
0
T2 PC=5001
Reg Ins
A B5
H 23 23
T2, Phase Fetch
T3
MemReq
*
RD*
+1
PC
SP
IY
IX
B C
D E
tmp A tmp
FF
+ -
A U
L
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
T1
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Contrleur Mmoire CPU Z80
5000
5000h
86h
5000
5
0
0
0
T2 PC=5001
Reg Ins
A B5
H 23 23
T2, Phase Fetch
Figure 42 Etat initial et T1 phase fetch.
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Contrleur Mmoire
T2 T3
MemReq
*
RD*
T1
5000h
86h
5000 5000
+1
PC
SP
IY
IX
B C
D E
tmp A tmp
F
+ -
A U
L
Donnes
Adresses
Commandes
dcodeur
s

q
u
e
n
c
e
u
r
CPU Z80
PC=5000
5
0
0
0
Reg Ins
A B5
H 23 23
Etat initial & T1, Phase Fetch
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Contrleur Mmoire
T2 T3
MemReq
*
RD*
T1 T2 T3
MemReq
*
RD*
T1
5000h
86h
5000 5000
+1
PC
SP
IY
IX
B C
D E
tmp A tmp
FF
+ -
A U
L
Donnes
Adresses
Commandes
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
CPU Z80
PC=5000 PC=5000
5
0
0
0
Reg Ins
A B5
H 23 23
Etat initial & T1, Phase Fetch
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

8
Le contrleur de mmoire peut maintenant activer le processus de lecture et il a
toute la priode T2 pour rcuprer la donne (ici le code dune instruction).
En fin de priode, le contrleur doit tre en mesure de produire la donne lue
ladresse 5000h. On notera le point intressant au niveau du processeur : pendant
cette priode dinactivit pour lui, il prpare lavancement du programme en
incrment le compteur de programme qui pointe maintenant et jusqu la fin de
linstruction, sur ladresse de la prochaine instruction excuter qui est donc
5001h. Le tampon de sortie isole momentanment le bus interne du bus externe.
Le cycle de lecture de la phase fetch est lgrement diffrent de celui concernant
les donnes ou les oprandes vu dans le chapitre 3 section 3.6.2.2. Les donnes
sont chantillonnes au tout dbut de la priode T3, pour utiliser une partie de T3 et
la totalit de T4 pour le dcodage du code opratoire et procder au
rafrachissement de la DRAM qui est, dans le cas du Z80, gre par le CPU.
La valeur lue (grce lchantillonnage) comme code opratoire est transfre
dans le registre dinstruction en vue de son dcodage.
La suite du droulement de linstruction concerne maintenant la prparation de
Figure 44 Dcodage et Initialisation de laddition.
Contrleur Mmoire CPU Z80
PC
SP
IY
IX
B C
D E
H
A
B5 tmp
Reg Ins
+-1
A U
L
+ -
F
dcodeur
s

q
u
e
n
c
e
u
r
8 6
PC=5001
MemReq
*
RD*
T4 T2 T3
L 23 23
B5
tmp A
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
8 6
5000h
86h
Dcodage,Initialisation Addition
Contrleur Mmoire CPU Z80
PC
SP
IY
IX
B C
D E
H
A
B5 tmp
Reg Ins
+-1
A U
L
+ -
FF
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
8 6
PC=5001
MemReq
*
RD*
T4 T2 T3
L 23 23
B5
tmp A
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
8 6
5000h
86h
Dcodage,Initialisation Addition
Figure 45 T3 phase fetch, Code Opratoire charg
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
8 6
CPU Z80
PC
SP
IY
IX
B C
D E
tmp A tmp
Reg Ins
+-1
A U
L
+ -
F
dcodeur
s

q
u
e
n
c
e
u
r
8 6
5000h
86h
5
0
0
0
5000
PC=5001
MemReq
*
RD*
T1 T2 T3
5000
A B5
H 23 23
T3, Phase Fetch, Cod Op Charg
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
8 6
CPU Z80
PC
SP
IY
IX
B C
D E
tmp A tmp
Reg Ins
+-1
A U
L
+ -
FF
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
8 6
5000h
86h
5
0
0
0
5000
PC=5001
MemReq
*
RD*
T1 T2 T3
5000
A B5
H 23 23
T3, Phase Fetch, Cod Op Charg
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

9
laddition et lexcution de celle-ci.
A lissue du dcodage de linstruction, le processeur sait quil doit additionner une
valeur au contenu du registre A. Il fait alors une copie temporaire de A (B5h) dans
le registre tmp_A, puisquau cours de lexcution de linstruction le contenu de A
sera cras par le rsultat de laddition.
La suite concerne lutilisation du registre HL contenant ladresse 2323h de la
variable en mmoire centrale. Le travail du processeur est daller rechercher en
mmoire le contenu de cette adresse.
Le processeur lance un nouveau cycle mmoire, cette fois-ci pour rcuprer un
oprande. Au cours de la premire priode (T5) de ce nouveau cycle de lecture, le
processeur fait basculer sur le bus dadresse le contenu du registre HL, c'est--dire
ladresse 2323h. Celle est transmise vers le dcodeur dadresse du contrleur de
mmoire.
Le processus de lecture est ensuite quasi identique ( la position temporelle de
lecture sur le bus de donnes prs) au cycle de lecture prcdent. Le contenu de
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
CPU Z80
PC
SP
IY
IX
B C
D E
H
A
B5 tmp
Reg Ins
+-1
A U
L
+ -
F
dcodeur
s

q
u
e
n
c
e
u
r
8 6
2323h
08h
2323
PC=5001
MemReq
*
RD*
T5 T2 T3
L 23 23
B5
tmp A
2
3
2
3
2323
Addition, lecture oprande, T1
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
CPU Z80
PC
SP
IY
IX
B C
D E
H
A
B5 tmp
Reg Ins
+-1
A U
L
+ -
FF
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
8 6
2323h
08h
2323
PC=5001
MemReq
*
RD*
T5 T2 T3
L 23 23
B5
tmp A
2
3
2
3
2323
Addition, lecture oprande, T1
Figure 46 Addition, lecture de loprande, T1.
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
0 8
CPU Z80
PC
SP
IY
IX
B C
D E
H
tmp
Reg Ins
+-1
A U
L
+ -
F
dcodeur
s

q
u
e
n
c
e
u
r
8 6
2
3
2
3
2323
PC=5001
MemReq
*
RD*
T5 T6 T7
2323
L 23 23
2323
2323h
08h
B5
B5
tmp A
A
0 8
Addition, lecture oprande, T2-T3
Contrleur Mmoire
Plan mmoire d

c
o
d
e
u
r
Rd
/
Wr
0 8
CPU Z80
PC
SP
IY
IX
B C
D E
H
tmp
Reg Ins
+-1
A U
L
+ -
FF
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
8 6
2
3
2
3
2323
PC=5001
MemReq
*
RD*
T5 T6 T7
2323
L 23 23
2323
2323h
08h
B5
B5
tmp A
A
0 8
Addition, lecture oprande, T2-T3
Figure 47 Addition, lecture de loprande T2-T3.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

10
ladresse 2323h (la valeur 08) est dpos sur le bus de donnes. Par contre le
cheminement sur le bus est diffrent : cette fois la donne chantillonne sur le bus
de donnes est dpose dans le registre tmp.
Tout est maintenant prs pour faire raliser effectivement laddition par lUAL. Le
rsultat est rang dans le registre A, et lon peut noter que le registre F des
drapeaux de rsultats doprations arithmtiques et logiques est mis jour.
Ltat final du processeur vis--vis de lexcution du programme est donn dans la
figure 4-8 avec lensemble des valeurs des registres. Le rsultat de laddition est
dans le registre A et PC pointe sur la nouvelle instruction excuter.



CPU Z80
PC
SP
IY
IX
B C
D E
H
tmp
Reg Ins
+-1
A U
L
+ -
F
dcodeur
s

q
u
e
n
c
e
u
r
8 6
PC=5001
L 23 23
2323
B5
CD
tmp A
A
0 8
Addition & Rsultat dans A
CPU Z80
PC
SP
IY
IX
B C
D E
H
tmp
Reg Ins
+-1
A U
L
+ -
FF
dcodeur
s

q
u
e
n
c
e
u
r
dcodeur
s

q
u
e
n
c
e
u
r
8 6
PC=5001
L 23 23
2323
B5
CD
tmp A
A
0 8
Addition & Rsultat dans A
Figure 48 Addition et rsultat.
Un premier bilan simpose ce niveau : le processeur est un automate qui
enchane les instructions sans jamais sarrter : le programme (suite
cohrente dinstructions) doit donc, en permanence,l alimenteravec des
instructions. Lexcution dun programme est totalement dterministe, il est
toujours excut de la mme manire.
On note aussi que, au cours de lexcution dune instruction vue dans son
intgralit, le processeur passe lessentiel du temps grer les changes avec
la mmoire. Le temps de lopration, proprement parl quand il sagit dune
fonction de calcul, va de 10 30% du temps dexcution total de linstruction.
Globalement, un processeur passe beaucoup plus de temps transfrer les
donnes dun endroit un autre qu faire des traitements.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

11
4.2.1.2 Structuration, Organisation gnrale des instructions.
Les instructions du Z80 ont une longueur variable allant de 1 4 octets suivant leur
complexit. Les instructions utilises les plus frquemment sont optimises pour
tenir sur 1 octet ce qui est un facteur dterminant dans la vitesse dexcution.
Cette longueur dinstruction variable est une caractristique des processeurs CISC.
Les instructions dun processeur sont classes en plusieurs catgories.
Les instructions arithmtiques et logiques. Dans le cas du Z80, ces instructions
ne sont pas trs puissantes : elles concernent les oprations de base sur 8 bits et
quelques oprations sur 16 bits. La multiplication et la division dentiers 16 bits,
et a fortiori 32 bits, sont forcment ralises en logiciel. Il en est bien sr de
mme pour les oprations sur les rels. Avec des processeurs plus rcents, les
oprations sur les entiers 32 bits et les rels sont directement effectues au
niveau interne par des units de calcul spcialises.
Les instructions de chargement et mmorisation. Ce sont les instructions qui
permettent deffectuer les mouvements de donnes entre registres et entre
registres et mmoire centrale, ou de bloc de mmoire bloc de mmoire. Dun
processeur un autre, elles sont dune grande diversit, principalement par la
varit des modes dadressage mis en uvre. Elles sappellent Load, Store,
Move, Mov suivants les processeurs, LD sur le Z80.
Les instructions de contrle de flux ou instructions de branchement. Le but de
ces instructions est de permettre de rompre la stricte linarit du droulement
dune suite dinstructions due au passage automatique du processeur
linstruction suivante en mmoire. Les instructions de branchement sont celles
qui permettent de modifier le contenu du compteur de programme PC et ainsi de
changer le parcours linaire des instructions dun programme. Ce sont des
instructions de type GoTo, Aller_ une adresse de programme particulire.
Suivant les processeurs, elles sappellent, JMP (jump), JP, Bra (Branch), .
Une classe particulire des instructions de branchement est constitue des
instructions de branchement conditionnel : la modification du compteur de
programme nest faite que si une condition est vraie, sinon cest linstruction
ADD A, (HL); RET
JR Depl
Code Opratoire
ADD A, REG; Code Op REG
Code Opratoire
Code Opratoire
Code Opratoire
Adresse
LD IX, Adresse Code Opratoire Adresse
JP Adresse
Instructions Z80:
de 1 4 octets
ADD A, (HL); RET
JR Depl
Code Opratoire
ADD A, REG; Code Op REG
Code Opratoire
Code Opratoire
Code Opratoire
Adresse
LD IX, Adresse Code Opratoire Adresse
JP Adresse
Instructions Z80:
de 1 4 octets
ADD A, (HL); RET
JR Depl
Code Opratoire
ADD A, REG; Code Op REG
Code Opratoire
Code Opratoire
Code Opratoire
Adresse
LD IX, Adresse Code Opratoire Adresse
JP Adresse
Instructions Z80:
de 1 4 octets
Figure 49 Addition et rsultat.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

12
normalement prvue en squence qui est excute. Dans le cas du Z80, ce sont
les drapeaux, c'est--dire les bits du registre F, qui indiquent si la condition est
vraie ou fausse. Lassociation de certains drapeaux du registre F et dune
instruction de branchement conditionnel permet de raliser les constructions
algorithmiques de la forme SI condition ALORS .SINON .. . Le
principe est le suivant : la condition rsulte en gnral dune opration de
comparaison faite laide des instructions arithmtiques et logiques.
Lexcution de celle-ci (comparaison, soustraction, ) positionne un drapeau
dans le registre F, par exemple le drapeau Z si le rsultat de lopration est nul.
Une instruction de type JMP Z Adresse1 exploite la valeur du drapeau Z :
sil est vrai, le processeur met la valeur Adresse1 dans le registre PC et la
prochaine instruction excute sera celle qui se situe cette adresse. Si Z est
faux, alors cest linstruction normalement prvue et immdiatement derrire
qui est excute.
Un autre ensemble particulier dinstructions de branchement est constitu par
les instructions d appel et de retour de procdure (Call, Ret pour le Z80).
Nous dcrirons dans un paragraphe suivant les implications de leur mise en
oeuvre.
Les instructions diverses. Comme dans toute classification, il reste quelques
instructions plus ou moins inclassables. Ce sont les instructions concernant les
entres/sorties, les interruptions ou autres instructions diverses dont certaines
feront lobjet dun zoom particulier dans dautres chapitres.

4.3 La procdure : un lment de structuration.
Les premiers dveloppements logiciels ont rapidement fait apparatre une ncessit
de structuration dans le dveloppement des programmes, spcialement pour la
rutilisation de morceaux de codes dj crits. La cration de bibliothques de
fonctions crites et testes une fois pour toutes, savre utile pour la fiabilit et la
rapidit du dveloppement de grosses applications.
Mme pour le dveloppement dun seul programme, il est intressant de bien isoler
les parties de code rutilisable. Une premire forme de rutilisation de code dj
crit est la recopie de lignes de codes (on dirait maintenant faire du copier-coller)
dans les macro-assembleurs. Le procd consiste rpliquer autant de fois que
ncessaire un morceau de code, le programme augmente en taille avec le nombre
de rplications. Ce mode comporte aussi tous les dangers du copier-coller, c'est--
dire lextraction de quelque chose hors de son contexte. La forme la plus pratique
et la plus sre de rutilisation est lcriture de procdure.
Une procdure est une suite dinstructions correspondant une fonction bien
prcise. Un des premiers (au sens historique) intrts de la procdure est que son
code, dans le programme, nest prsent quune seule fois en mmoire procurant
ainsi un gain de place non ngligeable en occupation mmoire.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

13
La procdure est un morceau de code qui se trouve en mmoire centrale une
adresse dtermine. Son utilisation est a priori : il suffirait dune instruction de
branchement inconditionnel de type GoTo Adresse_dbut_de_procdure pour
que le processeur passe son excution. Le compteur de programme PC voit son
contenu cras et remplac par ladresse du dbut de la procdure. La procdure
passe dans sa phase dexcution. Le problme se pose la fin de cette excution : il
est ncessaire de dfinir cette fin et surtout il faudra pouvoir revenir lendroit du
programme do lon est venu pour excuter la procdure. Une procdure est
appele et il faut marquer la fin du code par une instruction spcifique de
terminaison RET (return, retour) qui gnre le retour au programme appelant.
Linstruction qui fait lappel de procdure doit en consquence mmoriser, dans un
registre par exemple, ladresse de retour, adresse qui sera prise en compte par
linstruction RET.
Cependant, le problme se complique la gnralisation des procdures : il serait
normal de pouvoir appeler une procdure lintrieur dune procdure et ainsi de
suite. La complication tient au niveau de la mmorisation de ladresse de retour, ou
plutt, cette fois-ci, des adresses de retour. Il est donc impossible de mmoriser
simplement ladresse de retour dans un registre, car avec un nouvel appel
lintrieur de la procdure, la premire adresse de retour sera crase, perdue. A
chaque appel de procdure, il faut maintenir une sorte de fil dAriane par la
mmorisation successivement de toutes les adresses de retour. Le retour
lappelant initial se fera en employant toutes ces adresses dans lordre inverse de
leur stockage.
Concrtement ce stockage correspond une file dattente dadresses de retour
gre en LIFO (Last In First Out) : la dernire adresse entre dans la file est la
premire qui sera retire. Cette structure de donnes en file dattente rsidente en
mmoire centrale et gre en LIFO est appele une pile.
Initialement, la pile est vide et est seulement dfinie par son adresse de base BP
(Base Pointer) qui marque le dbut de la zone en mmoire centrale qui lui est
rserve. La pile va monter ou descendre (grandir/diminuer) au fur et mesure
des empilements ou des dpilements : elle est alors dfinie par son pointeur de pile
(SP, Stack Pointer) qui donne ladresse du sommet de pile. linitialisation SP est
gal BP (pile vide). La pile est une structure de donnes taille dynamique.
La main tenant le fil dAriane du mcanisme de gestion (appel et retour) dune
procdure est le pointeur de pile SP. Au moment de lappel de procdure, le
processeur doit avoir sa disposition le pointeur de pile pour mmoriser dans la
pile ladresse de retour contenue dans le registre PC. Dans le cas du Z80, cest le
registre SP, dont nous avons parl lors de la prsentation des registres de ce
processeur, qui contient ce pointeur.
Voyons maintenant plus en dtail le fonctionnement dun appel de procdure.

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

14
Appel de procdure (Z80), instructions CALL et RET
La description dun appel de procdure est faite sous langle du modle de
programmation, en abandonnant totalement la description physique. La vue est
purement logicielle. Nous partons des conditions initiales suivantes : le processeur
excute un programme et lachvement de lexcution dune instruction, le
pointeur de pile SP vaut 3002 et le compteur de programme PC vaut 1A47h. Cette
valeur pointe sur la prochaine instruction excuter, soit linstruction Call 2135h
(de code opratoire CD
h
).
Les diffrentes phases de cet appel sont dcrites dans la figure 4-10. La partie
droite visualise les registres PC et SP ainsi que les deux zones mmoires
impliques par lappel : une zone de mmoire pour la pile et la zone mmoire de
code contenant les instructions.
La zone mmoire pour la pile est rserve avant lexcution dun programme. La
convention dutilisation dune pile est telle quelle augmente (monte) avec les
adresses qui diminuent. Notre adresse de base est 3500h et ladresse contenue dans
le pointeur de pile est dcrmente au fur et mesure du stockage dans la pile.
Chaque opration dempilement dcrmente le pointeur de pile et range la valeur
la nouvelle adresse obtenue. Cest une convention universellement adopte. Une
opration de dpilement effectue la lecture de la valeur puis incrmente le pointeur
de pile.
Au cours de la phase fetch (rcupration du code opratoire CD) de linstruction
Call 2135h le processeur incrmente PC qui pointe maintenant sur loprande de
linstruction. Cet oprande est ladresse de dbut de la procdure (2135h). On
remarquera que, si on regarde de prs, ladresse de loprande pointe sur loctet de
poids faible (valeur 35h) de cette adresse. Cette convention dorganisation de la
mmoire vis--vis des variables de plus dun octet est appele little endian ou
Appel de procdure :
Etat Initial : PC = 1A 47; SP = 3002
1) Lecture de linstruction ( fetch) et dcodage; et (PC <- PC + 1 (PC = 1A48)
2) Lecture des oprandes
a. Lecture Oprande_1 (35h) et PC <- PC + 1 (PC = 1A49)
b. Lecture Oprande_2 (21h) et PC <- PC + 1 (PC = 1A50)
3) Sauvegarde de PC dans la pile :
a. SP <- SP-1 (SP = 3001)
b. (SP) <- PC
H
cycle criture mmoire
c. SP <- SP-1 (SP = 3002)
d. (SP) <- PC
L
cycle criture mmoire
4) Chargement de PC avec ladresse de la procdure
PC
H
<- Oprande_1 (21h) et PC
L
<- Oprande_2 (35h) (PC =2135)
Etat final : SP = 3002 pointe sur ladresse de retour et PC contient ladresse de
premire instruction de la procdure
Prochaine tape : phase fetch de la premire instruction de la procdure
PC
mmoire
. . .
. . .
adresse
pile
. . .
3500
3002
3001
3000
X X
1 A
5 0
. . .
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
C D
3 5
2 1
8 6
PC
H
PC
L
PC
SP 3 0 0 2
1 A 4 7
. . .
. . .
Call 2135h . . . . . . . . . . . . . .
initial
PC
PC
H
PC
L
PC
SP 3 0 0 0
2 1 3 5
final
1A50 AddA, [HL] . . . . . . . . . . . .
. . .
. . .
. . .
procdure
Les Registres
PC
mmoire
. . .
. . .
adresse
pile
. . .
3500
3002
3001
3000
X X
1 A
5 0
. . .
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
C D
3 5
2 1
8 6
PC
H
PC
L
PC
SP 3 0 0 2
1 A 4 7
. . .
. . .
Call 2135h . . . . . . . . . . . . . .
initial
PC
PC
H
PC
L
PC
SP 3 0 0 0
2 1 3 5
final
1A50 AddA, [HL] . . . . . . . . . . . .
. . .
. . .
. . .
procdure
Les Registres
Figure 410 Appel de procdure.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

15
petit boutiste : ladresse de la variable donne ladresse de loctet de poids faible.
Cest la convention adopte sur le Z80.
Les deux octets de loprande sont lus, mis dans un registre temporaire et le
compteur de programme PC est incrment. la fin des deux lectures, PC vaut
1A50h et pointe sur la prochaine instruction (de code 86 ADD A, [HL])
excuter lors du retour de lappel de procdure.
Cette adresse est mise dans un registre temporaire, en attendant que le compteur de
programme soit sauvegard dans la pile. Cette sauvegarde se fait octet par octet et
le pointeur de pile est dcrment en consquence. Le sommet de pile vaut 3002
la fin de la sauvegarde. Le compteur de programme peut maintenant accueillir
ladresse de la procdure stocke momentanment dans le registre temporaire.
Le bilan du droulement de linstruction dappel de procdure est en consquence
un simple changement de la valeur de PC avec une sauvegarde de ladresse de
retour. Lensemble ncessite cependant, simplement pour faire lappel, 17 priodes
dhorloge.
La procdure peut maintenant sexcuter. la fin de cette excution, la procdure
comporte linstruction RET sans paramtres. Plus prcisment son paramtre est
implicite : cest le sommet de pile dont il faudra prendre le contenu pour le mettre
dans PC. Le pointeur de pile est incrment et le programme reprend alors
normalement son cours.
Linstruction RET demande 10 priodes dhorloge : lensemble des frais gnraux
(overheads) gnrs par lappel de procdure (sans pour linstant soccuper du
passage de paramtres) est de 27 priodes dhorloge, ce qui nest tout de mme pas
ngligeable.

RET retour de procdure :
Etat Initial : PC = 1A 47; SP = 3002
1) Lecture de linstruction (fetch) et dcodage; et PC PC + 1
(valeur de PC indiffrente, ne sera pas utilise)
2) Restitution de PC partir de la pile :
a. PC
L
(SP) cycle lecture mmoire (pile)
SP SP+1 (SP = 3001)
b. PC
H
(SP) cycle lecture mmoire (pile)
SP SP+1 (SP = 3000)
Etat final : SP = 3000 pointe sur le sommet de la pile davant lappel et PC
contient ladresse de retour (1A50)
Prochaine tape : phase fetch de linstruction suivant lappel de procdure.
Figure 411 Retour de procdure.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

16
4.4 Organisation des donnes (Endianess - Boutisme)
Nous venons de rencontrer pour la deuxime fois la notion de reprsentation dun
registre vers un autre support. La premire fois, il sest agit de la transmission
srie des donnes sur un support de transmission (chapitre 3, section xx) avec
deux choix possibles : envoyer dabord le bit de poids fort ou dabord celui de
poids faible. La question se repose, mais cette fois-ci pour transfrer les donnes
des registres vers la mmoire (et bien sr pour le transfert inverse) et avec la
granularit de loctet au lieu de celle du bit. Lorganisation basique de la mmoire
est une suite contigu doctets o un octet particulier est rfrenc par son adresse.
Pour cet octet il ny a aucune ambigut par rapport un registre de 8 bits : lordre
des 8 bits dun registre est le mme que celui des 8 bits de loctet en mmoire.
Par contre, lorsque le processeur travaille sur un registre de 16 bits et si celui-ci est
transfrer dans une variable en mmoire, il faut dfinir quel octet du registre
correspond ladresse de la variable. Soit OF loctet de poids fort (bits 8 15) du
registre et Of loctet de poids faible.
Convention Little Endian ou petit boutiste.
Dans la convention appele Little Endian ou petit boutiste utilise dans le Z80
(et dans les processeurs de la famille Intel x86 y compris le Pentium) ladresse en
mmoire dune variable 16 bits est celle de loctet Of : cest loctet Of qui est rang
en premier. Loctet OF le suit ladresse +1. Lintrt de cette convention est
dviter toute opration relle dans une conversion sur des entiers de taille
diffrentes (8, ou 16 bits) : la conversion devient implicite car ladresse de la
variable est ladresse de loctet de poids faible.
Par contre, cette convention ne facilite pas la lisibilit humaine : alors que la
visualisation de la mmoire est conscutive, il faut permuter lordre des octets pour
assurer une lisibilit par rapport nos conventions classiques.
Cette convention est peu peu abandonne dans les processeurs modernes.
Convention Big Endian ou grand boutiste.
Cest la convention dominante maintenant : les octets sont rangs dans lordre
dcroissants des poids. Loctet de poids fort est le premier octet tre rang, les
autres le suivent dans lordre naturel de lisibilit.
Dans la suite des exemples de programmes en assembleur, nous referons
rgulirement mention ces conventions.
La figure 4-12 reprend le codage de lappel de procdure du Z80 o ladresse de la
procdure est donne avec la convention Little Endian et le met en comparaison
avec linstruction quivalente BSR (Branch Subroutine) dun processeur
comparable, le 6809 de Motorola , utilisant la convention Big Endian.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

17
Le problme de lisibilit du Big Endian se complique encore lorsquon passe une
reprsentation dune valeur sur 32 bits : il faut intervertir les mots de 16 bits de
poids fort et 16 bits de poids faible et refaire la mme intervention des octets de
poids forts et faible lintrieur de chaque mot de 16 bits. Par exemple, si lon
regarde limplantation en mmoire du nombre dcimal 439 041 101 cod en
complment 2 et dont la valeur est 1a2a3a4d
h
, alors on obtient les reprsentations
suivantes
1a2b 3c4d
h
avec un 68020
4d3c 2b1a
h
avec un386 (ou Pentium)

4.5 Gestion de Pile
Lorganisation dun logiciel sur
la base des procdures est un
premier niveau de structuration en programmation. Elle concerne essentiellement le
code. La structuration peut aussi tre introduite au niveau des donnes : il sagit de
manipuler un ensemble de donnes homognes comme un objet unique. La donne
se verra alors affect un traitement comme lment appartenant cet objet. Le
calcul scientifique est friand de ce genre dabstraction, les plus courantes tant les
vecteurs et les tableaux. La donne est alors rfrence par sa position (son indice)
dans lobjet vecteur ou lobjet tableau. La structure en langage C est une autre
manire dorganiser les donnes : chaque donne est un champ de la structure.
Dans ce cas les donnes peuvent tre htrognes.
La pile dont nous avons besoin pour la gestion des appels de procdure est une liste
dattente, c'est--dire une liste de donnes mmorises en vue dun usage ultrieur.
Les oprations qui se font sur une liste sont des oprations plus complexes quune
simple lecture ou criture : la mmorisation est une criture qui augmente la taille
de la liste alors que la lecture est de fait une lecture avec consommation, c'est--
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
C D
3 5
2 1
.
. . .
Call 2135h . .
PC
PC
H
PC
L
PC 2 1 3 5
1A50
Little Endian Z80
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
8 D
2 1
3 5
.
. . .
BSR 2135h . .
PC
PC
H
PC
L
PC 2 1 3 5
1A50
Big Endian 6809
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
C D
3 5
2 1
.
. . .
Call 2135h . .
PC
PC
H
PC
L
PC 2 1 3 5
1A50
Little Endian Z80
mmoire
. . .
. . .
adresse
programme
. . .
1A00
1A47
1A48
1A49
8 D
2 1
3 5
.
. . .
BSR 2135h . .
PC
PC
H
PC
L
PC 2 1 3 5
1A50
Big Endian 6809
Figure 412 Little et Big Endian.
les derniers seront les premiers et les premiers
seront les derniers...
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

18
dire un retrait de la liste. Plutt que de parler de lecture et criture, on utilisera les
termes dinsertion et dextraction.
De telles listes sont appeles files dattente auxquelles on doit associer un mode de
gestion. Lun de ceux-ci, bien connu dans la vie quotidienne, est le mode FIFO
(First In First Out, Premier Arriv Premier Servi) qui est le modle adopt et en
gnral accept, pour la gestion des files dattente dans la plupart des services
publics ou commerciaux (caisses, guichets, tlsiges, ). La pile, quant elle,
est une liste dattente gre en mode LIFO (Last In Fist Out, Dernier Arriv
Premier Servi) : les humains ne laiment pas beaucoup se la voir applique, mais la
pratiquent souvent quand il sagit de dossiers dans une corbeille !
La bonne gestion dune pile est dterminante pour le droulement dun programme
et il faut absolument veillez ce que le pointeur de pile soit cohrent tout au long
du droulement dun programme. Les erreurs de manipulation de la pile sont
fatales la fois pour le programme (fausse adresse de retour, ), mais
ventuellement aussi pour le systme dexploitation. Pour prvenir ce risque, la
plupart des processeurs prvoient la gestion de deux piles diffrentes, une pour les
applications des utilisateurs, une autre pour les programmes du systme
dexploitation.
Motorola introduit ainsi, ds son processeur 8 bits 6809, 2 registres pointeurs SP_U
et SP_S (Utilisateur et Systme). On les retrouve dans le 68 000 que nous allons
prendre comme cas dillustration pour les techniques dadressage.

4.6 Les techniques dadressage, cas du 68000.
Nous avons introduit la mmoire centrale comme un espace adressage linaire
continu La mmoire est une suite linaire doctets, chaque octet est repr par son
adresse et les octets se suivent avec des adresses continues. Les adresses sont
valeurs entires et lon passe dun octet au suivant par lincrmentation de
ladresse. Pourquoi parler de techniques dadressage, puisque pour accder un
octet en mmoire il faut et il suffit de donner son adresse. Une instruction du type
lire source vers destination devrait suffire. Par exemple lire 5000
h
vers A est
suffisante pour faire le transfert de loctet en mmoire ladresse 5000 dans le
registre A du processeur. Une telle instruction est effectivement suffisante, mais
demande beaucoup de manipulation au programmeur pour dterminer ladresse
dun lment dans des structures de donnes. Les constructeurs ont donc propos
un paramtrage de ladressage destin faciliter la lisibilit du programme et
surtout le travail du programmeur si le programme est dvelopp en assembleur.
Lorsque le programme est crit dans un langage de haut niveau, les critres de
facilit et de lisibilit ninterviennent plus puisque cest le langage qui sen charge
et le compilateur qui fait la traduction en code machine. Par contre, le paramtrage
a pour effet de compacter le code excutable, ce qui tait intressant lorsque la
mmoire tait chre.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

19
Ce paramtrage concerne les diffrentes manires daccder un lment en
mmoire centrale. A chaque technique dadressage correspond une manire de
calculer une adresse en mmoire partir des paramtres donns dans linstruction.
Nous allons dcrire quelques unes de ces techniques avec le processeur 68 000 car
les exemples sont assez simples introduire.
4.6.1 Description succincte du 68000.
Le MC68000 de Motorola est un processeur 16 bits mais conu ds lorigine avec
des registres 32 bits de manire assurer une compatibilit ascendante future. Il est
la base de la famille 680x0 (x= 2, 3, 4, 5, ) dont le 68020 est la premire
implmentation en vrai 32 bits (registres et bus dadresse et de donnes sur
32bits).Les tailles des oprandes sont dfinies de la manire suivante : l'octet fait 8
bits, le mot 16, le mot long 32 et le double long 64.
Il possde nombreux modes dadressage. Les modes dadressage sont les
diffrentes manires dindiquer au processeur la faon daccder une donne en
mmoire centrale vis--vis dune structure de donnes dun langage volu
(vecteurs, tableaux, structures, ). Lobjectif des concepteurs a t que les
instructions arithmtiques et logiques intgrent des schmas de description de
lecture ou dcriture des oprandes relativement complexes. Les instructions
deviennent trs puissantes, car en peu de lignes de code on peut raliser des
oprations complexes.
Lorganisation des donnes dans les registres.
Les 8 registres de donnes peuvent prendre en charge des donnes de 1, 8,16, 32 et
64 bits, des adresses de 16 ou 32 bits, ainsi que des champs de bits de 1 32 bits.
Les 7 registres d'adresses, A0 A6, et le registre pointeur de pile, A7, manipulent
des adresses sur 16 ou 32 bits.
Les registres de donnes : D0 D7.
Chaque registre de donnes a une taille de
32 bits. Les oprandes de type byte
occupent les 8 bits de poids faible, ceux
de type word occupent les16 bits de poids
faible et les longs occupent la totalit des
32 bits. Dans la programmation en
assembleur , la diffrentiation de la taille
des oprandes est faite en suffixant
linstruction par .b, .w, .l respectivement
(Byte, Word, Long).
Le registre CCR (Code Condition
Register) est associ aux registres de
donnes : il mmorise les rsultats
31 16 15 8 7 0
D0
D1
D2
D3
D4
D5
D6
D7
31 15 0
A0
A1
A2
A3
A4
A5
A6
31 16 15 0
A7
31 0
PC
15 8 7 0
CCR
Figure 413 Les registres du 68K.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

20
synthtiques des oprations logiques et arithmtiques pour tre utiliss comme
condition dans les instructions de branchement conditionnel (il est lquivalent du
registre F du Z80).
Les registres d'adresses A0 A7.
Une adresse est donne sur 32 bits ce qui procure un espace adressable de 4 Go. Le
registre A7 joue un rle particulier : cest le pointeur de pile appel aussi USP,
User Stack Pointer (pointeur de pile utilisateur). Le processeur a deux modes de
fonctionnement : dans le mode User, A7 est le pointeur de pile USP et dans le
mode Superviseur (rserv lexcution du systme dexploitation), A7 est le
pointeur de pile SSP.
Les instructions du 68000 et Notations assembleur.
Les instructions comportent un code opratoire sur 16 bits et un nombre variable
doprandes. Les instructions ont des longueurs variables. Lorsquelles font
apparatre des oprandes source et destination, la convention Motorola donne le
premier oprande comme la source et le second pour la destination.
4.6.2 Les modes dadressage du 68000.
Dcrivons quelques uns des adressages les plus utiliss. Pour chacun des modes,
nous prendrons un exemple dinstruction impliquant ce mode et qui sera visualis
avec les mouvements de donnes induits sur les registres, la mmoire o se trouve
le code et celle o se trouve les donnes.
4.6.2.1 Adressage direct de registre de donnes
notation : Dn, taille : b,w,l (8,16, 32), L'oprande est le contenu de Dn
Ladressage direct de registre de donnes est un adressage qui concerne
uniquement les registres.
Linstruction ADD D4, D0
effectue laddition du contenu du
registre D4 celui de D0.
Linstruction demande un seul
accs en mmoire pour la lecture
du code opratoire (D0 40).
La zone mmoire de donnes
nest pas affecte par cette
opration.
A la fin de lexcution de
linstruction le compteur de
programme est incrment de 2
pour pointer sur linstruction suivante.
32 16 15 8 7 0
D0 a b c d
D1
D2
D3
D4 4 3 2 1
D5
D6
D7
32 16 15 8 7 0
A0
A1
A2
A3
A4
A5
A6
A7
(USP)
(SSP)
PC adr_inst
ADD D4, D0
abcd
+4321
eeee
Mmoire donnes
Mmoire code
15 8 7 0
15 8 7 0
D0 44
+2
adr_inst
+2
adr_inst
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

21
4.6.2.2 Adressage direct de registre d'adresse
notation : An, taille : w,l (16, 32), L'oprande est le contenu de An
Dans cette instruction loprande
source est un registre dadresse
An et le registre destination un
registre de donnes Dn.
Le contenu du registre A1 est
additionn au contenu du
registre D1.
Linstruction ne demande quun
seul cycle mmoire (phase fetch)
et lissue de lexcution de
linstruction, le compteur de
programme est incrment de 2
pour pointer sur linstruction
suivante.
4.6.2.3 Adressage immdiat
notation :#valeur, taille : b,w,l (8,16, 32),
L'instruction fournit la valeur de
l'oprande
Linstruction ADDI #$eeee, D0
ajoute la constante eeee
h
au
contenu du registre D0.
Ladressage immdiat indique que
loprande est plac juste derrire
le code opratoire de linstruction.
Cet oprande est forcment une
constante. Ladressage immdiat
est spcifi par le symbole #.
Le nombre ajouter peut tre
dcrit en diffrentes bases. La base par dfaut est 10 et le symbole $ de lexemple
indique un nombre en base 16.
Linstruction demande deux cycles de lecture mmoire (la phase fetch et la lecture
de loprande). Loprande tant sur 16 bits, le compteur de programme est
incrment de 4 pour pointer sur linstruction suivante.

32 16 15 8 7 0
D0
D1 11 22
D2
D3
D4
D5
D6
D7
32 16 15 8 7 0
A0
A1 50 10
A2
A3
A4
A5
A6
A7
(USP)
(SSP)
23
PC adr_inst
ADD A1, D1
1122
+5010
6132
Mmoire donnes
Mmoire code
15 8 7 0
15 8 7 0
D2 49
+2
adr_inst
32 16 15 8 7 0
D0 11 11
D1
D2
D3
D4
D5
D6
D7
32 16 15 8 7 0
A0
A1
A2
A3
A4
A5
A6
A7
(USP)
(SSP)
23
PC adr_inst
15 8 7 0
15 8 7 0
06 40
ee ee
ADDI #$eeee, D0
1111
+eeee
ffff
Mmoire donnes
Mmoire code
+4
adr_inst
adr_inst
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

22
4.6.2.4 Adressage absolu
notation : valeur_adr, taille : w,l (16, 32),
L'instruction fournit l'adresse de l'oprande
Le premier oprande de cette instruction nest pas une donne (pas de signe #),
mais une adresse dcrite en valeur hexadcimale (signe $).
Le contenu de la variable
ladresse 5010, soit 5678 est
ajout au contenu du registre D0.
Linstruction demande trois
cycles de lecture mmoire (la
phase fetch, la lecture de
loprande adresse, puis celle de
la donne). Loprande tant sur
16 bits, le compteur de
programme est incrment au
total de 4 pour pointer sur
linstruction suivante.
4.6.2.5 Adressage indirect
sur registre d'adresse
notation : (An), taille : b,w,l (8,16, 32), An contient l'adresse de l'oprande :
l'oprande est en mmoire l'adresse pointe par An
Ladressage indirect sur registre dadresse utilise le contenu dun registre
dadresse, ici A0, comme adresse
mmoire o se trouve la donne
additionner au contenu du
registre de donnes D0.
Linstruction demande deux
cycles de lecture mmoire (la
phase fetch et la lecture de la
donne). Linstruction nayant
pas doprande explicite en
mmoire, le compteur de
programme est incrment de 2
pour pointer sur linstruction
suivante.
Variantes de ce type dadressage : utilisation pour la gestion dune pile de
donnes
32 16 15 8 7 0
D0 12 34
D1
D2
D3
D4
D5
D6
D7
32 16 15 8 7 0
A0
A1
A2
A3
A4
A5
A6
A7
(USP)
(SSP)
23
PC adr_inst
ADD $5010, D0
1234
+5678
68AC
5010
+4 +4
adr_inst
15 8 7 0
56 78
15 8 7 0
D0 79
50 10
Mmoire donnes
Mmoire code
32 16 15 8 7 0
D0 12 34
D1
D2
D3
D4
D5
D6
D7
32 16 15 8 7 0
A0 50 10
A1
A2
A3
A4
A5
A6
A7
(USP)
(SSP)
23
PC adr_inst
ADD (A0), D0
1234
+5678
68ac
Mmoire donnes
Mmoire code
15 8 7 0
56 78
15 8 7 0
D0 50
5010
+2 +2
adr_inst
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

23
4.6.2.6 Adressage indirect sur registre d'adresse avec prdcrment
: -(An) ; avec postincrment : (An)+
notation :-(An), taille : b,w,l (8,16, 32), On soustrait d'abord An la taille de
l'oprande,
l'oprande est en mmoire la nouvelle adresse pointe par An
notation :(An)+, taille : b,w,l (8,16, 32), L'oprande est en mmoire l'adresse
pointe par An. On ajoute ensuite An la taille de l'oprande.
Faire un exemple dutilisation dune pile utilisateur : les premiers seront les
derniers
8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8



4.6.2.7 Adressage indirect sur registre avec dplacement
(adressage relatif / pointeur de base), notation : d16(An), taille : b,w,l (8,16,
32)
Adresse de l'oprande : contenu de An + dplacement 16 bits sign, fourni
dans l'instruction
Le dernier mode dadressage que nous allons dcrire est ladressage indirect sur
registre avec un dplacement. Le registre dadresse sert de pointeur de base un
lment, par exemple un tableau ou une structure, auquel on ajoute un
dplacement.
Linstruction ADD $11(A0), D0 prend le contenu du registre A0 auquel est ajout
le dplacement de valeur 11
h

pour obtenir ladresse de la
donne ajouter au contenu du
registre D0.
Linstruction demande trois
cycles de lecture mmoire (la
phase fetch, la lecture de
loprande index puis la lecture
de la donne). Loprande tant
sur 16 bits, le compteur de
programme est incrment de 4
pour pointer sur linstruction
suivante.
pile
32 16 15 8 7 0
D0 12 34
D1
D2
D3
D4
D5
D6
D7
32 16 15 8 7 0
A0 50 10
A1
A2
A3 6200
A4
A5
A6
A7
(USP)
(SSP)
23
PC adr_inst
ADD $11(A0), D0
1234
+5678
68ac
Mmoire donnes
Mmoire code
15 8 7 0
56 78
15 8 7 0
D0 68
00 11
5021
5010
+0011
5021
+4 +4
adr_inst
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

24

4.7 Introduction au langage assembleur.
Pour cette introduction, nous allons dans un premier temps partir de petits
programmes trs simples en langage C. Nous demanderons au compilateur C de
nous traduire le programme source C en programme assembleur pour le processeur
68000. Nous prendrons ensuite la mme dmarche et les mmes exemples avec un
processeur assez diffrent, le MIPS.
Les exemples sont illustrs par une prsentation dans un mme tableau du
programme C, du programme correspondant en assembleur et finalement le code
binaire excutable gnr qui met en uvre le jeu dinstruction.
La partie gauche de la figure est un petit programme C ne comportant que des
affectations simples. La colonne de droite est le programme assembleur 68000
gnr automatiquement par le compilateur C.
La partie centrale est le code objet du programme (binaire), tel quil peut tre
charg en mmoire centrale pour son excution. La visualisation est faite en
notation hexadcimale, 2 digits hexadcimaux dcrivant un octet. La colonne de
gauche marque ad donne les adresses dimplmentation en mmoire. Ainsi, dans
le premier exemple (figure 4-14), le code du programme commence ladresse 06
et se termine ladresse 25. La zone de donnes o sont stockes les variables
commence ladresse 00 et se termine ladresse 05.
Le dbut du programme assembleur concerne la dclaration des variables pour
lesquelles il faut rserver de la place en mmoire. Par convention le noms des
variables en C gardent le mme nom mais prcd du caractres _. Les int
(entiers) en C deviennent pour ce compilateur des mots de 16 bits (suffixe .w) et
sont dclars sous forme de suite de 2 octets.
Dans la partie centrale, on peut constater que la variable _a a pour adresse 00 et la
dernire adresse occupe par _a est ladresse 01.
Il est bien sr possible daborder la programmation sur des principes de
machine abstraite. On peut alors totalement masquer lexistence dun langage
assembleur.
Nous allons aborder une introduction la programmation en assembleur dans
le cadre de notre dmarche ascendante. Le modle de programmation est
linterface qui rend possible toutes les abstractions de niveau suprieur.
Cette introduction donne les principes de base de la programmation
assembleur. Nous partirons de programmes trs simples en langage C et nous
regarderons le code assembleur gnr par le compilateur.
La fin du chapitre dtaille les mcanismes sous-jacents lappel de procdure
et surtout au passage de paramtres.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

25
Le nom main en C est le nom dune procdure particulire qui est souvent appel
programme principal. Ce nom devient un label ou tiquette en assembleur (_main).
Un label est suivi du caractre : et prend pour valeur celle de ladresse de
linstruction qui suit. Ainsi _main est gal 06 qui est ladresse de la premire
instruction du programme. Une tiquette est gnralement utilise comme le
paramtre de destination dans une instruction de saut conditionnel ou
inconditionnel.
Figure 414 C et assembleur 68000, exemple 1.
La premire instruction, link, est spcifique la gestion dune procdure et nous
lignorerons dans un premier temps. Nous y reviendrons plus longuement par la
suite. Laffectation a = 2 ; en C devient en assembleur move.w #2, _a, dont la
signification est : transfrer un mot de 2 octets (suffixe w) dont la valeur est 2 vers
la variable _a. Linstruction move.w utilise ici un adressage immdiat avec pour
loprande source la constante 2. Le code binaire de linstruction est 31fc 0002
0000.
Le code opratoire est 31fc et les 2 octets qui suivent (0002) contiennent le codage
en complment 2 (type int en C) de la constante 2. Les 2 octets suivants dsignent
ladresse de la variable _a, soit 00. On note que la constante 2 a pour adresse 0c
(premire adresse aprs le code opratoire) et que cette adresse est ladresse de
loctet de poids fort d la constante : la convention de reprsentation mmoire
utilise du 68000 est de type Big Endian. Linstruction occupe 6 octets lus par
groupe de 2 (bus de donnes de 16 bits). Le droulement de linstruction demande
3 cycles de lectures en mmoire et un cycle dcriture pour lexcution (rangement
ladresse de _a).
/*Exemple 1:
Prog. C ad contenu mmoire Assembleur 68000

int a,b,c;
00 0000 _a: ds.b 2
02 0000 _b: ds.b 2
04 0000 _c: ds.b 2
main ()
{
_main:
06 4E56 0000 link A6,#0
a = 2;
0A 31FC 0002 0000 move.w #2,_a
b=3;
10 31FC 0003 0002 move.w #3,_b
c= a+b;
16 3038 0000 move.w _a,D0
1A D078 0002 add.w _b,D0
1E 31C0 0004 move.w D0,_c
}
22 4E5E unlk A6
24 4E75 rts

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

26
La deuxime affectation est identique dans sa forme la valeur de la constante et
de le la variable prs. Linstruction c = a + b
1
en C ncessite plusieurs instructions
assembleur : laddition ne peut se faire que sur un registre. Le compilateur a choisi
le registre D0, mais il aurait pu choisir nimporte quel registre de donnes.
Laddition est faite en trois temps : rangement de _a dans le registre D0, addition
de la variable _b au contenu de D0, puis enfin le rangement de D0 ladresse de la
variable _c.
Nous nallons pas dtailler chaque instruction, mais faisons cependant une
exception pour linstruction move.w _a, D0. Son code est 3038 0000. Alors que
le mnmonique en langage assembleur de linstruction est le mme que le move
prcdent, il na pas la mme signification vis--vis de la technique dadressage. Il
sagit toujours dun transfert, mais les paramtres ne sont pas les mmes :
loprande source est une adresse mmoire alors que ladresse destination est un
registre. Autre caractristique de cette instruction : elle est plus courte, seule
ladresse mmoire apparat explicitement dans linstruction. Loprande destination
tant un registre est cod directement dans le code opratoire.
Figure 415 C et assembleur 68000, exemple 2.


1
Pour lanecdote : a et b sont des constantes, donc la somme c est une constante. Un bon
compilateur, faisant un minimum doptimisation aurait du traduire
les instructions a= 2 ; en move.w #2, _a
b=3 ; move.w #3, _b
c=a+b ; move.w #5, _c

/*Exemple 2:
Prog. C ad contenu mmoire Assembleur 68000

main ()
{
_main:
00 4E56 FFFA link A6,#-6
int a,b,c;
a = 2;
04 3D7C 0002 FFFE move.w #2,-2(A6)
b = 3;
0A 3D7C 0003 FFFC move.w #3,-4(A6)
c = a + b;
10 302E FFFE move.w -2(A6),D0
14 D06E FFFC add.w -4(A6),D0
18 3D40 FFFA move.w D0,-6(A6)
}
1C 4E5E unlk A6
1E 4E75 rts
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

27
Variables dans la pile.
Lexemple 2 est une variante du programme prcdent o la dclaration des
variables est interne la procdure main. Les variables deviennent locales la
procdure et sont alloues dynamiquement au moment de lappel de la procdure
main. La place sera rendue, libre la sortie de la procdure. Linstruction link
A6, #-6 effectue cette rservation de mmoire. Si au moment de lappel de la
procdure, le pointeur de pile USP vaut 10b8, linstruction va rserver la place
ncessaire pour les 3 variables a, b et C dans la pile. La rservation se fait
simplement en diminuant USP est diminu de 6 et vaut maintenant 10b2. USP est
susceptible dvoluer, en particulier si dans la procdure il y a un autre appel. USP
tant par essence variable, les variables a, b et c ne peuvent tre rfrences par
rapport USP. Il faut donc, avant la rservation de la zone, mmoriser la valeur du
pointeur de pile (ici 10b8) dans un registre. Les variables pourront ensuite tre
rfrences sans problmes par rapport la valeur fixe de ce registre.
Dans lexemple 2, linstruction link se sert du registre dadresse A6. Ladresse de
la variable a est -2 par rapport A6, b -4 et c -6 (FFFE, FFFC, FFFA dans le
code des instructions sont les valeurs -2, -4 et -6 en complment 2). On peut noter
que ce programme sera plus efficace en temps dexcution car il implique moins
daccs la mmoire.
Lexemple 3, figure 4-16, est le mme que la premire version, mais compile pour
un processeur 68020, cest dire la premire version entirement 32 bits du 68000.
Les diffrences principales tiennent dans les entiers reprsents en 32 bits. Le
compilateur a fait un choix diffrent du premier : il fait commencer le programme
ladresse 00 et met la zone de donnes la suite du code.

Figure 416 C et assembleur 68000, exemple 21.
/*Exemple 3: version 68020, 32 bits
Programme C ad contenu mmoire Assembleur 68020

int a,b,c;
2e 0000 0000 _a: dcb.l 1,0
32 0000 0000 _b: dcb.l 1,0
36 0000 0000 _c: dcb.l 1,0

main() _main:
{ 00 4e56 0000 link a6, #-0
a = 2; 04 23fc 0000 0002 0000 002e move.l #2,_a
b = 3; 0e 23fc 0000 0003 0000 0032 move.l #3,_b
c = a+b; 18 2039 0000 002e move.l _a,d0
1e d0b9 0000 0032 add.l _b,d0
24 23c0 0000 0036 move.l d0,_c
} 2a 4e5e unlk a6
2c 4e75 rts
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

28

4.7.1 Modle RISC Load and Store.
La performance en vitesse dexcution est actuellement base sur la recherche de la
simplicit et de la rgularit dans le processeur. Cest une caractristiques des
processeurs RISC : il y a un grand nombre de registres gnraux, trs peu de modes
dadressage mmoire et les accs en mmoire se font indpendamment des
oprations arithmtiques par des instructions de lecture et dcriture appeles load
et store. Les instructions ont toutes la mme longueur.
A partir des annes 80, plusieurs tudes ont montr que la complexit des CISC
(avec la puissance des instructions correspondantes) devenait incompatible avec un
bon niveau de performance. Cest la simplicit et la rgularit, qui avec la
diminution du cot des mmoires, deviennent les critres majeurs. La plupart des
programmes cibles tant gnrs par des compilateurs (et non crits directement en
assembleur), ces tudes ont mis en vidence que, seules 20% des instructions dun
processeur de type CISC sont utilises pendant plus de 80% du temps dexcution
dun programme
La conception des processeurs est revue et les critres pris en compte sont alors :
un jeu rduit dinstructions simples ayant toutes la mme longueur et facilement
dcodables au niveau du processeur ;
un nombre rduit de modes dadressage ;
les accs la mmoire se font uniquement avec deux instructions : load
(transfert de mmoire registre) et store (transfert de registre mmoire) ;
un nombre lev de registres pour diminuer la frquence des changes avec la
mmoire ;
la dcomposition systmatique des instructions en nombre fixe de phases
lmentaires permettant une forme de paralllisme interne avec lexcution de
chacune des phases sur une unit particulire appele tage de pipeline (chapitre
8).
Le Z80 et le 68000 sont des processeurs qui relvent du modle CISC
(Complex Instruction Set Computer), avec la caractristique de possder
beaucoup de modes dadressage, de pouvoir faire un adressage dans les
instructions arithmtiques et logiques et davoir des instructions
longueur variable. Sans faire pour linstant une discussion sur les
raisons de la suprmatie actuelle des processeurs RISC (Reduced
Instruction Set Computer) au niveau de la performance par rapport aux
CISC (chapitre 8), nous donnons maintenant un exemple de modle de
programmation dun processeur RISC.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

29
4.7.1.1 Le processeur MIPS (en version 32 bits).
Prenons le processeur MIPS pour expliciter le modle de programmation dans une
architecture RISC.
Son modle est relativement simple. Il en comporte un ensemble de 32 registres
gnraux nots R0 R31, mais tous ne sont pas indiffremment utilisables. Par
exemple, comme dans la plupart des processeurs RISC, le registre R0, en lecture
seule, est prcbl la valeur 0. Linitialisation 0 dune variable, opration
courante en programmation, est ainsi trs rapide. Le registre R1 est lui rserv
lassembleur.
Les registres ont aussi des petits noms pour une utilisation plus standardise au
niveau logiciel (a0, a7, t0, t7).
Les instructions ont toutes la mme longueur (32 bits). La distinction des
instructions est faite suivant trois types de format. Le format R correspond aux
instructions arithmtiques, le format sappelle R, comme registre, car ces
oprations ne se font que sur des registres.

En 1980, David Patterson, de luniversit de Berkeley, dfinit une architecture de
machine susceptible de rpondre au cahier des charges prcdent. Il lui attribue le nom
de RISC, Reduced Instruction Set Computer, architecture jeu rduit dinstructions. A
partir dtudes statistiques menes sur un grand nombre programmes contemporains et
crits en langage de haut niveau sur les processeurs de lpoque (appels depuis CISC,
Complex Instruction Set Computer), il prend en compte les faits suivants :
linstruction call est celle qui prend le plus de temps (en particulier sur un processeur
VAX, un standard de lpoque et fabriqu par Digital Equipment Corp.) ;
80% des variables locales sont des scalaires ;
90% des structures de donnes complexes sont des variables globales ;
la majorit des procdures ne possdent moins de 7 paramtres (entres et sorties) ;
la profondeur maximale de niveau dappels de procdure est gnralement infrieure
ou gale 8.
Patterson dveloppe ainsi le RISC I, puis le RISC II, projet universitaire qui dbouche
ensuite sur larchitecture SPARC (Scalable Processor ARChitecture) de Sun.
A la mme poque, les chercheurs de luniversit de Stanford, dont les travaux portent
sur le paralllisme et les structures en pipeline, proposrent la machine MIPS (Machine
without Interlocked Pipeline Stages). Lide matresse de John Hennessy, le pre du
MIPS, est de mettre en vidence dans le jeu dinstruction toutes les activits du
processeur qui peuvent affecter les performances afin que les compilateurs puissent
rellement optimiser le code. John Hennessy fonde ensuite la socit MIPS. Ce
processeur est utilis dans les stations de travail SG (Silicon Graphix).

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

30
Figure 417 Registres gnraux du processeur MIPS.
Le format I correspond aux instructions immdiates (oprande immdiat), de
transfert et branchement et le format J correspond aux instructions de saut.
Figure 418 Formats dinstructions du processeur MIPS.
Les instructions de format R.
Les instructions arithmtiques nont que des registres en arguments (pas de
variables en mmoire). Le premier argument est le registre destination et les deux
suivants sont les oprandes sources. Par exemple, une addition sera dcrite par :
add $s0, $s1, $s2 ce qui revient faire lopration $s0 = $s1 + $s2
($ est un caractre de spcification de registre).
Les instructions de format I.
Linterprtation des 3 arguments est dpendante du code opratoire. Dans le cas
dune addition nous aurons par exemple
R0 zro constante 0 R16 s0 callee saves
R1 at reserved assembler . lappel doit sauvegarder
R2 v0 valuation dexpression et R23 s7
R3 v1 rsultat de fonction R24 t8 temp.
R4 a0 arguments R25 t9
R5 a1 R26 k0 rserv OS
R6 a2 R27 k1
R7 a3 R28 gp pointeur de zone globale
R8 t0 temp. Appelant sauvegarde R29 sp stack pointer
. lappel peut craser R30 fp frame pointer
R15 t7 R31 ra adresse retour (hw)
Code
fonction
Shift
amount
rg arg#3 rg arg#2 rg arg#1 000000
5 0 10 6 15 11 20 16 25 21 31 26
Code
fonction
Shift
amount
rg arg#3 rg arg#2 rg arg#1 000000
5 0 10 6 15 11 20 16 25 21 31 26
Adresse ou
valeur immdiate
rg arg#2 rg arg#1 OpCode
0 15 20 16 25 21 31 26
Adresse ou
valeur immdiate
rg arg#2 rg arg#1 OpCode
0 15 20 16 25 21 31 26
adresse cible OpCode
5 0 10 6 15 11 20 16 25 21 31 26
adresse cible OpCode
5 0 10 6 15 11 20 16 25 21 31 26
Format R
Format I
Format J
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

31
addi $v0, $zero, 1 ce qui revient de mettre 1 le registre $v0. $v0 est
loprande destination, $zro (R0) est un registre source et 1 est une valeur
immdiate (une constante).
Dans le cas dune instruction de branchement conditionnel, les deux registres font
lobjet de la comparaison de dcision pour le branchement et le dernier champ
donne ladresse de dbranchement sous la forme dun offset.. Par exemple,
linstruction :
bne $t3, $zero, label0 fait le branchement ltiquette label0 si le contenu
de $t3 est diffrent de 0 (bne = branche if not equal). On remarque quil ny pas de
registre de drapeaux mis jour automatiquement par lUAL : linstruction fait la
comparaison et le saut ( la diffrence du Z80 et du 68000 vus prcdemment).
Le format I comporte galement les deux seules instructions de transfert mmoire /
registres. Linstruction load, note lw, effectue un chargement depuis la mmoire
vers un registre ; linstruction store , note sw, se charge du rangement dun
registre vers la mmoire. Linstruction :
lw $t0, 48($t1) est quivalente t0 = mem[ t1 + 48 ]. Le registre t0 est le
registre de destination (chargement, load, lecture), t1 est un registre source auquel
on ajoute la valeur immdiate 48 pour obtenir ladresse mmoire do se fait le
chargement.
sw $t0, 48($t1) est une instruction de rangement du registre t0 vers la
mmoire.
Les instructions de format J.
Linstruction caractristique du format J est linstruction de saut (goto). Elle se
prsente sous la forme j tiquette, o tiquette est une adresse sur 26 bits.
Les modes dadressage.
Il y a quatre modes dadressage pour le processeur MIPS. Dans ce domaine
galement cest la simplicit qui prime, do ce faible nombre de modes
dadressage.
Ladressage par registre : cest ladressage le plus simple et le plus efficace :
loprande de linstruction est contenu dans le registre dsign.
add $s0, $s1, $s2 est une instruction dont les paramtres sont des noms de
registres, loprande est dans le registre dsign.
Ladressage immdiat : cest un adressage o loprande est une constante
directement donne dans linstruction.
addi $v0, $zero, 1 est une instruction adressage immdiat dans le cas du
dernier paramtre, la valeur du paramtre est loprande.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

32
Ladressage index ou adressage avec dplacement : loprande se trouve
lemplacement mmoire dadresse gale au contenu dun registre ajout un
dplacement contenu dans linstruction elle-mme.
lw $t0, 24($t1) correspond au chargement dun lment en mmoire qui se
trouve ladresse contenue dans le registre t1 laquelle est ajoute la constante 24.
Le dplacement peut aussi tre fait par rapport au compteur de programme PC.
---- revoir les notations valeurs, rfrences, pointeurs ----
Les appels de procdures.
Il y a deux instructions pour grer les appels de
procdures. Pour les comprendre, il faut avoir
lesprit que le paradigme RISC est bas sur une
utilisation maximale des registres au dtriment de
la mmoire et en particulier de la pile. Cest donc
au programmeur (ou plutt au compilateur) de
grer le problme de lcrasement de ladresse de
retour, dans un registre libre. Ce nest que
lorsquil ny a plus de registres de libre que le
mcanisme de la pile en mmoire est mis en
uvre. Linstruction jal proc1 (jump and link) de
fait le dbranchement vers ladresse proc1 de
dbut de la procdure et mmorise ladresse de
retour dans le registre ra (return address ou R31).
La procdure se termine par linstruction jr (jump
register) avec comme argument ra : jr $ra.
procA :

jal procB

procB

sub $sp, $sp, 4
sw $ra, 0($sp)
jal procC
lw $ra, 0($sp)
add $sp, $sp, 4

jr $ra
procC


jr $ra
Figure 419 Procdures MIPS.
On peut penser que cette programmation est plus difficile pour un programmeur que
dans le cas dun processeur CISC o il suffit dappeler les instructions call et ret.
Cest effectivement le cas, les RISC sont conus avec un jeu rduit dinstructions plus
simples, la programmation est donc plus laborieuse. Il faut aussi tenir compte dune
autre volution, celle des compilateurs. A la pleine poque du CISC, on pensait que la
programmation la plus efficace en temps dexcution tait la programmation en
assembleur : un compilateur de langage volu apport ant de son cot une surcharge en
code au programme assembleur gnr automatiquement.
Les processeurs RISC sont conus avec lhypothse cest le compilateur, qui avec des
possibilits doptimisation, qui est le mieux mme de gnrer un programme optimal
vis --vis du processeur. Au programmeur est laiss le dveloppement dune application
avec un langage de haut niveau, et on laisse au bon soin du compilateur de traduire le
plus efficacement possible ce programme en langage assembleur. Finalement, la
lisibilit nest pas un critre fondamental. Patterson donne des exemples o un
programme C est plus rapide quun programme directement crit en assembleur. La
plupart des compilateurs C, C++ actuels sont rellement performants du point de vue de
lefficacit du code cible.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

33
Lexemple de la figure 4-20 illustre les appels de procdure MIPS. La procdure A
fait appel la procdure B. Supposerons quau moment de cet appel toutes les
sauvegardes ncessaires sont faites. Linstruction jal procB fait la sauvegarde de
ladresse de retour dans le registre $ra. La procdure B, aprs un certain nombre
dinstructions, appelle la procdure C. Mais avant cet appel, il est ncessaire de
sauvegarder le registre $ra, sinon ladresse de retour de B est perdue. Dans cet
exemple, la sauvegarde est faite dans la pile (elle aurait pu tre faite dans un autre
registre libre). La gestion de la pile nest pas automatique, elle est de la
responsabilit du programmeur. La premire instruction dcrmente le pointeur de
pile pour accueillir une adresse sur 32 bits. Aprs lajustement du pointeur de pile,
le registre $ra est rang au sommet de la pile. Lappel la procdure C peut alors
tre fait en toute scurit pour le retour ultrieur la procdure A (instruction jr $ra
la fin de la procdure B).
La procdure C ne faisant aucun appel de procdure, il ny a pas de sauvegarde
faire et dans ce cas on gagne le temps dune sauvegarde automatique inutile.
4.7.2 Procdures et passage de paramtres.
La procdure est, nous lavons introduit ainsi, le premier niveau de structuration
dun programme et elle requiert pour son utilisation, une encapsulation dun
ensemble dinstructions correspondant la rsolution dune fonction dtermine.
Dune certaine manire la procdure est aussi isole ou protge du reste du
programme. Elle peut avoir des variables internes de travail non visibles
lextrieur qui sont les variables locales aussi appeles prives. Par contre, il faut
bien sr, pour que la procdure serve quelque chose, pouvoir lui transmettre des
donnes et pouvoir rcuprer les rsultats de la fonction. On parle alors de passage
de paramtres, avec les paramtres dentres et les paramtres de retour.
Pour effectuer ce passage, diffrentes techniques sont possibles. Nous allons en
dcrire quelques unes et les illustrer avec les deux modles de programmation que
nous venons de voir, celui du 68000 et celui du MIPS.
Une des techniques la plus simple consiste transmettre les donnes de manire
implicite : ce sont les variables globales. Les variables sont en mmoire centrale
avec une adresse statique (fixe) et rendue visible toutes les procdures. On utilise
alors simplement les variables sans les dclares lintrieur de la procdure. Cette
technique est assez dangereuse car nimporte quelle procdure peut modifier la
variable, sans parler du fait quune variable globale est potentiellement, dans un
systme multitche, une ressource critique et doit tre traite en tant que telle
laide des mcanismes dexclusion mutuelle. Cette technique est vivement
dconseille par tous les guides de programmation et doit tre rserve des
situations exceptionnelles. Alors, promis et jur, nous le ferons quune seule fois,
juste pour voir

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

34

La technique classique est de mnager une ouverture autorise, une sorte de
guichet de dpt ou de retrait. Dans la plupart des langages de programmation ce
guichet est symbolis par une liste de noms de paramtres mise entre deux
parenthses aprs le nom de la procdure : somme (a, b, c). Dans certains cas la
distinction est nette entre paramtres dentres et paramtres de sortie et lorsquil y
a un paramtre de sortie considr comme principal, la procdure renvoie une
valeur. Cest une fonction utilisable dans une expression comme une variable ou un
lment de tableau. Dans notre exemple, nous utiliserons la fonction som qui
applique aux paramtres a et b renvoie la valeur c : c = som (a,b).
La notation prcdente avec les parenthses existe dans l es langages de haut
niveau, mais pas au stade du modle de programmation du processeur.
Pour lassembleur, le nom de la procdure nest ni plus ni moins quune simple
tiquette, c'est--dire une adresse. Il faut passer des paramtres entre lappelant et
lappel et vice versa. Par o et comment passent alors les paramtres ? Par o ? Le
paramtre est mis dans une unit de stockage : cest en mmoire centrale, dans la
pile ou dans les registres
2
.
Passage par les registres : cest le passage le plus rapide, mais il est limit par
le nombre de registres disponibles. Le paramtre est rfrenc par le nom du
registre.
Passage par la pile : le paramtre est rfrenc en dynamique par rapport au
pointeur de pile, mais la donne est en mmoire centrale. Le passage est moins
rapide que par les registres, mais il ny a pas de limitation en nombre de
paramtres.
Passage par rfrence explicite de la variable : cest de fait une technique de
variable globale.
Comment passer le paramtre ?
Le paramtre est pass par valeur, dans ce cas on transmet une
copie de la donne et loriginal reste intact dans le programme
appelant. Le paramtre ne peut tre que lu dans la procdure
appele.
Le paramtre est pass par rfrence, autrement par son adresse et
dans ce cas le paramtre peut tre lu et modifi. Tout paramtre
de sortie doit tre pass par rfrence. Dune certaine manire, le
passage par rfrence revient rendre partiellement globale la
variable, do des dangers quivalents ceux des variables
globales.

2
Il existe une technique variante du passage par registre qui utilise le renommage de
registre avec une gestion de fentre de registres (processeur SPARC de Sun et Itanium de
Intel et HP). Nous la traiterons part.

Procdure
Epargner
1 entre,
pas de sortie !,
objet tire-lire
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

35
Variables locales et r -entrance.
La r-entrance est la proprit que doit prsenter une procdure pour tre appelable
plusieurs fois sans que les excutions prcdentes soient termines. Cest le cas des
bibliothques de procdures dans les systmes multitches o un mme code est
appel diffrents moments par plusieurs applications. Dans ce cas, chaque
instance dexcution de la procdure doit travailler sur une zone de donnes
diffrente, gre idalement en mettant toutes les donnes locales dans la pile.
Dans les exemples qui suivront, nous aurons une illustrations de ces diffrents
points : variable globale, variable locale, diffrentes techniques de passage de
paramtres.
Les procdures et le 68000 (variables locales, pile, instructions Link et
Unlink).
Les concepteurs du processeur 68000 ont introduit linstruction link pour faciliter
la mise en uvre de lallocation dynamique de mmoire pour les variables locales
une procdure. Linstruction est relativement complexe et demande quelques
explications.
La valeur du pointeur de pile est prise lentre de la procdure. A partir de cette
valeur on peut rserver une zone pour la dclaration des variables locales, place qui
sera rcuprable la sortie de la procdure. Comme nous lavons dj indiqu
(section 4.7, Exemple 2), le pointeur de pile ne peut pas servir de rfrence aux
variables car il est amen voluer dans la suite de lexcution de la procdure. La
valeur originelle du pointeur de pile est mmorise dans un registre dadresse qui
sert ensuite dadresse de base pour les variables locales.
Linstruction Unlink, utilise la fin de la procdure, libre la zone en remettant
simplement le pointeur de pile sa valeur initiale davant la rservation.
Lexemple de la figure 4-20 donne une version des programmes prcdents o
laddition est faite dans une fonction charge de laddition de deux entiers
(fonction som en C et procdure _som en assembleur). Lexemple na videmment
quune valeur illustrative
3
du principe de passage de paramtres avec un cas
simple.
Le dbut du programme reste identique pour laffectation des constantes 2 et 3 aux
variables a et b. Ces dernires, paramtres de la procdure som, sont passes par la
pile. Rappelons que le registre A7 est le registre pointeur de pile, aussi appel USP.
Linstruction de prparation du passage move b, -(A7) utilise ladressage indirect
sur registre dadresse avec pr-dcrmentation : le pointeur de pile est dcrment

3
Dans ce cas et dun point de vue efficacit, il serait un peu abusif dutiliser rellement une
telle procdure puisque cela consis terait remplacer les 3 instructions de laddition
originelle par les mmes plus un surcot de 8 instructions ncessaires pour la mise en
uvre de la procdure.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

36
de la taille de b (2 octets), puis b est
rang ladresse mmoire pointe
par A7. La mme opration de
transfert dans la pile est avec a :
avant lappel la procdure (jsr
_som) la variable a est en sommet
de pile et b juste derrire. Les
variables a et b sont donc des
paramtres passs par valeur.
Voyons maintenant le corps de la
procdure. Dans la fonction C,
nous avons dclar, alors quelle
nest pas utile, une variable locale
(int k) afin de voir lutilisation
conjointe de la pile pour le passage
de paramtres et le stockage dune
variable locale. Lors de lappel,
linstruction jsr sauvegarde en
sommet de pile ladresse de retour
et le pointeur de pile est diminu de
la taille de ladresse. A lentre de
la procdure, une rservation de 2
octets est faite en sommet de pile
pour accueillir la variable k et la base de la zone mmoire de stockage dynamique
est mmorise dans le registre A6.
Dans le corps de la procdure, les variables et paramtres peuvent maintenant tre
rfrences par rapport cette base fixe dans la pile. Examinons maintenant la
prparation de laddition.
Linstruction move.w 8(A6)
met a dans le registre D0. A6
vaut 1008 et le dplacement
de 8 fait remonter dans la pile
ladresse 1016 qui est
ladresse o a a t empile.
Linstruction suivante fait
laddition D0 du contenu de
(A6 + 10) qui est ladresse de
la valeur de b dans la pile. Le
rsultat est rang dans la
variable locale ( -2 par
rapport A6). La procdure
est construite comme une
fonction et renvoie sa valeur
@
10
contenu pile
SP anc 1020 ---------------
move
w
b, -(A7) 1019 valeur de b
1018 valeur de b @dpil. de b
move
w
a, -(A7) 1017 valeur de a
1016 valeur de a @dpil. de a
jsr _som 1015 @ retour
1014 @ retour
1013 @ retour
1012 @ retour @dpil. @ret
Link A6, #-2 1011 A6 Sauveg. de A6
1010 A6
1009 A6
@dpil. A6 1008 A6 et A6 1008
1007 local k
SP nouv 1006 local k @ . de k
Figure 421 Som 68000 , la pile
int a,b,c;
_a: ds.b 2
_b: ds.b 2
_c: ds.b 2
int som (a, b)
{
_som: link A6,#-2
int k;
k= a+b;
move.w 8(A6),D0
add.w 10(A6),D0
move.w D0,-2(A6)
return k;
move.w -2(A6),D0
} unlk A6
rts
main ()
{ _main:
link A6,#0
a = 2;
move.w #2,_a
b=3;
move.w #3,_b
c = som (a,b); ----------------------
move.w _b,-(A7)
move.w _a,-(A7)
jsr _som
add.l #4,A7
move.w D0,_c
} unlk A6
rts
Figure 420 Som 68000 .
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

37
via le registre D0 (au retour de la procdure som, la procdure main transfre le
contenu de D0 ladresse de la variable c.)
La dernire instruction, Unlink, libre la place rserve pour la variable locale : le
pointeur de pile est remis 1012, c'est--dire la valeur quil avait avant cette
rservation. Linstruction rts rcupre ladresse de retour dans la pile et remonte le
pointeur de pile sa valeur davant lappel de procdure (1016).
Dernier point : quel est le rle de linstruction add.l #4, A7 ? On remarque quavant
lappel la procdure, il a fallu rserver 4 octets dans la pile pour le passage des
paramtres a et b. Lajout de 4 A7 revient remonter le pointeur de pile de 4, ce
qui libre la place correspondante. Cette libration est indispensable, sinon,
chaque appel de la procdure la pile crot dautant jusqu son dbordement (stack
overflow) par rapport la taille initialement rserve pour elle.
Version Pentium Intel.
Le modle de programmation du Pentium est, quelques diffrences mineures
prs, celui du processeur 386, premier 32 bits de la famille de processeurs x86
dIntel. Ce modle est relativement complexe
4
: les registres sont spcialiss pour
tenir compte de la gestion par segmentation de la mmoire. ce stade, seuls les
registres et les instructions requis pour la comprhension de lexemple sont dcrits.
Les registres dits gnraux sont des hritages en longue filiation du 8080 : les
registres 8 bits A, B et C sont devenus les registres 16
bits AX, BX et CX du 8086 (x comme extension) puis
EAX, EBX et ECX (e comme extension) 32 bits du 386.
Ces registres servent aux oprations classiques, mais ne
sont pas tous indiffrents vis--vis des instructions qui
les utilisent. Le registre ESP est le pointeur de pile et le
registre EBP (base pointer) est le pointeur de base dans
la pile pour rfrencer les variables locales. EIP
(extended instruction pointer) est le compteur de
programme.
Ces processeurs ont des instructions spcifiques pour la
manipulation de la pile : push est linstruction empiler
et pop celle qui dpile.
Par rapport au 68000, les paramtres sources et
destinations sont inverss
5
. Une instruction mov

4
Les processeurs de la famille x86, du 80386 au Pentium, font partie dune architecture
maintenant appele IA32 par Intel, sont laboutissement (et probablement la fin) de
larchitecture CISC. Le processeur va jusqu contenir des lments du noyau dun systme
dexploitation.
5
Les deux constructeurs Intel et Motorola ont souvent pris de conventions inverses lune de
lautre : reprsentation little endian, modle de mmoire segment, oprande destination
31 0
EAX
ESP
EBX
ECX
EDX
ESI
EDI
EBP
EIP
EFlags
31 0
EAX
ESP
EBX
ECX
EDX
ESI
EDI
EBP
EAX
ESP
EBX
ECX
EDX
ESI
EDI
EBP
EIP
EFlags
EIP
EFlags
Figure 422 Registres du
Pentium.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

38
arg1_dest, arg2_src se lit comme
transfrer dans arg1 depuis arg2.
Dans la procdure main, le
compilateur a rserv 12
emplacements pour les 3 variables
a, b et c (3 entiers 32 bits). Les
variables a et b sont mises 2 et
3 comme dans le programme du
68000. Le code binaire, rajout
comme un commentaire dans le
programme, montre que la
constante 2 est reprsente en little
endian, c'est--dire 02 00 00 00.
Pour notre lecture classique des
entiers, il faut intervertir les 2
mots de 16 bits et les 2 octets
lintrieur du mot. Les paramtres
a et b sont passs par valeur dans
la pile : copie depuis la zone locale
vers le registre EAX puis EAX est
copi dans la pile.
Aprs lappel de la procdure som,
la place utilise dans la pile pour
les deux arguments est libre
en additionnant 8 au pointeur
de pile. Le rsultat de la
fonction est pass par le registre EAX et ensuite transfr dans la variable c. La
valeur initiale du pointeur de pile, mmorise au dbut dans EBP, est restitue ;
EBP est ensuite dpil pour retrouver sa valeur initiale. La procdure main effectue
ainsi son retour au programme appelant, c'est--dire le systme dexploitation.
Le mme mcanisme de gestion de la pile est aussi utilis dans le corps de la
procdure som. Les paramtres sont passs par la pile : ils sont rfrencs en positif
par rapport EBP qui est la copie du pointeur de pile en entre de procdure. La
variable locale est dans la nouvelle zone alloue est et donc rfrence en ngatif (-
4) par rapport la base EBP. Le rsultat de laddition est retourn par le registre
EAX.
Le principe gnral reste trs voisin de celui vu, en dtail, pour le 68000.

depuis source, ordre de priorit par nombre dcroissant pour Intel ; big endian, modle de
mmoire linaire, oprande source vers destination, ordre de priorit par nombre
dcroissant pour Motorola,
Figure423 som pentium .
_main PROC NEAR
push ebp
mov ebp, esp
sub esp, 12

mov DWORD PTR -4[ebp], 2
;00006 c7 45 fc 02 00 00 00 ;
mov DWORD PTR -8[ebp], 3
mov eax, DWORD PTR -8[ebp]
push eax
mov ecx, DWORD PTR -4[ebp]
push ecx
call _som
add esp, 8
mov DWORD PTR -12[ebp], eax

mov esp, ebp
pop ebp
ret 0

_som PROC NEAR
push ebp
mov ebp, esp
sub esp, 4

mov eax, DWORD PTR 8[ebp]
add eax, DWORD PTR 12[ebp]
mov DWORD PTR -4[ebp], eax

mov eax, DWORD PTR -4[ebp]
mov esp, ebp
pop ebp
ret 0
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

39
La version MIPS.
Le processeur MIPS privilgie les registres par rapport la pile (mmoire). Les
registres sont visibles de la procdure appelante et de la procdure appele.
Autrement dit, les procdures partagent les mmes registres qui jouent le rle de
variables globales. Cette situation, par ailleurs valable pour tous les processeurs,
impose que la procdure appele sauvegarde les registres quelle modifie de
manire ce que lappelante puisse rcuprer les registres dans ltat o elle les
avait laisss. Cette technique, si elle est sre, peut amener faire beaucoup de
sauvegardes inutiles. Dans lassembleur du MIPS, une convention dutilisation des
registres a t dfinie pour rpartir le travail de sauvegarde entre lappelante et
lappele. Le respect de ces conventions permet de compiler sparment les
procdures. Attention : cette convention nest
pas une proprit du processeur, mais une
caractristique dun compilateur ou dune
famille de compilateurs.
Le passage de paramtres : lappelante
passe les 4 premiers paramtres de la
procdure appele par les registres $a0
$a3 (R4-R7). Sil y a plus de paramtres, il
faut les passer par la pile. Les registres $v0
et $v1 (R2, R3) servent retourner les
valeurs des procdures fonctions.
Les variables temporaires de lappele sont
mises dans les registres $t0 $t9.
Lappele utilise comme elle veut ces
registres : si ncessaire, ils sont
sauvegards par lappelante.
Les registres $s0 $s7 sont sauvegards, le
cas chant, par lappele.
Le registre $sp (R29) est le pointeur de pile
et $bp (R30) le pointeur de cadre (ou de
bloc) utilis en gnral pour les variables
locales.
Le programme.
Au premier abord, le programme est
nettement plus long, au sens o il comporte
bien davantage de lignes dinstruction que les
versions CISC prcdentes. Les procdures
main et som ont des prologues et des
pilogues pour la gestion de la pile en entre et
en sortie de procdure. La dcrmentation du
pointeur de pile nest automatique : $sp est
som:
subu $sp, $sp,32
sw $fp, 8($sp)
move $fp, $sp
sw $a0, 16($fp)
sw $a1, 20($fp)
lw $v1, 16($fp)
lw $v0, 20($fp)
addu $v0, $3,$2
sw $v0, 0($fp)
lw $v0, 0($fp)
move $sp, $fp
lw $fp, 8($sp)
addu $sp, $sp,32
j $ra

main:
subu $sp, $sp,40
sw $ra, 36($sp)
sw $fp, 32($sp)
move $fp, $sp
li $v0, 12
sw $v0, A
li $v0, 13
sw $v0, B
lw $a0, A
lw $a1, B
jal som
sw $v0, C
move $sp, $fp
lw $ra, 36($sp)
lw $fp, 32($sp)
addu $sp, $sp,40
j $ra

.comm A,4
.comm B,4
.comm C,4
Figure 424 som MIPS .
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

40
dcrment de 40 pour prparer les sauvegardes et la place pour les variables
locales dans le bloc point par $fp. Ladresse de retour et le pointeur de cadre sont
sauvegards. On remarque que ladresse de retour nest pas sauvegarde dans le
prologue de som : la procdure est une procdure dite feuille , c'est--dire
quelle ne contient pas dappel de procdure et le registre $ra na pas besoin dtre
sauvegard.
Les corps des procdures main et som sont assez simples lire. Les donnes sont
transmises et rcupres par les registres $a0 et $a1 et le rsultat de la somme est
retourn par le registre $v0. On notera galement, qu la fois dans main et dans
som, il y a manifestement du code inutile. Ceci est du au fait que le compilateur a
fait une traduction standard sans la moindre optimisation.
La version SPARC.
Le SPARC est un processeur RISC conu, dans les grandes lignes, suivant des
principes voisins ceux du MIPS. Beaucoup dinstructions sont donc trs
semblables. Loriginalit du SPARC rside dans la manire dont grs les registres,
en particulier pour les appels de procdures. Partant dhypothses dj donnes sur
le nombre moyen de paramtres en entre et en sortie dune procdure et sur le
niveau de profondeur moyen dappels de procdure, le SPARC offre chaque
procdure, lors de son appel, un ensemble de 32 registres logiques une fentre
(fentre glissante) sur un ensemble plus consquent (par exemple 128) de registres.
Sur les 32 registres vus par une procdure, il y a :
8 registres globaux, %g0 %g7, qui sont vus par toutes les procdures. Ils
peuvent contenir des variables globales. Ces registres globaux sont donc pour
ainsi dire dans une fentre fixe. %g0 est cbl la valeur 0.
Les 24 autres registres constituent la fentre glissante et qui va changer dun
appel de procdure lautre. Lobjectif recherch par ce mcanisme de
fentrage est triple :
isoler et protger les variables locales propres une procdure ;
permettre une communication pour passer des paramtres entre les
procdures et
garder le lien dans les appels pour le retour lappelant.
Les 24 registres se rpartissent en trois catgories, certains parmi eux jouent un rle
particulier.
8 registres dentres, %i0 %i7, destins contenir les paramtres entrants de
la procdure laquelle est associe la fentre. Le registre %i0 est en gnral
aussi utilis pour retourner une valeur dans le cas dune procdure appele de
type fonction.
8 registres locaux, %l0 %l7, destins contenir les variables locales de la
procdure laquelle la fentre est associe.
8 registres de sortie, %o0 %o7, destins contenir les paramtres sortants de
la procdure. Le registre %o6 est le pointeur de pile, dsign galement par
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

41
%sp, courant de la procdure appelante. Dans la procdure appele, il sappelle
%i6 devient le pointeur de cadre %fp de la procdure appele. fp est le pointeur
de base servant de rfrence dans la pile pour la procdure courante (quivalent
du registre intervenant dans linstruction link du 68000).
La fentre glissante procde par recouvrement
: 8 registres sont en recouvrement pour deux
procdures conscutives de manire ce que
les paramtres sortants, %o0 %o7, de la
procdure appelante soient en correspondance
avec les paramtres entrants, %i0 %i7, de
la procdure appele.
Lorsquune fentre est en position pour une
procdure donne et dfinie dans le registre
CWP (Current Window Pointer), lappel
dune nouvelle procdure fait glisser la
fentre de 16 registres, laissant 8 registres
physiques en commun et en protgeant les
variables locales de la procdure appelante
en les rendant invisibles. Le registre CWP
est modifi en consquence.
Instructions dappel de procdure.
Dune manire gnrale, les instructions de saut du SPARC sont retardes : elles
sont suivies dune instruction vide nop. Cest le bon fonctionnement du pipeline du
processeur qui impose cette rgle de programmation. Ce point sera repris dans le
chapitre 8.
Les instructions de gestion des procdures ont des particularits lies au
mcanisme de fentre glissante.
Linstruction call label ralise un
saut inconditionnel ltiquette
label, mais avant que le saut ne soit
rellement fait, la valeur courante
(celle de linstruction call) du
compteur de programme %pc est
mmorise, non pas dans la pile,
mais dans le registre %o7 de la
fentre en cours au moment de
lappel.
Linstruction ret nexiste pas (sauf
sous la forme dune macro) et le
retour se fait par une instruction de
saut jmpl (JuMP and Link) avec lien
global
%g0 - %g7
in
%i0 - %i7
local
%l0 - %l7
out
%o0 - %o7
mapping
CWP
Procdure courante
2
4
r
e
g
i
s
t
r
e
s
1
2
8

r
e
g
i
s
t
r
e
s

p
h
y
s
i
q
u
e
s
global
%g0 - %g7
in
%i0 - %i7
local
%l0 - %l7
out
%o0 - %o7
mapping
CWP
Procdure courante
2
4
r
e
g
i
s
t
r
e
s
global
%g0 - %g7
in
%i0 - %i7
local
%l0 - %l7
out
%o0 - %o7
mapping
CWP
Procdure courante
2
4
r
e
g
i
s
t
r
e
s
1
2
8

r
e
g
i
s
t
r
e
s

p
h
y
s
i
q
u
e
s
global
%g0 - %g7
out
%o0 - %o7
Procdure appelante
2
4
r
e
g
i
s
t
r
e
s
in
%i0 - %i7
local
%l0 - %l7
out
%o0 - %o7
mapping
Procdure appele
CWP
global
%g0 - %g7
out
%o0 - %o7
Procdure appelante
2
4
r
e
g
i
s
t
r
e
s
in
%i0 - %i7
local
%l0 - %l7
out
%o0 - %o7
mapping
Procdure appele
CWP
Figure 425 Fentre glissante.
Figure 426 Fentre de registres SPARC.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

42
ralise un saut ladresse indique en paramtre et recopie la valeur courante de
%pc dans le registre de destination : jmpl adresse, regdest. La macro ret trouv
dans un programme en assembleur SPARC est quivalente jmpl [%i7 + 8], %g0 .
Au moment de lappel, la valeur courante du compteur de programme est copie
dans %o7 et au moment du retour cette valeur est accessible dans %i7. La valeur
+8 provient du fait que la valeur de %pc sauvegarde est celle de linstruction
dappel (et non linstruction suivante comme dans les CISC) et quune instruction
de saut, y compris un call, est suivie par une instruction nop. La prochaine
instruction excute au retour est donc +8 par rapport lappel. jmpl mmorise
ladresse courante (dernire instruction de la procdure appele) dans %g0, mais
ntant pas utilise elle pourra tre perdue.
Lors dun appel de procdure, rien nest fait automatiquement, en dehors du saut et
la mmorisation du %pc courant. Il faut explicitement effectuer le glissement de la
fentre et revenir la situation initiale avant le retour lappelant.
Linstruction save %sp, taille, %sp est quivalente une addition de la taille au
registre %sp avec en parallle une dcrmentation du registre CWP de 1. Ce
dplacement de la fentre revient sauver les registres de lappelant. La
modification de %sp dcale dautant le sommet de pile et correspondant une
rservation de place taille mots dans la pile pour dventuelles sauvegardes. Le
premier paramtre %sp est le pointeur de pile de la procdure appelante. Au cours
de lexcution de linstruction save le pointeur de pile change : le dernier paramtre
%sp est de fait le pointeur de pile dans la fentre de la nouvelle procdure.
Linstruction restore fait lopration inverse de save. La position de cette
instruction est dans le delay slot cest dire juste aprs linstruction de saut ret
(impos par le pipeline).
Linstruction sethi.
Toutes les instructions font 4 octets, cela pose donc des problmes pour manipuler
dans certains cas un adressage de 32 bits. Ladresse 32 bits est dcompose en
deux parties : la partie haute de 22 bits et la partie basse de 10 bits. Les oprateurs
hi (high) et lo (low) permettent dextraire ces deux champs partir dune adresse
complte. Linstruction sethi permet de positionner une valeur donne les 22 bits
dun registre destination.
Le programme.
Le programme main est une procdure qui se voit affecte une fentre de registre
avec une rservation de place dans la pile pour dventuelles sauvegardes. Ce sont
les trois instructions sethi, mov, st qui effectuent cette tche. Les 22 bits de poids
fort de ladresse de a sont mis dans %o0 par linstruction sethi, les 10 bits de poids
faible sont 0. La valeur 2 est range dans le registre dans le registre %o1 par
linstruction mov. Linstruction st range le contenu du registre %o1 (valeur 2)
ladresse pointe par le registre %o0 auquel il faut ajouter les 10 bits de poids
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

43
faible de ladresse de a. Le mme
travail est effectu pour laffectation
de la valeur 3 b.
Les 4 instructions qui suivent font le
passage de paramtres par les registres
out (%o0 et %o1) de la fentre du
main, registres qui deviendront les
registres in (%i0 et %i1) de la
procdure appele som. Le passage de
paramtre est fait par pointeur : ce
sont les adresses des variables a et b.
La technique de dpt dune adresse
dans un registre est la mme que pour
les affectations prcdente (sethi).
Linstruction call doit tre suivie
dune instruction vide (nop). Au
retour de lappel, la procdure
fonction renvoie la valeur du rsultat
dans le registre %o0, valeur que la
procdure som aura mise dans son
registre %i0. Le rsultat de la somme
est enfin rang ladresse de la
variable c.
Dans la procdure som, une nouvelle
fentre de registre est affecte avec
galement une rservation de place dans la pile pour des variables locales ou
dventuelles sauvegardes. La zone de variables locales est rfrence par rapport
au frame pointer %fp. Le compilateur se sert ainsi de deux emplacements dans la
zone locale (%fp +68 et +72) pour rcuprer les valeurs des variables partir des
adresses passes en paramtres et obtenues dans les registres in (%i0 et %i1).
Laddition est faite, le rsultat est mis dans %o0. Ce rsultat est rang dans la
variable locale k dont ladresse est rfrence par rapport au pointeur de cadre fp,
puis est mis dans le registre %i0 pour tre rcuprable par la procdure appelante
aprs le restore et le return (linterversion constate des deux instructions est
galement imputable la gestion interne du pipeline).




Exemple avec un compilateur qui optimise. Exemple Power PC G4
som:
save %sp,-120,%sp
st %i0, [%fp+68]
st %i1, [%fp+72]
ld [%fp+68],%o0
ld [%fp+72],%o1
add %o0,%o1, %o0
st %o0, [%fp-20]
ld [%fp-20],%o0
mov %o0,%i0
ret
restore

main:
save %sp,-112,%sp
sethi %hi(a), %o0
mov 2, %o1
st %o1, [%o0+%lo(a)]
sethi %hi(b), %o0
mov 3, %o1
st %o1, [%o0+%lo(b)]
sethi %hi(a), %o0
sethi %hi(b), %o1
ld [%o0+%lo(a)],%o0
ld [%o1+%lo(b)],%o1
call som
nop
sethi %hi(c), %o1
st %o0, [%o1+%lo(c)]
ret
restore
Figure 427 som SPARC.
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

44
Pour terminer ce panorama de traduction de programma C vers un assembleur,
nous illustrerons un travail doptimisation de code fait par le compilateur. Tous les
compilateurs modernes, quels que soient les processeurs peuvent raliser des
optimisations efficaces. Nous profitons de ce denier exemple pour prsenter le bout
de code obtenu pour le processeur PowerPC G4 (Motorola, IBM, base installe
Mac Apple).
Comme pour la version MIPS, les registres sont largement utiliss. Laffectation
des variables est faite comme dans les autres versions de programmes.


Figure 428 Registres gnraux du processeur MIPS.

Par contre loptimisation faite est assez intressante : dans le main il ny a plus
dappel la procdure som. Le compilateur sest aperu dune part que les deux
valeurs passes la procdure sont des constantes (2 et 3) et, dautre part que la
procdure som ne fait que laddition de ces deux paramtres.
En conclusion, le compilateur affecte la valeur 5 directement, ou dit autrement : le
programme ne sert rien
_main:
mflr r3
li r10,2
bcl 20,31,L1$pb
L1$pb:
li r0,3
mflr r2
li r4,5
addis r11,r2,ha16(L_a$non_lazy_ptr-L1$pb)
addis r7,r2,ha16(L_b$non_lazy_ptr-L1$pb)
mtlr r3
lwz r8,lo16(L_a$non_lazy_ptr-L1$pb)(r11)
lwz r6,lo16(L_b$non_lazy_ptr-L1$pb)(r7)
addis r5,r2,ha16(L_c$non_lazy_ptr-L1$pb)
lwz r2,lo16(L_c$non_lazy_ptr-L1$pb)(r5)
stw r10,0(r8)
stw r0,0(r6)
stw r4,0(r2)
blr


_som:
add r3,r3,r4
blr
.comm _a,4
.comm _b,4
.comm _c,4
O est
passe ma
somme ?
CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

45







Little/ Big Endian Boutien ou boutiste : on na pas f ini den voir le bout.

Les termes Little et Big Endian furent utilises avec une consonance ironique dans un article rest
clbre Les guerres saintes et un plaidoyer pour la paix (On Holy Wars and a plea for Peace)
de Danny Cohen et publi en 1980 dans la revue IEEE Computer. D. Cohen traite du problme du
positionnement dun octet dans un mot lorsque celui-ci fait lobjet dune transmission ou dun
lecture/criture en mmoire : dans un octet quel bit est transmis en premier, dans un mot quel
octet est transfr en premier.
Il y a priori deux choix possibles, choix qui, dune manire ou dune autre, sont plus ou moins
quivalents. Pour mettre en vidence, la fois la futilit et limportance des consquence dun
choix big endian et little endian, D. Cohen fait une rfrence aux Voyages de Gulliver de
Jonathan Swift (1726). Aux pays de Lilliput, les lilliputiens sont des gens de petite taille et ont
des problmes politiques assortis cette taille. Pourtant une guerre civile froce se dclenche la
suite dune dcision aux consquences dramatiques. Les lilliputiens consomment des ufs cuits
quils ouvrent indiffremment du cot large de luf ou du petit cot. Lempereur des
lilliputiens proclame que dornavant les oeufs doivent obligatoirement tre ouverts du petit cot
(little end). Raction immdiate des farouches dfenseurs du gros cot (les big endians) et la
situation senvenime jusqu engendrer 11000 morts. Les big endians durent se rfugier sur
une le voisine du royaume de Blefuscu. Jonathan Swift fait une allusion la situation politique
de lpoque en Angleterre avec la guerre de religion entre lglise anglicane et lglise
catholique ; Lilliput reprsente lAngleterre et Blefescu est videmment la France La fable de
Swift est peut tre toujours dactualit !
Pour simplifier les choses, il y a deux versions de traduction franaise de endian : boutien et
boutiste. Nous parlons donc de gros et petit boutien dans un camps et de gros et petit boutiste
dans lautre. Pour notre part, nous garderons les termes proposs par Danny Cohen... mme sils
sont en anglais.
Pour lanecdote, notons encore une variante, probablement due des difficults daudition et/ou
de perception de langlais, qui parle de indian en lieu et place de endian en prtextant que les
lilliputiens taient des tribus indiennes.
Pour finir, nous pouvons remarquer que cette problmatique nest ni nouvelle ni spcifique
linformatique et doit trouver son origine dans la transcription des nombres. Deux exemples. Dans
la reprsentation textuelle des nombres, anglais et franais sont big endian : 21 se dit vingt et un,
twenty one alors que les allemands sont little endian : 21 se dit ein und zwanzig.
Au niveau des dates, les europens sont Little Endian avec le format jj/mm/aa, les japonais sont
Big Endian (aa/mm/jj) et les amricains sont Middle Endian (mi-boutien ou mi-boutiste) avec
le format mm/jj/aa.

CHAPITRE 4 . Processeurs et jeux dinstructions
Processeurs et jeux dinstructions

46

Table des matires

4 CHAPITRE 4 ................................................................................... 1
4.1 Le modle de programmation dun processeur. (Instruction Set
Architecture)................................................................................................... 2
4.2 Le fonctionnement du Z80. .............................................................. 4
4.2.1 Droulement dune instruction. ................................................... 5
4.2.1.1 Le droulement de lexcution dune instruction. .............. 6
4.2.1.2 Structuration, Organisation gnrale des instructions...... 11
4.3 Les premiers lments de structuration dun programme : la
procdure...................................................................................................... 12
4.4 Organisation des donnes : relation Processeur Mmoire
(Endianess-Boutisme) .................................................................................. 15
4.5 Gestion de Pile ............................................................................... 17
4.6 Les techniques dadressage, cas du 68000..................................... 18
4.6.1 Description succincte du 68000. ............................................... 19
4.6.2 Les modes dadressage du 68000. ............................................. 20
4.6.2.1 Adressage direct de registre de donnes .......................... 20
4.6.2.2 Adressage direct de registre d'adresse.............................. 21
4.6.2.3 Adressage immdiat ......................................................... 21
4.6.2.4 Adressage absolu.............................................................. 22
4.6.2.5 Adressage indirect sur registre d'adresse.......................... 22
4.6.2.6 Adressage indirect sur registre d'adresse avec
prdcrment : -(An) ; avec postincrment : (An)+ ......................... 23
4.6.2.7 Adressage indirect sur registre avec dplacement ............ 23
4.7 De linstruction machine au programme, Introduction
lAssembleur ................................................................................................ 24
4.7.1 Modle RISC Load and Store................................................. 28
4.7.1.1 Le processeur MIPS (en version 32 bits). ........................ 29
4.7.2 Procdures et passage de paramtres. ....................................... 33

You might also like