You are on page 1of 24

Architecture externe dun processeur (Exemple de MIPS)

1 Introduction
L'architecture externe dun processeur reprsente ce que doit connatre un
programmeur souhaitant programmer directement avec le langage du processeur. Ce langage,
dit lagunage machine, est reprsent par des chanes binaires propres chaque processeur.
Pour manipuler facilement ce langage, les programmeurs utilisent une forme plus conviviale
dite langage dassemblage. Le langage dassemblage est quivalent au langage machine sauf
quil utilise des reprsentations mnmoniques des oprations telles que Add, Mouv, Jump,
etc, au lieu de manipuler des chanes binaires. La programmation dun processeur en
assembleur est, en gnrale, plus complexe mais elle permet dcrire des programmes plus
rapides exploitant les performances maximales du processeur. Elle permet, entre autres, de
raliser des compilateurs permettant de traduire un programme crit en langage volu
(Pascal, C, etc) en un programme en langage machine. Larchitecture externe dun processeur
concerne les lments suivants :
- Les registres visibles.
- L'adressage de la mmoire.
- Le jeu d'instructions.
- Les mcanismes de traitement des interruptions et des exceptions

2 Prsentation du processeur MIPS R3000
Dans le but dillustrer les diffrents concepts, nous prendrons comme exemple le
processeur MIPS R3000 qui est un processeur 32 bits. Son jeu d'instructions est de type RISC
(Reduced Instruction Set Computer). Il existe plusieurs ralisations industrielles de cette
architecture (SIEMENS, NEC, LSI LOGIC, SILICON GRAPHICS, etc...). Ce processeur est
suffisamment simple pour prsenter les principes de base, et suffisamment puissante pour
supporter un systme d'exploitation multi-tches tel que UNIX.

2-1 Registres visibles du MIPS-R3000
MIPS-R3000 est un microprocesseur moderne possdant des mcanismes de
protection et de multi-tches (permettant dexcuter plusieurs tches la fois). Le processeur
possde deux modes de fonctionnement : utilisateur/superviseur. Le mode superviseur est le
mode protg dans lequel les programmes du systme dexploitation sexcutent. Le mode
utilisateur est le mode dans lequel les programmes des utilisateurs sexcutent. Chacun des
modes dispose de ses propres registres visibles.

a) Registres non protgs
Le processeur possde 35 registres manipuls par les instructions standard (c'est--dire
les instructions qui peuvent sexcuter aussi bien en mode utilisateur quen mode
superviseur).
Les 32 registres usage gnral ($R0 $R31)
Ce sont des registres de 32 bits utiliss par les instructions pour stocker les oprandes
en vue de raliser les oprations arithmtiques et logiques. Le registre $R0 en
particulier retourne toujours un zro quel que soit ce quon y enregistre. Le registre
$R31 est utilis pour sauvegarder ladresse de retour dans le cas dappel de procdure.
Le compteur programme $PC (compteur ordinal)
Ce registre contient l'adresse de l'instruction en cours d'excution. Sa valeur est
modifie par toutes les instructions.
Les registres HI et LO
Ces registres 32 bits sont utiliss pour la multiplication ou la division pour stocker le
rsultat de lopration

b) Registres protgs
L'architecture MIPS dfinit 32 registres (numrots de 0 31), qui ne sont accessibles,
en lecture comme en criture, que par les instructions privilgies (c'est dire les instructions
qui ne peuvent tre excutes qu'en mode superviseur). On dit qu'ils appartiennent au
"coprocesseur systme". En particuliers nous avons :

Le registre d'tat SR (Status Register)
Il contient en particulier le bit qui dfinit le mode : superviseur ou utilisateur, ainsi
que les bits de masquage des interruptions
Registre de cause CR (Cause Register)
En cas d'interruption ou d'exception, son contenu dfinit la cause pour laquelle on fait
appel au programme de traitement des interruptions et des exceptions.

Registre d'exception EPC (Exception Program Counter).
Il contient l'adresse de retour (PC + 4) en cas d'interruption. Il contient l'adresse de
l'instruction fautive (PC) en cas d'exception.

Registre d'adresse illgale BAR (Bad Address Register).
En cas d'exception de type "adresse illgale", il contient la valeur de
l'adresse mal forme.

3 Organisation de la mmoire
Lorganisation de la mmoire diffre dun processeur un autre. La diffrence rside
dans la taille affecte aux bus de donnes et dadresses. La taille du bus de donnes est dune
importance capitale. Elle dtermine la taille du mot mmoire. En gnrale, la taille est de 4, 8,
16, 32, 64 ou 128 bits.
Les processeurs actuels permettent dadresser des mots de tailles variables. Un
processeur 32 bits peut, par exemple, charger des mots de 32 bits mais peut aussi charger des
mots de tailles plus petites. En gnrale, le plus petit objet que le processeur peut charger est
loctet. Le processeur est dit, dans ce cas, adressable par octet. Les mots de tailles plus
grandes sont stocks comme une squence doctets. Ladresse du mot correspond ladresse
du premier octet de la squence. Il existe deux choix pour lordre dans lequel les octets dun
objet sont stocks en mmoire (un entier sur 32 bits par exemple) ; le poids fort dabord (Big-
Endian) ou le plus faible dabord (Little-Endian). Dans le Big-Endian, ladresse du mot
correspond ladresse de loctet des poids forts. Les octets de poids faibles suivent ceux de
poids forts. Dans le Little-Endian, ladresse du mot correspond ladresse de loctet de poids
faibles et les octets de poids forts suivent ceux de poids faibles. La figure III-1 illustre les
deux principes :
















Ladresse du mot est X dans les deux cas

Figure 1 organisation Big-Endian et Little-Endian

3-1 Organisation mmoire de MIPS-R3000
MIPS-R3000, est un processeur ayant un bus de donnes de 32 bits et un bus dadresse
de 32 bits galement. Il est adressable par octet selon le mode Little-Endian. Les instructions
sont toutes codes sur 32 bits. Les donnes sont codes sur un mot (4 octets conscutifs),
demi-mot (2 octets conscutifs), ou sur un octet. Une instruction ou un mot doit toujours tre
aligne sur une adresse qui est un multiple de 4 car elle est forme de 4 octets. Un demi-mot
doit tre align sur une adresse qui est multiple de 2. Le processeur passe en exception si on
tente daccder un objet non align.
Lespace mmoire est dcoup en 2 segments identifis par le bit de poids fort de
ladresse (31
eme
bit). Un 0 sur ce bit correspond au segment utilisateur et un 1 correspond au
segment systme. Quand le processeur est en mode superviseur, les 2 segments sont
accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est
accessible. Le processeur part en exception si une instruction essaye d'accder la mmoire
avec une adresse correspondant au segment systme alors que le processeur est en mode
utilisateur.
En gnral, un programme est compos dune section instruction, dune section
donnes, et dune pile utilise pour raliser des appels de procdures et de fonctions. Par
convention, lespace mmoire du MIPS R3000 est dcompos selon cette structure comme
indique dans la figure III-2. (Les adresses sont indiques en hexadcimal).
La section .text contient le code excutable en mode utilisateur. Elle est implante
conventionnellement ladresse 0x00400000. La section .data contient les donnes globales
manipules par le programme utilisateur. Elle est implante conventionnellement ladresse
0x10000000. Sa taille peut dborder sur la section de pile utilisateurs .stack, implante
ladresse 0x7FFFFFFF et qui stend vers les adresses dcroissantes. Le mode superviseur
dispose aussi de trois sections contenant les programmes, les donnes et la pile du systme
dexploitation.

Octet
0 LSB 31 MSB
x x +1 x +2 x +3
Big-Endian
Octet
0 LSB 31 MSB
x x +1 x +2 x +3
Little-Endian




























Figure 2 Organisation mmoire du MIPS-R3000

4 Modes dadressage
Laccs la mmoire se fait par une adresse spcifie dans un champ (une partie) de
linstruction. Il arrive que lespace mmoire adress par le processeur soit plus grand que la
capacit dadressage du champ de linstruction. Il est aussi frquent de manipuler des
structures complexes tels que les tableaux et les enregistrements ncessitant des techniques
dadressage particulires. Il existe en effet plusieurs modes dadressages. Les plus connus
sont les suivants
1) Adressage immdiat
Ce mode est utilis pour manipuler des constantes connues sans passer par la mmoire
pour les chercher. Loprande est une valeur immdiate se trouvant directement dans
linstruction
Exemple
Load RA, #10 ; mettre la valeur immdiate 10 dans le registre A



2) Adressage direct
Ladresse de linformation chercher se trouve directement dans linstruction. Ce
mode est le plus simple mais lespace mmoire accessible dpend de la taille du champs
adresse de linstruction

Exemple
Bus de donnes
(32 bits)
0x00000000
0x00000004
.
.
.

0x003FFFFC
.
.
.

0x00400000
.
.
.

0x0FFFFFFC
0x10000000
.
.
.

0x7FFFFFFC
.
.
.

0x80000000
0xBFFFFFFC
.
.
.

0xC0000000
.
.
.

0xFFFFEFFC
.
.






.

0xFFFFF000
0xFFFFFFFC
Octet 0
Segment utilisateur
31
eme
bit = 0
Segment systme
31
eme
bit = 1
Octet 1 Octet 2 Octet 3
Rserv
Section programme utilisateurs
(.TEXT)
Section donnes utilisateurs
(.DATA)
Section pile utilisateurs
(.STACK)
Section programme systme
(.KTEXT)
Section donnes systme
(.DATA)
Section pile systme
(.KSTACK)
Rserv
10
RA
Load RA, 10 ; charger le registre A avec la donne se trouvant en
; mmoire ladresse 10










3) Adressage indirect
Linstruction contient une adresse qui contient ladresse de linformation chercher.
Ce mode ncessite deux accs la mmoire. Il tend tre abandonn et ne plus tre utilis sur
les processeurs modernes.
Exemple
Load RA, (10) ; charger le registre A par linformation se trouvant en mmoire
; ladresse se trouvant dans la location dadresse 10 de la mmoire











4) Adressage registre
Linformation ne se trouve pas en mmoire mais dans un autre registre interne du
processeur.
Exemple
Load RA, RB


5) Adressage indirect par registre
Linformation chercher se trouve en mmoire ladresse indiqu par un registre
interne

Exemple
Load RA, (RB)







.
.
.
10
.
.
.

25
25 RA
Mmoire
.
.
.
10
.
.
25

25
30
RA
Mmoire
30
10
RA
10
RB
10
RB
.
.
.
10
.
.
.

25
Mmoire
25
RA
5) Adressage Bas (ou par dplacement)
Ladresse de linformation chercher est donne en deux parties. Une partie dite base
se trouvant dans un registre et une partie, dite dplacement, donne dans linstruction. Cette
forme dadressage est souvent utilise pour manipuler des structures complexes. Un tableau,
par exemple peut tre adress par un registre qui indique la base du tableau, et un dplacement
qui fait rfrence un lment lintrieur du tableau.
Exemple












6) Adressage Index
Ladresse de linformation est la somme des contenus de deux registres
Exemple
Load A, (B)(C)










7) Adressage bas index
Cest une combinaison des deux modes dadressage prcdents
Exemple









15
RB
+
.
.
.
25
.
.
.

30
Mmoire
Load RA, 10 (RB)

30
RA
15
B
+
.
.
.
35
.
.
.

10
Mmoire
10
A
20
C
15
B
+
.
.
.
45
.
.
.

30
Load A, 10 (B)(C)

30
A
20
Mmoire
8) Adressage relatif
Ce mode est souvent utilis dans les instructions de branchement. Ladresse de
linformation est la combinaison du contenu du compteur ordinal (PC) et dun dplacement
Exemple
Brel 10 ; branchement relatif vers la 10
eme
instruction aprs
; linstruction courante










4-1 Modes dadressage du MIPS-R3000
Le processeur MIPS-R3000 possde les modes dadressage suivants :
Adressage immdiat
Adressage par registre
Adressage bas
Adressage relatif

5 Formats dinstructions
Il existe en gnral trois types de formats dinstruction en fonction du nombre
doprandes figurant dans une instruction ; le format dinstruction une adresse, le format
deux adresses et le format trois adresses.

a) Instruction une adresse
Ce format dinstruction a t utilis dans les anciens processeurs qui disposaient dun
nombre limit de registres. Un registre particulier, dit accumulateur, retient les rsultats
temporaires pendant que les oprandes sont chargs un un de la mmoire. Une instruction
est de la forme : Code_Operation, Oprande. Linstruction volue suivante A = B*C + D est
traduite en langage machine une adresse comme suite :
Load B
Mul C
Add D
Store A

b) Instruction deux adresses
Dans ce mode, une instruction est de la forme Code_Operation Destination, Source.
Par exemple, linstruction Add A, B additionne le contenu de A et de B avec le rsultat
sauvegard dans A. linstruction A = B*C + D sera traduite comme suit :
Load A, B
Mul A, C
Add A, D

c) Instruction trois adresses
Une instruction trois adresses est de la forme :
Code_Operation Rsultat, Operande1, Operande2
15
PC
+
.
.
.
25
.
.
.

30
30
A
Brel 10 14
Mmoire
Linstruction A = B*C + D sera traduite de la manire suivante :
Mul A, B, C
Add A, D, A

5-1 Format dinstruction de MIPS-R3000
Toutes les instructions du processeur MIPS-R3000 ont une taille de 32 bits. Il existe
trois formats dinstructions :

a) Instruction de format R
Le format R est utilis par les instructions ncessitant 2 registres sources et un registre
destination. Le format est donn par la figure III-3-(a) :


OP RS RT RD SHAMT FUNCT



OP RS RT Valeur immdiate



OP Valeur immdiate


Figure III-3 formats dinstructions de MIPS-R3000
Avec :
OP : est le code de lopration. Il dtermine quelle est lopration effectue par
linstruction (addition, soustraction, etc.). Plusieurs instructions peuvent avoir le
mme code OP. Dans ce cas, le champ FUNCT permet de distinguer entre ces
oprations
RS : indique le premier registre source (contenant le premier oprande)
RT : indique le deuxime registre source (contenant le deuxime oprande)
RD : indique le registre destination (qui recevra le rsultat de lopration)
SHAMT : utilis dans les instructions de dcalage pour indiquer le nombre de
dcalages effectuer.
FUNCT : utilis pour distinguer entre les instructions ayant le mme code OP.

b) Instruction de format I
Le format I (figure III-3-(b) est utilis par les instructions de lecture/criture
mmoire, par les instructions utilisant un oprande immdiat, ainsi que par les branchements
conditionnels. Dans tous les cas, la taille de la valeur immdiate ne peut excder 16 bits

c) Instruction de format J
Ce format (figure III-3-c) est utilis uniquement pour les branchements longue
distance (inconditionnels). La taille de ladresse de branchement est de 26 bits

5-2 Jeu dinstruction du processeur MIPS-R3000
Le processeur MIPS est de type Load/Store. Cela veut dire quil existe uniquement
deux instructions pour accder la mmoire. Linstruction Load pour charger un objet de la
mmoire et linstruction Store pour enregistrer un objet dans la mmoire. Toutes les autres
6 Bits 5 Bits 5 Bits 5 Bits 5 Bits 6 Bits
0 5 6 10 11 15 16 20 21 25
5
26 31
6 Bits 5 Bits 5 Bits 16 Bits
0 15 16 20 21 25
5
26 31
0 25
5
26 31
6 Bits 26 Bits
(a) Format R
(b) Format I
(a) Format J
instructions sont orientes registres. Cela signifie que les instructions arithmtiques et
logiques, par exemple, prennent leurs oprandes dans des registres et rangent le rsultat dans
un registre. Cette technique est utilise dans la majorit des processeurs modernes de type
RISC, car laccs la mmoire est trs lent et les oprations effectues sur les registres sont
plus rapides.
La table III-1 rsume une partie du jeu dinstruction du processeur MIPS-R3000
indiquant le code assembleur, lopration effectue ainsi que le format associ. La figure III-4
donne le code machine associ chacune des instructions.

Exemple
Traduire linstruction LW R5, 126(R8) en code machine
Signification : charge le registre R5 du contenu dadresse 126+(R8) ;
Format I : Op (6bits) | RS (5bits) | RT (5bits) | Valeur immdiate (16 bits)
OP = 100011
RT = Registre charger (R5) = 00101
RS = Registre base (R8) = 01000
Valeur immdiate = 0000000001111110
Le code machine associ est : 10001101000001010000000001111110=0x8D05007E
Exercice ;
Donner linstruction assembleur correspondant linstruction machine
suivante :0x00642820

5-3 Etude de quelques instructions

a) Instructions daccs la mmoire

LB RT, I(RS) : Charger loctet de poids faible du registre RT par la donne (sur un octet) se
trouvant en mmoire ladresse (RS)+I. Le signe de la donne est tendu sur
les octets de poids forts de RT

Exemple : (RS)= 0x00000100, I= 0x00AB















LBU RT, I(RS) : Charger loctet de poids faible du registre RT par la donne (sur un octet)
se trouvant en mmoire ladresse (RS)+I. Le signe est ignor et les octets
de poids fors sont mis zro
Le rsultat de lexemple prcdent sera : RT =0x000000FE
+
FE
Mmoire
0x000001AB FB F1 7C
32 bits
FE RT FF FF FF

LH RT, I(RS) :charger les deux octets de poids faibles de RT par les deux octets mmoires
commenant partir de ladresse (RS) +I. Le signe est tendu sur les deux
octets de poids forts
Le rsultat de lexemple prcdent sera RT =0xFFFFFBFE
LHU RT, I(RS) : charger les deux octets de poids faibles de RT par les deux octets mmoires
commenant partir de ladresse (RS) +I. Le signe est ignor et les octets de
poids forts sont mis zro
Le rsultat de lexemple prcdent sera RT = 0x0000FBFE
LW RT, I(RS) : charger le registre RT par le mot dadresse (RS) + I.
Le rsultat de lexemple prcdent sera RT = 0x7CF1FBFE
Les instruction SB, SH, SW ont un format quivalent LB, LH, et LW. Elles
permettent denregistrer les donnes en mmoire.

b) Instructions arithmtiques et logiques

ADD RD, RS, RT : le registre RD reoit le rsultat daddition des deux registres RS + RT.
Sil y a dbordement, une exception est gnre et le programme est
interrompu.
ADDU RD, RS, RT : le registre RD reoit le rsultat daddition des deux registres RS + RT.
Un dbordement ventuel est ignor
Les instructions SUB et SUBU ont un format quivalent ADD et ADDU. Elles effectuent
des soustractions avec ou sans dbordement.
MULT RS, RT : le contenu du registre RS est multipli par le contenu du registre RD. Le
poids faible du rsultat est sauvegard dans le registre LO et le poids fort
dans le registre HI. Sil y a dbordement, une exception est gnre et le
programme est interrompu
MULTU RS, RT : effectue la mme opration que MULT sans gnrer dexception en cas de
dbordement (non signe)
DIV RS, RT : divise le contenu de RD sur RT, le registre LO reoit le quotient et le registre
HI reoit le reste
DIVU RS, RT : division non signe
OR RD, RS, RT : chaque bit de RD reoit le OU logique entre les bits correspondant de RS
et RT
AND RD, RS, RT : chaque bit de RD reoit le ET logique entre les bits correspondant de RS
et RT
c) Instructions manipulant des valeurs immdiates
Compte tenu du format de codage I des instruction Immdiates (figure III-3-b), une
adresse ou une constante immdiate ne peut avoir qune taille au plus de 16 bits. Une
constante de 32 bits ne peut donc tre charge avec une seule instruction. Linstruction LUI
combine avec ADD ou OR permet de charger une constante ou une adresse de 32 bits.
LUI RT, I : Enregistrer la valeur immdiate I dans les 16 bits de poids fort du registre RT, les
16 bits de poids faibles sont mis zro (0x0000).
ORI RT, RS, I : effectuer un OU logique entre le contenu de RS et la valeur immdiate I, le
rsultat est dans RT.
Exemple : enregistrer le mot 0x12FE2C3B dans le registre R5
Comme il n y a aucune instruction qui manipule une constante de 32 bits, on utilise deux
instructions
LUI $R5, 0x12FE #R5 = 0x12FE0000
ORI $R5, $R5, 0x2C3B #R5 = 0x12FE2C3B
Instructions Arithmtiques/Logiques
Assembleur Opration Format
Add Rd, Rs, Rt Add (overflow detection) Rd <-Rs + Rt R
Sub Rd, Rs, Rt Subtract (overflow detection) Rd <-Rs - Rt R
Addu Rd, Rs, Rt Add (no overflow ) Rd <-Rs + Rt R
Subu Rd, Rs, Rt Subtract (no overflow ) Rd <-Rs - Rt R
Addi Rt, Rs,I Add Immediate (overflow detection) Rt <-Rs + I I
Addiu Rt, Rs,I Add Immediate (no overflow) Rt <-Rs + I I
Or Rd, Rs, Rt Logical Or Rd <-Rs or Rt R
And Rd, Rs, Rt Logical And Rd <-Rs and Rt R
Xor Rd, Rs Rt Logical Exclusive-Or Rd <-Rs xor Rt R
Nor Rd, Rs, Rt Logical Not Or Rd <-Rs nor Rt R
Ori Rt, Rs, I Or Immediate (unsigned) Rt <-Rs or I I
Andi Rt, Rs, I And Immediate (unsigned) Rt <-Rs and I I
Xori Rt, Rs, I Exclusive-Or Immediate (unsigned) Rt <-Rs xor I I
Sllv Rd, Rt, Rs Shift Left Logical Variable (5 lsb of Rs is significant) Rd <-Rt << Rs R
Srlv Rd, Rt, Rs Shift Right Logical Variable (5 lsb of Rs is significant) Rd <-Rt >> Rs R
Srav Rd, Rt, Rs
Shift Right Arithmetical Variable (5 lsb of Rs is significant)
(with sign extension)
Rd <-Rt >> Rs R
Sll Rd, Rt, sh Shift Left Logical Rd <-Rt << sh R
Srl Rd, Rt, sh Shift Right Logical Rd <-Rt >> sh R
Sra Rd, Rt, sh Shift Right Arithmetical (with sign extension) Rd <-Rt >> sh R
Lui Rt, I Load Upper Immediate,16 lower bits of Rt are set to zero Rt <-I || "0000" I
S l t Rd, Rs, Rt Set if Less Than Rd <- 1 if Rs<Rt else 0 R
Sltu Rd, Rs, Rt Set if Less Than Unsigned Rd <- 1 if Rs<Rt else 0 R
Slti Rt, Rs, I Set if Less Than Immediate Rt <- 1 if Rs < I else 0 (sign extended Immediate) I
Sltiu Rt, Rs, I
Set if Less Than Immediate Rt <- 1 if Rs < I else 0 (unsigned immediate)
I
Mult Rs, Rt Multiply Rs * Rt R
LO <-32 low significant bits
HI <-32 high significant bits
Multu Rs, Rt Multiply Unsigned Rs * Rt R
LO <-32 low significant bits
HI <-32 high significant bits
Div Rs, Rt Divide Rs / Rt R
LO <-Quotient
HI <-Remainder
Divu Rs, Rt Divide Unsigned Rs / Rt R
LO <-Quotient
HI <-Remainder
Mfhi Rd Move From HI Rd <- HI R
Mflo Rd Move From LO Rd <- LO R
Mthi Rs Move To HI HI <-Rs R
Mtlo Rs Move To LO LO <-Rs R
Instructions de branchement
Assembleur Opration Format
Beq Rs, Rt, I Branch if Equal
PC <-PC+ (I*4) if Rs = R
PC <-PC+4 if Rs Rt
I
Bne Rs, Rt, I Branch if Not Equal
PC <-PC+ (I*4) if Rs R
PC <-PC+4 if Rs =Rt
I
Bgez Rs, I Branch if Greater or Equal Zero
PC <-PC+ (I*4) if Rs 0
PC <-PC+4 if Rs < 0
I
Bgtz Rs, i Branch if Greater Than Zero
PC <-PC+ (I*4) if Rs > 0
PC <-PC+4 if Rs 0
I
Blez Rs, I Branch if Less or Equal Zero
PC <-PC+ (I*4) if Rs 0
PC <-PC + 4 if Rs > 0
I
Bltz Rs, I Branch if Less Than Zero
PC <-PC+ (I*4) if Rs < 0
PC <-PC+4 if Rs 0
I
Bgezal Rs, I Branch if Greater or Equal Zero and link
PC <-PC+ (I*4) if Rs 0
PC <-PC+4 if Rs < 0
R31 <-PC+4 in both cases
I
Bltzal Rs, I Branch if Less Than Zero and PC <-PC+ (I*4) if Rs < 0 I
link PC <-PC+4 if Rs 0
J I Jump PC <-PC 31:28 || I*4 J
Jal I Jump and Link
R31 <-PC+4
PC <-PC 31:28 || I*4
J
Jr Rs Jump Register PC <-Rs R
Jalr Rs Jump and Link Register
R31 <-PC+4
PC <-Rs
R
Jalr Rd, Rs Jump and Link Register
Rd <-PC+4
PC <-Rs
R
Instructions de Lecture/Ecriture mmoire
Assembleur Opration Format
Lw Rt, I (Rs) Load Word (sign extended Immediate) Rt <- M (Rs + I) I
Sw Rt, I (Rs) Store Word M (Rs + I) <- Rt I
Lh Rt, I (Rs)
Load Half Word
sign extended Immediate. Two bytes from
storage are loaded into the the 2 less
significant bytes of Rt, the sign of these 2
bytes is extended on the 2 most signficant
bytes.
Rt <-M (Rs + I) I
Lhu Rt, I (Rs)
Load Half Word Unsigned
sign extended Immediate. Two bytes from
storage are loaded into the the 2 less
significant bytes of Rt, other bytes are set to
zero
Rt <-M (Rs + I) I
Sh Rt, I (Rs)
Store Half Word
sign not extended Immediate. The Two less
significant bytes of Rt are stored into storage
M (Rs + I) <-Rt I
Lb Rt, I (Rs)
Load Byte
sign extended Immediate. One byte from storage is
oaded into the less significant byte of Rt. The sign
of this byte is extended on the 3 most signficant
bytes.
Rt <-M (Rs + I) I
Lbu Rt, I (Rs)
Load Byte Unsigned
sign extended Immediate. One byte from
storage is loaded into the less significant byte
of Rt, other bytes are set to zero
Rt <-M (Rs + I) I
Sb Rt, I (Rs) Store Byte
sign extended Immediate. The less significant
byte of Rt is stored into storage
M (Rs + I) <-Rt
I
Instructions systme (en mode protg)
Assembleur Opration Format
Rfe
Restore From Exception
Privileged instruction. Restore the
prevous IT mask and mode
SR <- SR 31:4 || SR 5:2 R
Break n
Breakpoint Trap
Branch to exception handler, n defines the
breakpoint number
SR <- SR 31:6 || SR 3:0 || "00"
PC <- "8000 0080"
CR <- cause
R
Syscall
System Call Trap
Branch to exception handler
SR <- SR 31:6 || SR 3:0 || "00"
PC <- "8000 0080"
CR <- cause
R
Mfc0 Rt, Rd
Move From Control Coprocessor
Privileged Instruction . The register Rd of the
Control Coprocessor is moved into the integer
register Rt
Rt <-Rd R
Mtc0 Rt, Rd
Move To Control Coprocessor
Privileged Instruction . The integer
register Rt is moved into the register Rd
of the Control Coprocessor
Rd <-Rt R
Table 1 jeu dinstruction du processeur MIPS-R3000




























Figure 4 Code machine associ au jeu dinstruction du processeur MIPS-R3000


















Table 2 convention dusage des registres MIPS
OP (Bits 28:26)

OP
(Bits 31:29)

000 001 010 011 100 101 110 111
000
001
010
011
100
101
110
111
SPECIAL BCOND J JAL BEQ BNE BLEZ BGTZ
ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI
COPRO

LB LH LW LBU LHU
SB SH SW



OP = SPECIAL (000000)
Function (Bits 2:0)

OP = SPECIAL
Function (Bits 5:3)

000 001 010 011 100 101 110 111
000
001
010
011
100
101
110
111
SLL SRL SRA SLLV SRLV SRAV
JR JALR SYSCALL BREAK
MFHI MTHI MFLO MTLO
MULT MULTU DIV DIVU
ADD ADDU SUB SUBU AND OR XOR NOR
SLT SLTU



BLTZ BGEZ
BLTZAL BGEZAL

OP = BCOND (000001)
RT (Bit 16)

OP = BCOND
RT (Bit 20)

0
1
0 1
MFCO MTCO
RFE

OP = COPRO (010000)
RS (Bit 23)

OP =COPRO
RS (Bit 25)

0
1
0 1
N Nom Fonction
16 $s0 saved temporary (preserved across call)
17 $s1 saved temporary (preserved across call)
18 $s2 saved temporary (preserved across call)
19 $s3 saved temporary (preserved across call)
20 $s4 saved temporary (preserved across call)
21 $s5 saved temporary (preserved across call)
22 $s6 saved temporary (preserved across call)
23 $t7 saved temporary (preserved across call)
24 $t8 temporary (not preserved across call)
25 $t9 temporary (not preserved across call)
26 $k0 reserved for OS kernel
27 $k1 reserved for OS kernel
28 $gp pointer to global area
29 $sp stack pointer
30 $fp frame pointer
31 $ra return address (used by function call)

N Nom Fonction
0 $zero constant 0
1 $at reserved for assembler
2 $v0 expression evaluation and results of a function
3 $v1 expression evaluation and results of a function
4 $a0 argument 1
5 $a1 argument 2
6 $a2 argument 3
7 $a3 argument 4
8 $t0 temporary (not preserved across call)
9 $t1 temporary (not preserved across call)
10 $t2 temporary (not preserved across call)
11 $t3 temporary (not preserved across call)
12 $t4 temporary (not preserved across call)
13 $t5 temporary (not preserved across call)
14 $t6 temporary (not preserved across call)
15 $t7 temporary (not preserved across call)

d) Instruction de branchement
Les instructions de branchement permettent de raliser des squences conditionnelles
(if-then-else) ainsi que des boucles. Le branchement peut tre soit relatif (par rapport
linstruction courante) ou absolu ( une adresse bien dtermine)
BEQ RS, RT, I : si RS = RT alors aller la I
eme
instruction aprs linstruction courante, si
non, aller la prochaine instruction (si I<0, le branchement est en arrire)
BGTZ RS, I : si RS > 0 alors aller la I
eme
instruction se trouvant aprs linstruction
courante, si non, aller linstruction courante (saut en arrire si I<0)
J I : aller linstruction dadresse I (branchement absolu)
JAL I : aller linstruction dadresse I, sauvegarder ladresse de la prochaine instruction dans
le registre R31. Cette instruction est utilise pour raliser des appels de sous
programmes
JR RS : aller linstruction dadresse se trouvant dans le registre RS. Cette instruction est
utilise pour raliser des retours de procdures
Exercice
Ecrire un programme assembleur MIPS qui rcupre dans le registre R10, la plus
grande valeur se trouvant dans les registres R11 et R12

Programme C

If (R11>= R12){
R10 = R11
}else {
R10 = R12
}
Programme assembleur
Sub $R13, $R11, $R12 # On utilise le registre R13 comme registre temporaire de
# travail qui reoit la diffrence entre R11 et R12
BGEZ $R13, suite # si R11 >= R12, aller suite
ADD $R10, $R0, $R12 # Si non R10 R12
J fin
Suite : ADD $R10, $R0, $R11 # R10 R11
Fin :

6 Types de donnes manipules par le processeur MIPS
1) Entiers et caractres
Les entiers sous MIPS adoptent une reprsentation en complment 2 et peuvent avoir
des tailles diffrentes. Les caractres sont reprsents en code ASCII est tiennent sur un octet.
Ils peuvent donc tre considrs comme des entiers non signs sur 8 bits. La table III-3
rsume les types utiliss dans les langages volus (C par exemple) ainsi que leurs
correspondance en MIPS.

Type C Type MIPS Nombre doctets
Long long Dword (64 bits) 8 (deux accs mmoire)
Long (ou int) Word (32 bits) 4 (un accs mmoire)
Short Halfword (16 bits) 2 (un accs mmoire)
Char Byte 1 (un accs mmoire
Table III-3 reprsentation des donnes entires sous MIPS

2) Nombre rels (float en C)
Les processeurs MIPS disposent dun coprocesseur spcialis dans les calculs flottants
(dit coprocesseur 1). Ce coprocesseur dispose de 32 registres propres de 32 bits, numrots f0
f31. La reprsentation adopte est la norme IEEE-754, simple et double prcision. La
double prcision (sur 64 bits) utilise une concatnation de deux registres conscutifs (f0 :f1
par exemple). Il existe aussi des instructions propres au coprocesseur pour effectuer des
oprations flottantes.

3) chanes de caractres
Les caractres sont combins pour produire un String qui est une chane de
caractres de taille variable. Il existe trois faons reprsenter les strings
La premire position (le premier octet) de la chane est rserve pour indiquer la taille
de la chane de caractres. Cest la reprsentation adopte par le langage Pascal
La dernire position de la chane contient un caractre spcial de fin de chane (le
caractre 0). Cest la reprsentation adopte par le langage C et Java.
Une variable indpendante accompagne le String indiquant le nombre de caractres de
la chane. Cette reprsentation nest pas utilise en pratique.

En assembleur, il est plus pratique dadopter une reprsentation de type C car elle ne
ncessite aucun calcul pour la taille de la chane. Ainsi, la chane Bonjour sera reprsente
par le code (ASCII): 42, 6F, 6E, 7E, 7A, 7F, 75, 72, 0

7 Ecriture de programmes en langage dassemblage MIPS
Lassembleur MIPS permet dcrire des programmes fonctionnant sur le processeur
MIPS-R3000. Les systmes MIPS adoptent un certain nombre de rgles concernant
lutilisation des registres. La table III-2 donne les noms et les fonctions conventionnelles des
registres MIPS. Ces recommandations ne sont pas obligatoires. Elles sont des conventions
entre les programmeurs pour adopter les mmes rgles de programmation, de faon ce que
les programmes crits par des personnes diffrentes puissent fonctionner ensemble
correctement. Parmi les rgles nous citons :

Les registres $at (1), $k0 (26), et $k1 (27) sont rservs pour le systme dexploitation
et lassembleur. Ils ne doivent pas tre utiliss par dautres programmes
Les registres $a0$a3 (47) sont utiliss pour passer les 4 premiers arguments aux
routines (procdure ou fonction). Sil y a plus darguments, il faut utiliser la pile. Les
registres $V0 et $V1 sont utiliss pour renvoyer des valeurs de retour.
Les registres $t0$t9 (815, 24, 25) peuvent tre utilises par les routines sans les
prserver. Ils sont utiliss pour retenir des valeurs temporaires. Le programmer doit
savoir que le contenu initial de ces registres risque dtre altr lors dun appel de
procdure
Les registres $s0$s7 (1623) sont des registres dont les valeurs sont prserves lors
de lappel de procdure. La procdure appele doit garantir que le contenu initial de
ses registres soit sauvegard (dans la pile) et restitu aprs le retour le la procdure.
Le registre $gp (28) qui pointe vers le segment de donnes globales permettant de
facilit laccs aux donnes
Le registre $sp (29) qui pointe vers la prochaine location vide de la pile, le registre $fp
(30) utilis pour pointer vers les donnes locales contenues dans la pile et, en fin, le
registre $ra (31) qui sauvegarde ladresse de retour dans un appel de procdure

7-1 Directives dassemblage et pseudo-instructions
Pour faciliter lcriture dun programme, lassembleur dispose en gnrale de
directives dassemblage et de pseudo-instructions. Une directive dassemblage est une
commande adresse lassembleur lui-mme. Son but est daider lassembleur gnrer le
code objet du programme. Une pseudo-instruction est, en gnrale, une forme de macro
remplaant un ensemble dinstructions relles. Cela permet au programmeur de faciliter
certaines tches tel que le chargement dune donne en mmoire qui ncessite deux
instructions.

1) Directives
.data : les lments qui suivent cette directive seront enregistrs dans la section donne de la
mmoire utilisateur (entre 0x10000000 et 0x7FFFFFFF)
.text : les lments qui suivent seront enregistrs dans la section programme de la mmoire
utilisateur.
.byte b1, b2, bn : Enregistrer les n octets en mmoire
.half h1, h2, hn : Enregistrer les n demi-mot en mmoire
.word w1, w2, wn : Enregistrer les n mots en mmoire
.ascii chane : Enregistre la chane de caractre en mmoire
.asciiz chane : Enregistrer la chane de caractre en mmoire et lui ajouter le caractre 0
la fin
.float f1, f2, f3 : Enregistrer les nombres flottants en mmoire
.double d1, d2, dn : Enregistrer les double-mots en mmoire (flottants sur 64 bits)

2) Pseudo-instructions
LA RT, Etiquette : Charger RT de ladresse correspondant ltiquette (peut tre sur 32 bits)
Equivalent :LUI RT, Adresse
31-16
de ltiquette
ORI RT, Adresse
15-0
de ltiquette
LI RT, I : charger RT de la valeur immdiate I (peut tre sur 32 bits)
MOVE RD, RS : RD RS
Equivalent OR RD, RS, $R0
MUL RD, RS, RT : RD RS*RT
Equivalente MULT RS, RT
MFLO RD

7-2 Simulateur de processeurs MIPS (SPIM)
SPIM (MIPS invers) est un logiciel de simulation de processeurs MIPS. Il permet de
lire un programme source assembleur et de simuler son excution. Plusieurs versions
sexcutant sur des plateformes multiples (Unix, Linux, Mac-OS-X et Windows) sont
disponibles sur le net
1
. Lutilisation de SPIM permet de vrifier la justesse des programmes
crits en assembleur MIPS et de voir le rsultat de lexcution de ces derniers. SIMP simule
galement un systme dexploitation rudimentaire permettant de grer un terminal virtuel
dentres sorties.
Sous SPIM, Un programme assembleur doit avoir le format suivant :

.data # section donnes, dclarer toutes les donnes dans cette section
.Byte .
.Word .


1
Pour tlcharger SPIM, visitez le site : http://pages.cs.wisc.edu/~larus/spim.html
.text # Section programme. Ecrire le programme dans cette section
.globl main # cette tiquette doit toujours tre dclare au dbut du programme
main : ..
.. # Ecrire les instructions du programme dans cette section

7-3 Exemples de programmes assembleur

1) Addition de deux entiers
Soit crire un programme assembleur qui additionne deux valeurs 14 et 15. Ces
valeurs son contenues dans deux variables dadresses A et B sur 32 bits chacune. Le rsultat
sera sauvegard en mmoire ladresse C. Le programme effectuant laddition est le suivant :

.data # Dclaration des donnes
A : .word 14 # Dclaration dun entier sur 32 bits en mmoire
B : .word 15 # Deuxime entier
C : .word 0 # Entier recevant le rsultat

.text # Section programme
.globl main # Point dentre du programme
main : la $t0, A # Charger ladresse de la variable A dans T0
lw $t1, 0($t0) # Charger le contenu de A dans le registre T1
lw $t2, 4($t0) # Charger le contenu de B dans T2
add $t3, $t1, $t2 # Effectuer laddition, le rsultat est dans T3
sw $t3, 8($t0) # sauvegarder le rsultat dans C
jr $ra # fin du programme

La dclaration des variables se fait dans la section de donnes (.data). Ltiquette A :
correspond ladresse mmoire du premier octet du mot contenant la valeur 14. Le mot sera
rserv grce la directive .word 14 qui rserve un mot et met la valeur 14 lintrieur.
Ltiquette B : contient ladresse du mot contenant la valeur 15. (B = A + 4 car A est sur 4
octets). Le rsultat sera sauvegard dans le mot dadresse C (A +8). La directive .word 0
rserve un mot et linitialise 0 car il est destin recevoir le rsultat de laddition de A et B.
Le programme est crit dans la section .text. il commence par la dfinition de
ltiquette globale main. Cette tiquette indiquera au simulateur SPIM o commence le
programme pour effectuer un saut ce dernier.
Pour effectuer une opration arithmtique sur le processeur MIPS, il faut charger tous
les oprandes dans les registres. Linstruction la $t0, A est, en fait, une pseudo instruction
qui permet de charger ladresse du premier oprande dans le registre T0. Lassembleur
remplacera cette pseudo instruction par les vraies instructions MIPS effectuant cette
opration. (lui $a, poids_forts_de_A et ori $t0, poids_faibles_de_A) Il suffit ensuite dutiliser
cette adresse comme base pour charger les deux oprandes et enregistrer le rsultat. Le
premier oprande correspond ladresse de base, le deuxime oprande correspond un
dplacement de 4 par rapport ladresse de base et le rsultat correspond un dplacement de
8. Il nest donc, pas ncessaire de charger ladresse de chaque oprande.
Le systme dexploitation simul par SPIM excute les programmes utilisateurs en
appelant la procdure main (excution de linstruction jal main ). Le programme doit donc
toujours commencer par la dfinition de ltiquette globale main. Il est frquemment termin
par linstruction de retour (jr $ra) pour rendre la main au systme dexploitation de SPIM.


2) Addition dlments dun tableau dentiers
Soit crire un programme assembleur MIPS qui calcule la somme des lments dun
tableau 10 mots et sauvegarder le rsultat en mmoire. Le programme est :
.data
tab: .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 # Elments du tableau
res: .word 0 # Variable recevant la somme des lments
.text
.globl main
main: and $t4, $t4, $zero # T4 est destin contenir la somme, il est initialis 0
li $t1, 10 # T1 contient la taille du tableau en mots (10 lments)
la $t2, tab # T2 contient ladresse dbut du tableau
boucle: lw $t3, 0($t2) # charger un lment du tableau dans T3
add $t4, $t3, $t4 # ajouter llment la somme
addi $t1,$t1, -1 # nombre dlments restant sommer
beq $t1, $zero, fin # sil ne reste plus dlments sommer, aller fin
addi $t2, $t2, 4 # T2 va pointer vers llment suivant du tableau
j boucle # Continuer sommer
fin: la $t2, res # T2 contient maintenant ladresse du rsultat
sw $t4, 0($t2) # enregistrer le rsultat en mmoire
jr $ra # fin du programme
Le tableau et son contenu, ainsi que le mot recevant le rsultat, sont dclars laide
de la directive .word . Le programme commence par mettre zro le registre $t4 destin
recevoir la somme. La mise zro de $t4 est effectue en ralisant un and avec le registre
$zero. Le registre $t1 contient la taille en mots du tableau (10 dans ce cas) et le registre $t2
contient ladresse de base du tableau. Au niveau de ltiquette boucle : commence une
boucle qui additionne un lments du tableau la somme partielle ($t4) chaque itration. La
boucle commence par charger llment dans le registre $t3 et ladditionner la somme
partielle. Le nombre dlments est, ensuite dcrment de 1 et la base du tableau est
incrment de 4 pour pointer vers llment suivant. Le programme sort de la boucle quand
tous les lments auront t traits ($t1 = 0) et le rsultat est enregistr en mmoire.

8- Les interruptions et les exceptions
Dans son fonctionnement normal, le processeur excute les instructions lune aprs
lautre. Le compteur ordinal (PC) sincrmente rgulirement pour pointer vers linstruction
prochaine sauf dans le cas dune instruction de branchement. Dans ce cas, le compteur ordinal
pointe vers ladresse de branchement indique dans linstruction.
Toutefois, il existe des situations dans lesquelles le processeur interrompt lexcution
normale du programme et se branche vers un autre programme. Quatre types d'vnements
peuvent interrompre l'excution "normale" d'un programme:
La rinitialisation (le signal RESET)
Les interruptions
Les exceptions
Les appels systme

8-1) Les interruptions
Les interruptions sont des vnements asynchrones provenant gnralement de
priphriques externes, dtects sur des lignes spciales du processeur. Ces lignes sont dites
sources dinterruption. Une fois linterruption dclenche, le processeur interrompt
lexcution du programme est se branche vers une routine qui excute un programme
particulier dit routine dinterruption (ou gestionnaire dinterruption). En gnral ce
programme consiste rpondre au priphrique ayant dclench cette interruption. Une fois
termin, le processeur revient au programme interrompu et reprend sont excution normale.
Plusieurs sources dinterruption peuvent exister. Dans ce cas on peut dfinir un niveau
de priorit entre elle, de faon ce quune routine dirruption puisse tre privilgie ou tre
elle-mme interrompu. On peut galement empcher momentanment une interruption dagir.
Dans ce cas, on dit quelle est masque.
MIPS-R3000 dispose de 6 sources dinterruption matrielles qui peuvent tre masque
globalement ou individuellement. Lactivation dune ligne dinterruption non masque fait
passer le processeur en mode superviseur et se branche ladresse : 0x80000180. Ladresse
de retour est sauvegarde dans le registre EPC pour pouvoir reprendre le programme
interrompu.
Plus prcisment, le processeur MIPS effectue les tches suivantes chaque
interruption :

sauvegarder l'adresse de retour (PC + 4) dans le registre EPC
sauvegarder lancienne valeur du registre dtat SR
passer en mode superviseur et masquer momentanment les interruptions
mettre jour le registre CR pour indiquer la routine dinterruption, de quelle source
il sagit
se brancher ladresse 0x80000180 pour excuter la routine dinterruption.

En plus des 6 lignes d'interruption matrielles, le processeur R3000 possde un
mcanisme d'interruption logicielle. Le programme en excution peut dclencher ces
interruptions en mettant 1 les bits appropris du registre CR. Ladresse de branchement est
toujours (0x80000180). Toutes les interruptions auront donc le mme gestionnaire
dinterruption qui doit localiser la source dinterruption en examinant le registre CR.

8-2) les exceptions
Les exceptions sont des vnements "anormaux", le plus souvent lis une erreur de
programmation, qui empchent l'excution correcte de l'instruction en cours. La dtection
d'une exception entrane l'arrt immdiat de l'excution de l'instruction fautive. Ainsi, on
assure que l'instruction fautive ne modifie pas la valeur d'un registre visible ou de la mmoire.
Les exceptions ne sont pas masquables.
Le processeur R3000 dispose de 7 exceptions suivantes :
1. ADEL (Adresse illgale en lecture) : adresse non aligne ou se trouvant dans le segment
systme alors que le processeur est en mode utilisateur.
2. ADES (Adresse illgale en criture) : adresse non aligne ou accs une donne dans le
segment systme alors que le processeur est en mode utilisateur.
3. DBE (Data bus erreur) : le systme mmoire signale une erreur en activant le signal
BERR la suite d'un accs de donne.
4. IBE (Instruction bus erreur) : le systme mmoire signale une erreur en activant le signal
BERR l'occasion d'une lecture instruction.
5. OVF (Dpassement de capacit) : lors de l'excution d'une instruction arithmtique (ADD,
ADDI ou SUB), le rsultat ne peut tre reprsent sur 32 bits.
6. RI (Codop illgal) : le codop ne correspond aucune instruction connue (il s'agit
probablement d'un branchement dans une zone mmoire ne contenant pas du code
excutable.
7. CPU (Coprocesseur 0 inaccessible) : tentative d'excution d'une instruction privilgie
(MTC0, MFC0, RFE) alors que le processeur est en mode utilisateur.
Quand une exception se produit, le processeur passe en mode superviseur et se branche au
ladresse 0x80000180. Le processeur doit transmettre au gestionnaire d'exceptions l'adresse
de l'instruction fautive et indiquer dans le registre de cause le type d'exception dtecte.
Lorsqu'une exception est dtecte, le processeur :
sauvegarde l'adresse de l'instruction fautive dans le registre EPC
sauvegarde l'ancienne valeur du registre d'tat SR
passe en mode superviseur et masque les interruptions dans SR
crit le type de l'exception dans le registre CR
se branche l'adresse "0x80000180".

8-3) les appels systme
Un appel systme est un mcanisme permettant aux tches utilisateurs (ou systme) de
demander un service au systme dexploitation, comme par exemple une entre sortie.
Lappel se comporte comme une interruption logicielle et le programme appelant est repris
la fin de la routine associe.
MIPS-R3000 possde deux instructions permettant deffectuer des appels systme.
Linstruction SYSCALL et linstruction BREAK. SYSCALL est associe aux services du
systme dexploitation. En gnral, le numro du service et des paramtres ventuels sont
transmis via les registres gnraux du processeur. BREAK est utilis gnralement pour
dbuguer un programme. Elle permet darrter son excution des points dtermins.


Appels systme sous SPIM
Le simulateur SPIM simule une console dentre/sortie permettant au programmeur de
lire les donnes et dcrire les rsultats. Cette console est accessible aux utilisateurs en
utilisant les appels systme grce linstruction Syscall. Pour demander un service, le
programme appelant doit charger le code du service dans le registre $v0 et ventuellement
dautres arguments dans les registres $a0-$a3 (f12 dans pour les flottant). Si le service renvoie
un rsultat, il est retourn dans le registre $v0. La table III-4 donne les codes de services
implments sous SPIM ainsi que les arguments correspondants.

Service Code Argument Rsultat Commentaire
Print_int 1 $a0 = int
Imprime sur la console lentier transmis
dans $a0
Print_float 2 $f12 =float
Imprime le rel transmis dans $f12
Print_double 3 $f12 =double
Imprime le rel (sur 64 bits) transmis dans
$f12
Print_string 4 $a0 = string
Imprime la chane de caractre (termine
par 0) dadresse transmise dans $a0
Read_int 5
Entier (dans $v0) Lit un entier de la console et le met dans
$v0
Read_float 6
Rel (dans $f12) Lit un rel et le met dans $f12
Read_double 7
Double(dans
$f12)
Lit un rel (sur 64 bits) et le met dans $f12
Read_string 8
$a0= buffer,
$a1=lenth
Lit un ensemble de caractres de longueur
contenue dans $a1 et met ladresse dans $a0
sbrk 9 $a0=quantit
Adresse dans
$v0
Renvoie un pointer vers un bloc de donnes
de quantit donne
Exit 10
Arrte le fonctionnement du programme
Table III-3 Services implments dans SPIM


Exemple
Ecrire un programme permettant de lire deux entiers depuis la console SPIM et
afficher le rsultat de leur addition

.data
m1: .asciiz "Donnez le premier oprande"
m2: .asciiz "Donnez le deuxime oprande"
m3: .asciiz "Le rsultat est:"

.text
.globl main
main: li $v0, 4 # Code du service print_string
la $a0, m1 # Adresse de la chane afficher
syscall # appel systme pour afficher la chane
li $v0, 5 # Code du service read_int
syscall # appel systme pour lire un entier
add $t0, $v0, $zero # mettre l'entier lu dans $t0
li $v0, 4 # code de service print_string
la $a0, m2 # adresse du deuxime message a afficher
syscall # appel systme pour afficher message2
li $v0, 5 # lecture du deuxime oprande
syscall
add $t0, $t0, $v0 # effectuer l'addition
li $v0, 4 # affichage du message 3
la $a0, m3
syscall
li $v0, 1 # code du service print_int
add $a0, $t0, $zero
syscall # Affichage du rsultat

8-4) Le signal RESET
Le processeur dispose galement dune ligne dont lactivation entrane lexcution
dun programme spcial de rinitialisation. Cette ligne se comporte comme une ligne
dinterruption sauf quelle nest pas masquable, elle possde une adresse propre et quelle ne
sauvegarde pas ladresse de retour.
La ligne RESET du processeur MIPS-R3000 doit tre active pendant, au moins, un
cycle dhorloge. Une fois activ, le processeur passe en mode superviseur, masque toutes les
interruptions et se branche ladresse 0xBFC00000

9) le mode superviseur
Le mode superviseur (ou protg) offre les mcanismes ncessaires pour mettre en
place un systme dexploitation permettant de grer les processus, la mmoire et les
priphriques. Certains registres du processeur ne sont accessibles quen mode protg et ne
peuvent tre manipuls que par des instructions spcifiques ce mode (typiquement les
instruction mfc0 et mtc0). Tous les gestionnaires dexception, toutes les routine
dinterruptions et les routines systme (accessibles par les appels systme) sont en fait des
modules du systme dexploitation.
MIPS-R3000 offre particulirement 4 registres accessibles en mode protg ; SR, CR,
EPC et BAR. Nous allons tudier en dtail les deux registres SR et CR.

9-1) Le registre SR (Status Register)
Le registre SR dcrit ltat du processeur. Seules les 16 bits de poids faible sont
utilises. Les autres bits de poids fort ainsi que les bits 6 et 7 du poids faible sont toujours
zro. La figure III-5 montre le format du registre.




Figure III-5 format du registre SR
IEC : est le masque global des interruptions de ltat courant. Un 0 dsactive toutes les
interruptions et un 1 active toutes les interruptions non masques individuellement
KUC : est le mode de fonctionnement actuel du processeur
0=superviseur, 1= utilisateur.
IEP et KUP reprsentent le masque global et le mode de fonctionnement de ltat
prcdant une interruption ou une exception. Le processeur les met jour chaque
interruption ou exception en faisant un dcalage gauche de deux positions
KUO et IEO reprsente le masque global et le mode de fonctionnement de ltat
antrieur (ltat avant ltat prcdent). Cela permet de garder trace de trois tats
distincts, comme dans le cas dune interruption prioritaire qui arrive pendant le
traitement dune autre interruption.
MSWI (0 et 1) : ces deux bits reprsentent les masques individuels des deux
interruptions logicielles SWI0 et SWI1. Un zro sur le bit masque linterruption
correspondante et un 1 active linterruption correspondante
MIRQ (0 5) : ces 6 bits reprsentent les masques individuels des 6 lignes
dinterruption externes du processeur MIPS. Un 0 sur un bit dsactive linterruption
correspondante et un 1 active linterruption correspondante
Quand une interruption (ou une exception) est dclenche, le registre SR est mis jour
par le processeur. Cela permet de sauvegarder ltat actuel, le passage au mode superviseur et
de dsactiver momentanment les interruptions. Ceci est ralis en une seule opration en
faisant un dcalage gauche des 6 bits de poids faibles du registre SR comme le montre la
figure III-5 (a). La restauration de lancien tat est ralise grce linstruction de retour
ERET (ou RFE) qui effectue un dcalage droite des 6 bits du registre SR comme le montre
la figure III-5-b. Les autres bits du registre SR ne sont pas modifis.







(a) Arrive dune interruption (b) Retour dinterruption
(Sauvegarde de ltat actuel) (restauration de ltat actuel)
Figure III-6 sauvegarde et restauration de ltat du processeur
0 1
IEC KUC
2 3
IEP KUP
5
IEO KUO
4 6 7
MSWI
0 0
8 9
MIRQ
10 12 11 13 14 15
0 1 0 1 2 3 4 5
16 31
0 .0
0 1
IEC KUC
2 3
IEP KUP
5
IEO
4
KUO
0 0 IEP KUP IEO KUO
0 1
IEC KUC
2 3
IEP KUP
5
IEO
4
KUO
IEC KUC IEP KUP IEO KUO
9-2 le registre CR (Cause Register)
Le registre CR est gr par le processeur pour permettre au superviseur de signal aux
programmes la cause dune interruption ou exception. A chaque arrive dun tel vnement, le
processeur met jour ce registre. Son format est le suivant :




Figure III-7 format dur registre SR
XCODE : indique le code correspondant linterruption ou lexception. Les codes sont
les suivants :

Code Des Cause Code Des Cause
0000 INT Interruption 1000 SYS Syscall (appel systme)
0001 Inutilis 1001 BP BREAK (Point darrt)
0010 Inutilis 1010 RI Codop illgal
0011 Inutilis 1011 CPU Coprocesseur inaccessible
0100 ADEL Adresse illgale en
lecture
1100 OVF Ovrflow arithmtique
0101 ADES Adresse illgale en
criture
1101 Inutilis
0110 IBL Bus erreur sur accs
instruction
1110 Inutilis
0111 DBE Bus erreur sur accs
donnes
1111 Inutilis

SWI : indique la prsence dinterruption logicielle. Un 1 su un bit du champ indique que
linterruption logicielle correspondante est dclenche.
IRQ : indique la prsence dune interruption matrielle. Un 1 sur un bit de ce champ
indique qu linterruption correspondante sest dclenche.

Exemple dimplmentation dun gestionnaire dexception
Ecrire le code superviseur permettant de protger en criture la zone mmoire rserve
au systme dexploitation. Quand un utilisateur tente dcrire dans cette zone, le systme doit
prendre la main, afficher un message derreur puis rendre la main au programme utilisateur en
sautant linstruction fautive.

.kdata # utilisation de lespace mmoire du superviseur
err: .asciiz "Erreur de protection mmoire :Cette zone est protge en criture"

.ktext 0x80000180 # Adresse du gestionnaire dexception
mfc0 $k0, $13 # Charger le registre Cause dans $k0
mfc0 $k1, $14 # Charger le registre EPC dans $K1
andi $k0, $K0, 0x003C # extraire le code de l'exception
srl $K0, 2 # ignorer les deux bits de poids faibles (dcalage droite
# de deux positions
li $t0, 0x5 # code derreur ADES (0101)
bne $k0, $t0, suite1 # aller vers un autre type dexception
la $a0, err # adresse du message dans $a0
li $v0, 5 # service systme print_string
0 1
0 0
2 3
XCODE
5 4 6 7
SWI
0 0
8 9
IRQ
10 12 11 13 14 15
0 1 0 1 2 3 4 5
16 31
0 .0
syscall # Afficher le message d'erreur
addiu $k1, $k1, 4 # sauter l'instruction fautive
mtc0 $k1, $14 # remettre jour l'adresse de retour
eret # retour d'interruption
suite1: ................. # Traitement d'autres interruptions ou exceptions

# Programme utilisateur qui essaye de lire dans une zone protge
.data
m : .asciiz " message quelconque "

.text
.globl main
main: li $t0, 0xFFFFFFFF # charger $T0 par une adresse de lespace
# superviseur
sw $t1, 0($t0) # tentative dcriture dans cette zone
la $a0, m # suite du programme, affichage dun
li $v0, 1 # message quelconque
syscall
suite2 ............... # suite du programme utilisateur
Quand le processeur tentera dexcuter linstruction sw $t1, 0(t0) il sapercevra quil
est en mode utilisateur. Il dclenchera alors lexception de code ADES qui sera prise en
charge par notre gestionnaire.