Académique Documents
Professionnel Documents
Culture Documents
CHAP 0 Révision:
Ce chapitre est une révision des cours présentés en première année. Il présente un pré requis pour
ce module. En résumé, vous avez une semaine pour lire, comprendre et faire tous les exercices qui
vous seront proposés sur cette partie. Si vous trouvez des difficultés, demandez des explications à
vos enseignants de TD.
I. Systèmes de numération
1. Introduction :
Depuis le début des temps, des dizaines de systèmes de numération ont été créés pour répondre à
des besoins de mesures de quantité et de grandeur. On raconte, qu'avant l'avènement d’un système de
numération, un berger se servait de cailloux pour compter les moutons. C'est à partir de besoins de
cette nature que les systèmes de numération ont été inventés.
Notre système de numération repose essentiellement sur la base 10 (surement à cause des 10
doigts des deux mains). On trouve aussi un certain nombre d'occurrences de nombres exprimés dans
d'autres systèmes de notation, telle que la base 60 pour compter les secondes et les minutes, la base
12 pour compter les heures, etc.
L'ordinateur a 2 états significatifs (impulsion électriques). Le système de numération qu'il em-
ploie est donc le système binaire. Il est donc nécessaire de développer des techniques de conversions
de notation afin de pouvoir transcrire des nombres d'un système de notation dans un autre. A titre
d'exemple, les ordinateurs actuels convertissent constamment les nombres représentés en base 10
vers un système en base 2.
Ce paragraphe présente, quelques méthodes de conversion, nous utiliserons les bases 2, 8,10 et16.
2. Généralités.
Définition : Une base est le nombre par lequel on doit multiplier une unité pour passer d’un ordre
au suivant. C’est le nombre qui sert à définir un système de numération. La base du système décimal
est 10 alors que celle du système octal est 8.
D'une manière générale, le nombre anan-1...a2a1a0 si il est exprimé en base b ne pourra comporter
que des chiffres ai compris entre 0 et b-1. Notons ai la suite des chiffres utilisés pour écrire un
nombre x = an an-1 ... a1 a0 a0 est le chiffre des unités.
• En décimal, b=10, ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
• En binaire, b=2, ai ∈ { 0, 1 } : 2 chiffres binaires, ou bits;
• En Octal ; b = 8; ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7};
• En hexadécimal, b=16, ai ∈ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F } (on utilise les 6
premières lettres comme des chiffres).
La notation ( )b indique que le nombre est écrit en base b. Nous utiliseront aussi les lettres B, ∅, H
à la fin d’un nombre écrit en binaire, en octale ou en hexadécimal.
Dans le cas général, en base b, le nombre représenté par une suite de chiffres an an-1 ... a1 a0 est donné
par:
an * bn + an-1 * bn-1 + ... + a2 * b2 + a1 * b + a0 calculée en base 10.
a0 est le chiffre de poids faible, et an le chiffre de poids fort.
Exemple:
( 101101 )2 = 1*25+0*24+1*23+1*22+0*21+1*20=32+8+4+0+1 = 45
3 2
(6172)8 = 6*8 + 1*8 + 7*8 + 2 = 3194
4 3 2
(7A8BD)16 = 7*16 +10*16 +8*16 +11*16 +13 = 501949
Remarque: Dans un système à base b et sur n positions. On peut représenter les nombres de
n
0 à (b - 1)
5. Opérations arithmétiques
Les opérations arithmétiques s'effectuent en base quelconque b avec les mêmes méthodes qu'en base
10. Une retenue ou un report apparaît lorsque l'on atteint ou dépasse la valeur b de la base.
En exposant les principes des systèmes de numération de position, nous avons déjà vu comment con-
vertir les nombres de base 8, base 2 et base 16 en nombres décimaux.
Exemple en hexadécimal:
(AB)16 = 10*161 + 11*160 =160 + 11 = 171
1383 = ( ? )8
1383 ÷ 8 = 172 reste 7
172 ÷ 8 = 21 reste 4
21 ÷ 8 = 2 reste 5
2 ÷ 8 = 0 reste 2 1383 = (2547) 8
31838 = ( ? )16
31838 ÷ 16 = 1989 reste 14 = EH
1989 ÷ 16 = 124 reste 5
124 ÷ 16 = 7 reste 12 = CH
7 ÷ 16 = 0 reste 7 31838 = (7C5E) 16
Nombres fractionnaires On multiplie la partie fractionnaire par la base en répétant l'opération
sur la partie fractionnaire du produit jusqu'a ce qu'elle soit nulle (ou que la précision voulue soit
atteinte).
Pour la partie entière, on procède par divisions comme pour un entier.
Exemple: conversion de 54,25 en base 2
Partie entière: 54 = (110110)2 par divisions.
Partie fractionnaire:
0.25 * 2 = 0.5 a-1 = 0
0.5 * 2 = 1.0 a-2 = 1
0.0 * 2 = 0.0 a-3 = 0 donc 54.25 = (110110.01)2
0.6875 = ( ? )2
0.6875 * 2 = 1 . 375
0.375 * 2 = 0 . 75
0.75 * 2 = 1.5
0.5 * 2 = 1.0 0.6875 = (0,1011) 2
0.6953125 = ( ? )8
0.6953125 * 8 = 5.5625
0.5625 * 8 = 4.5
0.5 * 8 = 4.0 0.6953125 = (0.544)8
0.6 = ( ? )16
0.6 * 16 = 9 . 6
0.6 * 16 = 9 . 6 0.6 = (0.99999) 16
Cas des bases 2, 8 et 16
Ces bases correspondent à des puissances de 2 (21, 23 et 24), d'où des passages de l'une à l'autre très
simples. Les bases 8 et 16 sont pour cela très utilisées en informatique, elles permettent de représen-
ter rapidement et de manière compacte des configurations binaires.
La base 8 est appelée notation octale, et la base 16 notation hexadécimale.
0T 0T 0T 0T
Chaque chiffre en base 16 (24) représente un paquet de 4 bits consécutifs. Par exemple:
(1010011011)2 = (0010 1001 1011)2 = (29B)16
3
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels
Le Bit
Bit signifie "binary digit", c'est-à-dire 0 ou 1 en numérotation binaire. C'est la plus petite unité
d'information manipulable par une machine.
On peut le représenter physiquement:
• par une impulsion électrique qui correspond à la valeur 1 ou une absence d'impulsion qui cor-
respond à la valeur 0.
• par des alvéoles ou des espaces dans une surface (CD-ROM)
• grâce à des bistables, c'est-à-dire des composants qui ont deux états d'équilibre (un correspond
à l'état 1, l'autre à 0)
Avec un bit on peut avoir deux états différents : soit 1, soit 0.
Avec 2 bits on peut avoir quatre états différents (2*2): 0 0 0 1 1 0 11
Avec 3 bits on peut avoir huit états différents (2*2*2):
000 001 010 011 100 101 110 111
Avec 8 bits on a 2*2*2*2*2*2*2*2=256 possibilités, c'est ce que l'on appelle un octet.
Cette notion peut être étendue à n bits : on a alors 2n possibilités.
L'octet
L'octet est une unité d'information composée de 8 bits. Il permet de stocker un caractère, tel qu'une
lettre, un chiffre ...
Un kilo-octet (Ko) ne vaut pas 1000 octets mais 210 octets = 1024 octets
Un méga-octet (Mo) vaut 210 Ko = 1024 Ko = 220 octets = 1 048 576 octets
Un giga-octets (Go) vaut 210 Mo = 1024 Mo = 230 octets = 1 073 741 824 octets
Un téra-octet (To) vaut 210 Go = 1024 Go = 240 octets = 1 099 511 627 776 octets
Les octets sont regroupés en mot-mémoire. La longueur d'un mot-mémoire varie d'une ma-
chine à l'autre (8, 16, 24, 32, 64 bits) la longueur des mot-mémoires est une caractéristique impor-
tante dans l'architecture d'un ordinateur.
4
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels
Exemple: soit à coder la valeur -2 sur 8 bits. On exprime 2 en binaire, soit 00000010. On inverse les
bits On obtient 11111101. On ajoute 1 et on a le résultat: 1111 1110.
Remarques:
a. le bit de poids fort d'un nombre négatif est toujours 1;
b. sur n bits, le plus grand entier positif est 2n-1 - 1 = 011….1;
c. sur n bits, le plus petit entier négatif est -2n-1.
5
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels
Virgule flottante
e
Un nombre réel x = ± m* b est représenté par un signe, une mantisse m, un exposant e, et une
base b.
Il existe une infinité de représentation du même nombre. Représentation normalisée : pour une base
b, la mantisse est prise dans l'intervalle [1, b[ (zéro admet une représentation particulière).
La précision et l'intervalle de valeurs représentées dépendent du nombre de bits utilisés pour coder la
mantisse et l'exposant.
Norme IEEE754
La norme IEEE 754 est la norme la plus utilisée pour représenter les réels.
• nombres codés sur 32 bits (simple précision), ou 64 bits (double précision)
• la mantisse appartient à l'intervalle [1,0 10,0[ (en binaire)
• le seul chiffre à gauche de la virgule étant toujours 1, n'est pas représenté
• l'exposant E est codé avec un excès de 127 (simple précision) ou 1023 (double précision) (i.e.
E = e+127 ou E = e+1023)
Précision
La représentation des nombres réels sur une machine se base sur un nombre fini de valeurs. C'est
donc une représentation approchée.
Précision de la représentation = différence entre les mantisses de deux nombres réels consécutifs.
! La précision ne dépend que de la mantisse.
En conséquence de ces limites, il existe donc un nombre limité de nombres représentables sur machine.
Remarques:
1. Le zéro : le zéro est le seul nombre qui ne peut pas se représenter dans le système en virgule
flottante à cause de la contrainte de non nullité du premier
digit.
2. Les exposants 00000000 et 11111111 sont interdits:
• l'exposant 00000000 signifie que le nombre est dénormalisé;
• l'exposant 11111111 indique que l'on n'a pas affaire à un nombre (on note cette configu-
ration NaN, Not a Number, et on l'utilise pour signaler des erreurs de calculs, comme par
exemple une division par 0).
3. Les plus petit exposant est donc -126, et le plus grand +127.
4. Dépassement de capacité : Si l'on cherche à représenter un nombre très petit, on produit un
débordement par valeur inférieure (underflow). Si l'on cherche à représenter un nombre très
grand, on produit un débordement par valeur supérieure (overflow).
CODE Excédent-3
Chaque chiffre décimal est codé séparément en son équivalent binaire
+ 3.
Exemple 4850 est codé par 0111 1011 1000 0011
Au cours d’une addition, le chiffre décimal est augmenté de 6; en lui retirant systématiquement 3, le
résultat sera codé en code excédent-3. Si une addition de ce type conduit à une retenue du cinquième
ordre binaire, il faudra au contraire ajouter 3 aux deux ordres décimaux pour que les chiffres corres-
pondants se retrouvent en code excédent-3.
7
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels
Pour bien lire le tableau, il faut construire le code hexadécimal en prenant d'abord le digit de la ligne,
puis le digit de la colonne. Par exemple, la lettre "n" a pour code hexadécimal 6E
Plusieurs points importants à propos du code ASCII:
• Les codes compris entre 0 et 31 ne représentent pas des caractères, ils ne sont pas affichables.
Ces codes, souvent nommés caractères de contrôles sont utilisés pour indiquer des actions
comme passer à la ligne (CR, LF), émettre un bip sonore (BEL), etc.
• Les lettres se suivent dans l'ordre alphabétique (codes 65 à 90 pour les majuscules, 97 à 122
pour les minuscules), ce qui simplifie les comparaisons.
• On passe des majuscules aux minuscules en modifiant le 5ième bit, ce qui revient à ajouter 32
au code ASCII décimal.
• Les chiffres sont rangés dans l'ordre croissant (codes 48 à 57), et les 4 bits de poids faibles
définissent la valeur en binaire du chiffre.
de la validité des données est nécessaire pour certaines applications (professionnelles, bancaires, in-
dustrielles, confidentielles, relatives à la sécurité, ...). C'est pourquoi il existe des mécanismes per-
mettant de garantir un certain niveau d'intégrité des données.
1. Le contrôle de parité
La plupart des systèmes de contrôle d'erreur sont basés
sur un ajout d'information permettant de vérifier la vali-
dité des données.
Le contrôle de parité est un des systèmes de contrôle les
plus simples. Il consiste à ajouter un bit supplémentaire
(appelé bit de parité) à un certain nombre de bits de
données (généralement 7, pour former un octet avec le
bit de parité) dont la valeur (0 ou 1) . la valeur est telle
que le nombre total de bit à 1 (calculé sur m+1) est pair ou impair. Si la parité n’est plus respectée,
l’erreur est détectée, mais s’il y a double erreur, la parité est aussi respectée et alors l’erreur n’est
plus détectée.
2. Double parité:
En plus du contrôle par octet (horizon-
tal), on ajoute une parité par bit pour un
bloc d’information (parité longitudinal).
Ce double contrôle permet de détecter un
nombre impair d’erreur et parfois de cor-
riger certaines erreurs.
3. Le code de Hamming:
est basé sur les tests de parité pair et ne permet de corriger qu’un bit en erreur.
Au m bits d’information, on ajoute k bits de contrôle. Pour que les bits de contrôle puissent coder les
m+k+1 possibilités d’erreurs (dont l’absence d’erreur) ,il faut que 2k >= m+k+1. Les bits sont numé-
rotés de 1 à m+k et Les bits de test sont placés en position 1, 2, 4, 8, . . (puissance de 2). Chaque bit
est contrôlé par les bits qui additionnés donnent le numéro de ce bit. Ainsi
Le bit 1 contrôle les bits 1, 3, 5, 7, 9, 11, 13, 15, 17,. . . . .
Le bit 2 contrôle les bits 2, 3, 6, 7, 10, 11, 14, 15, . . . .
Le bit 4 contrôle les bits 4, 5, 6, 7, 12, 13, 14, 15 . . . . .
Le bit 8 contrôle les bits 8, 9, 10, 11, 12, 13, 14, 15, 24 . . .
Exemple:
Soit l’information composée de 8 bits m7,m6,m5, m4,m3,m2, m1,m0
Il faut donc 4 bits de contrôle k3,k2, k1,k0 .
L’information avec contrôle devient m7,m6,m5, m4, k3,m3,m2, m1, k2,m0, k1,k0
Si L’information est: 10110101 Après L’ajout des bits de contrôle On obtient
1011 1 010 0 1 10
On suppose que le bit 10 est détérioré (inversé) lors d'une transmission, 10 0 1 1 010 0 1 10 .
Après calcule des parités pour les bits de contrôle, on obtient 1010
9
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Rappels
10
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
Structure de la MP
La mémoire est divisée en emplacements de taille fixe (par exemple 8 bits) utilisés pour stocker
instructions et données.
En principe, la taille d'un emplacement mémoire pourrait être quelconque; en fait, la plupart des
ordinateurs en service aujourd'hui utilisent des emplacements mémoire d'un octet (byte en anglais,
soit 8 bits, unité pratique pour coder un caractère par exemple).
11
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
12
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
b) L’unité arithmétique et logique (UAL) ou unité de traitement, Elle comporte des dispositifs
électroniques capables d'effectuer des opérations logiques et arithmétiques sur les codes binaires,
son rôle est d’effectuer les opérations de base, un peu comme le ferait une calculette.
Elle possède les registres suivants :
• Les registres arithmétiques.
• Les registres de base et d’index (calcul d’adresse
par rapport à une base ou index).
• Les registres banalisés (ex : stockage de résultats
intermédiaires).
• Le registre d’état PSW (Program Status Word)
(Flags : F) A chaque opération, le microprocesseur posi-
tionne un certain nombre de bits. Ces bits sont appelées
aussi indicateurs d'état ou drapeaux (status, flags). Par
exemple, si une soustraction donne un résultat nul, l'indi-
cateur de zéro ( Z ) sera mis à 1. Ces indicateurs sont re-
groupées dans le registre d'état
- le séquenceur câblé qui est un circuit séquentiel complexe mais d’exécution très rapide.
- le séquenceur micro programmé contenu dans une ROM qui est plus simple à utiliser et à conce-
voir, mais moins rapide.
• L’horloge qui synchronise toutes les actions de l’unité centrale.
13
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
Dans les nouvelles architectures l’UAL et l’unité de contrôle sont regroupés en un seul dispositif
« le processeur » ou microprocesseur. Un ordinateur se compose donc principalement d'un proces-
seur (CPU), de mémoire (RAM et ROM), et de composants périphériques (Clavier, port série, con-
trôleur en tout genre, carte son....). Le CPU est bien sur le maître à bord dans un ordinateur (comme
dans une console de jeux d'ailleurs), la mémoire et les périphériques étant à son service. Le CPU est
connecté aux périphériques et à la mémoire à l'aide d'un BUS.
2. Le BUS
Le BUS est une chaîne ou tous les périphériques sont connectés en parallèle. Un BUS système se
divise généralement en trois sous BUS:
- Le BUS de données (c'est la partie qui transporte les données brutes). Notons que plus ce bus est
large plus le système sera rapide. En effet un système 16 Bits est plus rapide qu'un système 8 bits car
il est capable de 'transporter' 2 octets à la fois alors que le système 8 bits n'en transporte qu'un à la
fois (1 octet = 8 bits)
- Le BUS d'adressage (c'est celui qui désigne un endroit dans la mémoire ou un périphérique).
Plus il est large plus on peut adresser de la mémoire. Exemple: bus d'adressage 16bits =64Ko adres-
sables, bus 32bits = 4Go!)
- Le BUS de contrôle (il désigne le mode de l'opération à effectuer: Lecture ou écriture, périphé-
rique ou Mémoire, Interruption, etc.)
3. Les registres
C'est l'ensemble des emplacements facilement spécifiables qui contiennent temporairement les
opérandes et les résultats des opérations ou des données comme une instruction ou une adresse. Se
sont des petites mémoires internes à accès très rapides. Chaque registre stocke 8, 16,32 ou 64 bits. Le
nombre exact de registres dépend du type de processeur et varie typiquement entre une dizaine et une
centaine.
Il n'est absolument pas nécessaire que les registres soient homogènes bien qu'on puisse souvent
grouper les registres en classes, de sorte que les registres d'une classe peuvent être utilisés à la place
14
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
de n'importe quel autre registre de la même classe. Mais il n'est pas rare qu'une classe ne comporte
qu'un seul registre.
Les architectures ont quasiment toutes au moins deux classes de registres: une pour stocker les
valeurs entières, une pour stocker les nombres représentés en virgule flottante. Mais souvent, l'espace
de travail comporte des registres ayant des fonctions particulières.
Un accumulateur : est un registre servant de source implicite à la plupart des instructions et con-
tenant le résultat après leur exécution.
Les registres d'index : sont des registres servant au calcul d'adresse.
Un pointeur de pile : indiquant l'adresse du sommet d'une pile gérée par le processeur.
Un frame pointer : servant à accéder aux données locales de la routine en cours d'exécution.
Certains registres ont un comportement particulier: ils informent de l'état du processeur ou con-
tiennent des informations à propos des dernières opérations effectuées (par exemple un indicateur
indiquant si le dernier résultat était nul ou pas). Parmi ces registres particuliers on trouve souvent:
Le compteur ordinal (program counter, instruction pointer) : indiquant l'adresse de l'instruction
en cours d'exécution ou de la prochaine instruction à exécuter;
le mot d'état : regroupant les informations les plus importantes sur l'état du processeur.
4. Notion de programme
Un programme est une suite d'instructions élémentaires, qui vont être exécutées dans l'ordre par le
processeur. Ces instructions correspondent à des actions très simples, comme additionner deux
nombres, lire ou écrire une case mémoire, etc. Chaque instruction est codifiée en mémoire sur
quelques octets.
Le processeur est capable d'exécuter des programmes en langage machine, c'est à dire composés
d'instructions très élémentaires suivant un codage précis. Chaque type de processeur est capable
d'exécuter un certain ensemble d'instructions, son jeu d'instructions.
Pour écrire un programme en langage machine, il faut donc connaître les détails du fonctionne-
ment du processeur qui va être utilisé.
Recherche de l'instruction
Le contenu de PC (compteur ordinal) est placé sur le bus des adresses (c'est l'unité de commande qui
établit la connexion).
L'unité de commande positionne le compteur ordinal (PC) pour l'instruction suivante.
L'unité de commande (UC) émet un ordre de lecture (READ=RD=1)
Au bout d'un certain temps (temps d'accès à la mémoire) le contenu de la case mémoire sélectionné
est disponible sur le bus des données.
L'unité de commande charge la donnée dans le registre d'instruction pour décodage.
15
Architecture des Ordinateurs 2eme année LMD Informatique CHAP I : Modèle de Von Neumann
Décodage
Le registre d'instruction contient maintenant le premier mot de l'instruction qui peut être codée sur
plusieurs mots. Ce premier mot contient le code opération qui définit la nature de l'opération à ef-
fectuer (addition, rotation,...) et le nombre de mots de l'instruction. L'unité de commande décode le
code opération et peut alors exécuter l'instruction.
L'exécution
Le micro-programme réalisant l'instruction est exécuté.
Les indicateurs sont positionnés (registre d'état).
Stockage des résultats à leurs destinations respectives.
Retour à l'étape 1 pour exécuter l'instruction suivante.
Lecture de l’instruction
(Incrémentation de PC
Décodage de l’instruction
Opération
Rangement du résultat
16
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Dans l’architecture MIPS R3000, l’espace adressable est divisé en deux segments: le segment uti-
lisateur, et le segment système (noyau).
17
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
18
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
19
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
BAR : Registre d’adresse illégale (Bad Address Register). En cas d’exception de type "adresse
illégale", il contient la valeur de l’adresse mal formée. (Ce registre possède le numéro 8)
Les arguments
La plupart des instructions nécessitent un ou plusieurs arguments. Si une instruction nécessite plu-
sieurs arguments, ces arguments sont séparés par des virgules. Dans une instruction assembleur, on
aura en général comme premier argument le registre dans lequel est mis le résultat de l’opération,
puis ensuite le premier registre source, puis enfin le second registre source ou une constante.
Exemple 1:
add $v1, $v0, $at # équivalent à $v1 ← $v0 + $at
Règle syntaxique
On définit ci-dessous les principales règles d’écriture d'un programme source.
Les noms de fichiers
Les noms des fichiers contenant un programme source en langage d’assemblage doivent être suf-
fixé par « .s ». Exemple: monprogramme.s
Les commentaires
Ils commencent par un # et s’achèvent à la fin de la ligne courante.
Exemple 2:
###############################################
# Source Assembleur MIPS de la fonction memcpy #
###############################################
Les entiers
Une valeur entière décimale est notée 250 (sans préfixe), et une valeur entière hexadécimale est
notée 0xFA (préfixée par zéro suivi de x). En hexadécimal, les lettres de A à F peuvent être écrites
en majuscule ou en minuscule.
Les chaînes de caractères
Elles sont simplement entre guillemets, et peuvent contenir les caractères d’échappement du langage
C. Exemple : "Oh la jolie chaîne avec retour à la ligne\n".
Les labels
Ce sont des mnémoniques correspondant à des adresses en mémoire. Ces adresses peuvent être
soit des adresses de variables stockées en mémoire (principalement dans la section data), soit des
adresses de sauts (principalement dans la section text). Ce sont des chaînes de caractères qui doivent
commencer par une lettre, un caractère « _ », ou un caractère « . ». Lors de la déclaration, ils doivent
être suffixés par le caractère « : ». Pour y référer, on supprime le « : ».
Exemple 3:
.data
message: .asciiz "Ceci est une chaîne de caractères...\n"
.text
20
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
_start:
lui $a0, message >> 16
ori $a0, $a0, message & 0xFFFF # adresse de la chaîne dans $a0
ori $v0, $zero, 4 # code de l’appel système dans $v0
L'adressage mémoire
Le MIPS ne possède qu’un unique mode d’adressage pour lire ou écrire des données en mémoire:
l’adressage indirect registre avec déplacement. L’adresse est obtenue en additionnant le déplacement
(positif ou négatif) au contenu du registre.
Exemple 4:
lw $t4, 13($t2) # $t4 ← Mem[$t2 + 13]
sw $s4, -60($s6) # Mem[$s6 - 60] ← $s4
S’il n’y a pas d’entier devant la parenthèse ouvrante, le déplacement est nul. Pour ce qui concerne les
sauts, il faut nécessairement utiliser des labels.
Quelques notations:
Mem[ad] : Contenu de la mémoire d’adresse ad
|| : Concaténation entre deux chaînes de bits
Bn : Réplication du bit B n fois dans une chaîne de bits
X p..q : Sélection des bits p à q dans une chaîne de bits X
3. Jeu d’instructions
Le jeu d’instructions est "orienté registres". Cela signifie que les instructions arithmé-
tiques et logiques prennent leurs opérandes dans des registres et rangent le résultat dans un
registre. Les seules instructions permettant de lire ou d’écrire des données en mémoire effec-
tuent un simple transfert entre un registre général et la mémoire, sans aucun traitement arith-
métique ou logique. La plupart des instructions arithmétiques et logiques se présentent sous
les 2 formes registre-registre et registre-immédiat:
21
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
22
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Lui Chargement d’une constante dans les poids forts d’un registre
Syntaxe : lui $rr, imm
Description : La constante immédiate de 16 bits est décalée de 16 bits à gauche, et est
complétée de zéro à droite. La valeur sur 32 bits ainsi obtenue est placée
dans le registre $rr.
rr ← imm 15.. 0 || 016
Exception: pas d’exception
Exceptions: - Adresse dans le segment noyau alors que le processeur est en mode utilisateur.
- Adresse correspondant à un segment non défini
25
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Mthi Move to HI
Syntaxe : mfti $ri # hi ← $ri
Mtlo Move to LO
Syntaxe : mtlo $ri # lo ← $ri
Un programme en assembleur contient obligatoirement une zone d’instructions dont le début est
repéré par la directive .text. La première instruction à exécuter (point d’entrée du programme)
doit être repérée avec l’étiquette __start: (avec deux underscores).
.text
....
....
__start:
....
....
Si le programme nécessite une zone de données en mémoire, le début de cette zone est repéré par la
directive .data. D’autres directives sont disponibles pour déclarer et initialiser des variables.
L’ordre des zones instructions et données n’a pas d’importance.
x: .word 40
s: .word 0
ori $v0, $zero, 10 # appel système N°10 pour terminer le programme (exit
(0))
syscall
Instructions de branchements:
Beq Branchement si registre égal registre
Syntaxe : beq $ri, $rj, label
Description : Les contenus des registres $ri et $rj sont comparés. S’ils sont égaux,
le programme saute à l’adresse associée à l’étiquette par l’assembleur.
if (ri = rj) pc ← adresse associée à label
Exception: pas d’exception
27
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Exemple 13: un programme qui passe une chaîne de caractères en majuscules. On utilise un ET
logique pour masquer le bit 5 du caractère et le passer en majuscule (voir le code ASCII).
Données :
- $a1 : pointeur sur la chaine
Programme C Programme assembleur
char *maj(char *s ) maj:
{ addi $v1, $a1, 0 # $v1 = $a1
char *c ; loop:
c=s; lb $a2, 0 ($v1)
while (*s != ‘\0’) beq $a2, $zero, end
{ andi $a2, $a2, 0xDF # $a2 = $a2 and 11011111b
*s = *s & 0xDF; sb $a2, 0($v1)
s++ ; addi $v1, $v1, 1
} J loop
return(c) ; end:
} Jr $ra # Retour Fonction
pgcd( 105, 75)= pgcd( 30, 75) = pgcd( 30, 45) = pgcd( 30, 15) = pgcd( 15, 15) = pgcd( 0, 15) =15
Données :
- $a0 : valeur de a
- $a1 : valeur de b
- $v1 : valeur de retour
29
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Instructions de décalages:
Sll Décalage à gauche immédiat
Syntaxe : sll $rr, $ri, imm
Description : Le registre est décalé à gauche de la valeur immédiate codée sur 5 bits, des zé-
ros étant introduits dans les bits de poids faibles. Le résultat est placé dans le
registre $rr.
rr ← ri (31 - imm)..0 || 0imm
Exception: pas d’exception.
30
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
31
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Appels système
Pour exécuter certaines fonctions système, typiquement les entrées/sorties (lire ou écrire un
nombre, ou un caractère), il faut utiliser des appels système. Par convention, le numéro de l’appel
système est contenu dans le registre $v0, et son unique argument dans le registre $a0.
Cinq appels système sont actuellement supportés dans l’environnement de simulation :
écrire un entier :
Il faut mettre l’entier à écrire dans le registre $a0 et exécuter l’appel système numéro 1.
Typiquement, on aura :
ori $a0, 123 # met 123 dans l’argument
ori $v0, $zero, 1 # code de ’print_int’
syscall # affiche 123
lire un entier :
La valeur de retour d’une fonction — système ou autre — est positionnée dans le registre $v0. Ainsi,
lire un entier consiste à exécuter l’appel système numéro 5 et récupérer le résultat dans le registre
$v0.
ori $v0, $zero, 5 # code de ’read_integer’
syscall # $v0 contient ce qui a été lu
32
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
read_str:
.space 256
la $a0, read_str # charge le pointeur dans $a0
ori $a1, $zero, 255 # charge longueur max dans $a1
ori $v0, $zero, 8 # code de ’read_string’
syscall # lit la chaîne
quitter :
L’appel système numéro 10 effectue l’exit du programme au sens du langage C.
ori $v0, $zero, 10 # indique l’appel à exit
syscall # quitte pour de bon!
Exemple 16:
33
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
or or $1,$2,$3 $1 = $2 | $3
34
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Move to HI mthi $1 HI = $1
Move to LO mtlo $1 LO = $1
Branch if greater or equal zero bgez $1, label if ($1 >= 0 ) go to label
Branch if greater than zero bgtz $1, label if ($1 > 0 ) go to label
branchements
Conditionnels Branch if less or equal zero blez $1, label if ($1 <= 0 ) go to label
Branch if less than zero bltz $1, label if ($1 < 0 ) go to label
Branch if greater or equal zero and $ra = PC + 4;
bgezal $1, label
link if ($1 >= 0 ) go to label
$ra = PC + 4;
Branch if less than zero and link gltzal $1, label
if ($1 < 0 ) go to label
jump j label goto lable
branchements
jump and link jal label $ra = PC + 4; go to label
inconditionnel
jump register jr $ra PC = $ra ( i.e. return)
set less than immediate slti $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0
set less than unsigned sltu $1,$2,$3 if ($2 < $3) $1 = 1; else $1 = 0
set less than immediate unsigned sltiu $1,$2,100 if ($2 < 100) $1 = 1; else $1 = 0
35
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
.align expression
36
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Aligne le compteur d’adresse courant afin que expression bits de poids faible soient à zéro.
.align n
Cet opérateur aligne le compteur d’adresse sur une adresse telle que les n bits de poids faible soient à
zéro. Cette opération est effectuée implicitement pour aligner correctement les instructions, demi-
mots et mots.
Exemple 22
.align 2
.byte 12
.align 2
.byte 24
.asciiz Déclare et initialise une chaîne de caractères, en ajoutant un zéro binaire à la fin.
.asciiz chaîne, [chaîne,] : : :
Cet opérateur est strictement identique au précédent, la seule différence étant qu’il ajoute un zéro
binaire à la fin de chaque chaîne.
Exemple 21
message:
.asciiz "Bonjour, Maître!\n"
Tableaux
• Zone mémoire dans laquelle les données sont rangées les unes à la suite des autres
• Repéré par l’adresse du premier élément
• On accède aux différentes case par déplacement par rapport à la première
• Déclaration d’un tableau d’entiers de 32 bits
37
Architecture des Ordinateurs 2eme année LMD Informatique CHAP II : Microprocesseur MIPS R3000
Exemple 23 :
38
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
32 bits
Adresses
Croissantes
$sp - 8 Libre
$sp - 4 Libre
$sp Push Pop
Tout au début le registre de pile $sp est initialisé à 0x7FFF0000 (l'adresse juste au-dessus du seg-
ment .stack).
Push (empiler)
Pour notre pile de données 4-octets, ajouter un article signifie soustraire quatre de $sp et stoc-
ker l'article dans cette adresse. Cette opération s'appelle : empiler
Exemple : Empiler le contenu du registre $t0
subu $sp, $sp, 4 # Mettre à jour $sp ,
sw $t0, ($sp) # ranger $t0 au sommet de la pile .
Pop (dépiler)
Enlever un article d'une pile s'appelle dépiler. Dépiler un article signifie qu'il est copié à un
autre endroit et que l'indicateur de pile est ajusté.
Exemple : dépiler le sommet dans $t0
lw $t0, ($sp) # Copie le sommet dans $t0.
addu $sp, $sp,4 # $sp adresse l’élément avant .
39
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
A chaque appel de fonction est associée une zone dans la pile constituant le « contexte
d’exécution » de la fonction. Dans le cas des fonctions récursives, une même fonction peut être appe-
lée plusieurs fois et possédera donc plusieurs contextes d’exécution dans la pile. Lors de l’entrée
dans une fonction, les registres $t0 . $k0 sont disponibles pour tout calcul dans cette fonction ; mais
le contenu des registres utilisés doit être sauvegardé et restauré avant le retour au programme appe-
lant. Dans le cas général, un contexte d’exécution d’une fonction est constitué de trois zones qui sont,
dans l’ordre d’empilement:
3. Organisation de la pile
Dans le cas général, une fonction f souhaite appeler une fonction g. La fonction g possède des argu-
ments, utilise des registres et possède des variables locales.
La fonction f appelante doit effectuer la séquence suivante :
40
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
• décrémenter le pointeur de pile : $sp ← $sp - 4*na, de façon à réserver la place dans la
pile pour les arguments.
• écrire dans la pile les valeurs des na arguments de la fonction g, en mettant le premier argu-
ment à l’adresse pointée par $sp, le deuxième à $sp +4, etc...
• effectuer le branchement . la première instruction de la fonction appelée en utilisant une ins-
truction de type jal ou bgezal.
• incrémenter le pointeur de pile pour restaurer la valeur qu’il avait avant l’appel de la fonction
g: $sp ← $sp + 4*na
La fonction g appelée est découpée en trois parties. La première partie est le prologue, qui com-
mence par décrémenter le pointeur de pile de façon à réserver la place pour la sauvegarde du registre
$ra et des registres qui seront utilisés par g, ainsi que la place nécessaire aux variables locales de g.
Le prologue sauvegarde ensuite dans la pile : la valeur du registre $ra et les valeurs des registres qui
seront utilisés par g.
La deuxième partie est le corps de la fonction qui effectue les calculs, en utilisant les registres néces-
saires ainsi que les variables locales stockées dans la pile, puis écrit la valeur de retour dans le re-
gistre $v0.
La troisième partie est l’épilogue chargé de : restaurer les valeurs des registres sauvegardés dans la
pile, d’incrémenter le pointeur de pile pour lui redonner la valeur qu’il avait en entrant dans la fonc-
tion g.
Le prologue de la fonction g doit effectuer la séquence suivante:
• décrémenter le pointeur de pile: $sp ← $sp - 4*(nv + nr + 1)
• écrire successivement dans la pile suivant les adresses décroissantes la valeur du registres $ra
et des nr registres qui seront utilisés par le corps de la fonction.
• lire dans la pile les arguments de la fonction g et les stocker dans les registres utilisés par le
corps de la fonction g.
On note R(i) les registres utilisés par la fonction appelée, qui doivent être sauvegardés.
On note A(i) les registres utilisés dans l’appelant pour stocker les arguments.
On note P(i) les registres utilisés dans l’appelé pour la récupération des arguments.
On note v(i) les variables locales déclarées dans la fonction appelée
41
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
Organisation de la pile
A(na-1)
Zone des argu- … • A(i) : ième argument
ments A(1)
A(0) • R(i) : ième registre
$ra
• V(i) : ième variable locale
Zone de sauve- R(0)
garde des re- R(1) • na: nombre d’arguments
gistres …
R(nr-1) • nr: nombre de registres
V(0)
Zone des va- V(1) • nv: nombre de variables locales
riables locales
…
V(nv-1) adresse décroissante
42
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
Epilogue
a) Restaurer les valeurs des registres sauvegardés
b) Incrémenter le pointeur de pile pour revenir à sa valeur initiale lors du branchement à
la fonction
c) Se brancher à l’instruction suivante de la fonction appelante
Exemple 1:
5. Les arguments
Passage par valeur
1) Les arguments sont recopiés dans la pile
a) Les arguments ne sont modifiés que dans la pile
b) Toute modification dans la pile n’a aucune implication pour la fonction appelante
c) S’il y a beaucoup d’arguments, il faut beaucoup de place dans la pile
2) Une seule valeur de retour dans le registre $v0. Impossibilité de retourner plusieurs va-
leurs
43
Architecture des Ordinateurs 2eme année LMD Informatique CHAP III : La programmation structurée
Exemple 2:
factorial:
bgtz $a0, doit
int fact ( int n ) ori $v0, $zero, 1 # cas 0! = 1
{ jr $ra
if ( n <= 0 ) return (1) ; doit:
return ( n * fact (n − 1) ); subi $sp, $sp, 8 #
}; sw $s0, ($sp) #
sw $ra, 4($sp) # adresse
44
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
1. Les instructions
Il y a 57 instructions, de 3 types différents :
R : Register to Register – Register Type
I : Accès mémoire, branchements – Immediate Type
J : Instructions de sauts (non-conditionnels) : Jump Type
Le format R est utilisé par les instructions nécessitant 2 registres sources (désignés par RS et
RT) et un registre résultat désigné par RD.
Exemple: add R3, R4, R5
On aurait R3 dans RD, R4 dans RS, R5 dans RT.
Le format I est utilisé par les instructions de lecture/écriture mémoire, par les instructions uti-
lisant un opérande immédiat, ainsi que par les branchements courte distance (conditionnels).
45
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
Exemple : addi R4, R3, 8
On aurait R4 dans RD, R3 dans RS, et 8 dans IMD16.
Le format J n’est utilisé que pour les branchements à longue distance (inconditionnels).
Exemple : J immed
DECODAGE OPCOD
000 001 010 011 100 101 110 111
000 SPECIAL BCOND J JAL BEQ BNE BLEZ BGTZ
001 ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI
010 COPRO
011
100 LB LH LW LBU LHU
101 SB SH SW
110
111
Ce tableau exprime que l'instruction LHU (par exemple) possède le code opération "100101".
Lorsque le code opération a la valeur SPECIAL ("000000"), il faut analyser les 6 bits de poids faible
de l'instruction (INS 5:0)
OPCOD = SPECIAL
000 001 010 011 100 101 110 111
000 SLL SRL SRA SLLV SRLV SRAV
001 JR JALR SYSCALL BREAK
010 MFHI MTHI MFLO MTLO
011 MULT MULTU DIV DIVU
100 ADD ADDU SUB SUBU AND OR XOR NOR
101 SLT SLTU
110
111
Lorsque le code opération a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction. Lors-
que le code opération a la valeur COPRO, il faut analyser les bits 25 et 23 de l'instruction. Les trois
instructions de cette famille COPRO sont des instructions privilégiées.
46
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
3. Jeu d'instructions
Le jeu d'instructions est "orienté registres". Cela signifie que les instructions arithmétiques et lo-
giques prennent leurs opérandes dans des registres et rangent le résultat dans un registre. Les seules
instructions permettant de lire ou d'écrire des données en mémoire effectuent un simple transfert
entre un registre général et la mémoire, sans aucun traitement arithmétique ou logique.
La plupart des instructions arithmétiques et logiques se présentent sous les 2 formes registre-registre
et registre-immédiat:
ADD : rd ← rs op rt format R
ADDI : rd ← rs op IMD format I
L’opérande immédiat 16 bits est signé pour les opérations arithmétiques et non signé pour les opéra-
tions logiques.
Le déplacement est de 16 bits pour les instructions de branchement conditionnelles (Bxxx) et de 26
bits pour les instructions de saut inconditionnelles (Jxxx). De plus les instructions JAL, JALR,
BGEZAL, et BLTZAL sauvegardent une adresse de retour dans le registre R31. Ces instructions sont
utilisées pour les appels de sous programme.
Toutes les instructions de branchement conditionnel sont relatives au compteur ordinal pour que le
code soit translatable. L'adresse de saut est le résultat d'une addition entre la valeur du compteur or-
dinal et un déplacement signé.
Les instructions MTC0 et MFC0 permettent de transférer le contenu des registres SR, CR, EPC et
BAR vers un registre général et inversement. Ces 2 instructions ne peuvent être exécutées qu’en
mode superviseur, de même que l'instruction RFE qui permet de restaurer l'état antérieur du registre
d'état avant de sortir du gestionnaire d'exceptions.
Exercice 1 :
Codez sous forme de hexadécimale les instructions MIPS suivantes :
sltiu $v0, $s7, -1
nor $t4, $v0, $v0
sb $a3, 12($s0)
Exercice 2 :
Donner la forme mnémonique assembleur des mots suivants représentés en hexadécimal :
0x31C90002
0x8C450048
0x00513021
0x00121103
47
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
31 25 20 15 10 5 0 Instr
0 0 RT RD SA 0 sll 8 RS RD Constante signée addi
0 0 RT RD SA 2 srl 9 RS RD Constante signée addiu
0 0 RT RD SA 3 sra 10 RS RD Constante signée slti
0 RS RT RD 0 4 sllv 11 RS RD Constante signée sltiu
0 RS RT RD 0 6 srlv 12 RS RD Cte non signée andi
0 RS RT RD 0 7 srav 13 RS RD Cte non signée ori
0 RS 0 8 jr 14 RS RD Cte non signée xori
0 RS 0 RD 0 9 jalr 15 RD Cte non signée lui
0 numéro 12 syscall
16 0 RD CS mfco
0 numéro 13 break
16 4 RS CD mtco
0 0 RD 0 16 mfhi
16 8 0 offset bcof
0 RS 0 17 mthi
16 8 1 offset bcot
0 0 RD 0 18 mflo
16 16 0 1 tlbr
0 RS 0 19 mtlo
16 16 0 2 tlbwi
0 RS RT 0 24 mult
16 16 0 6 tlbwr
0 RS RT 0 25 multu
16 16 0 8 tlbp
0 RS RT 0 26 div
16 16 0 16 rfe
0 RS RT 0 27 divu
0 RS RT RD 0 32 add 32 RS RD offset lb
0 RS RT RD 0 33 addu 33 RS RD offset lh
0 RS RT RD 0 34 sub 35 RS RD offset lw
0 RS RT RD 0 35 subu 36 RS RD offset lbu
0 RS RT RD 0 36 and 37 RS RD offset lhu
0 RS RT RD 0 37 or 40 RS RT offset sb
0 RS RT RD 0 38 xor 41 RS RT offset sh
0 RS RT RD 0 39 nor 43 RS RT offset sw
0 RS RT RD 0 42 slt
0 RS RT RD 0 43 sltu
1 RS 0 offset bltz
1 RS 1 offset bgez
1 RS 16 offset bltzal
1 RS 17 offset bgezal
2 Adresse mot j
3 Adresse mot jal
4 RS RT offset beq
5 RS RT offset bne
6 RS 0 offset blez
7 RS 0 offset bgtz
48
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
4. Interface du Processeur
L'interface entre le processeur et la mémoire est réalisé par les
signaux ADR[31:0], DATA[31:0], RW[2:0], FRZ, BERR. Les RW REQUETE
requêtes possibles vers la mémoire sont les suivantes: 000 NO ni écriture, ni lecture
Dans le cas WW, les 4 octets du bus DATA sont écrits en mé-
moire à une adresse alignée sur les mots (les 2 bits de poids faible 001 WW écriture d'un mot
de ADR ne sont pas pris en compte). 010 WH écriture d'un demi-mot
Dans le cas WH, les 2 octets de poids faibles du bus DATA sont 011 WB écriture d'un octet
écrits à une adresse alignée sur les demi-mots (le bit de poids
faible de ADR n'est pas pris en compte). 1** RW lecture d'un mot
Dans le cas WB, l'octet de poids faible du bus DATA est écrit à l'adresse ADR.
Dans le cas RW, les deux bits de poids faible de ADR ne sont pas pris en compte, et la mémoire doit
fournir sur le bus DATA un mot aligné. Dans le
cas des instructions LBU et LHU, c'est le proces-
seur qui effectue le recadrage et l'extension de
signe.
Dans le cas où le système mémoire ne peut pas
satisfaire en un cycle la requête d'écriture ou de
lecture (par exemple en cas de MISS dans le
cache), le signal FRZ doit être activé : le proces-
seur maintient sa requête tant que le signal FRZ
est actif.
Dans le cas d'une erreur matérielle lors d'un accès
à la mémoire, cette erreur peut être signalée au
processeur par le signal BERR
5. Architecture Interne
L'architecture interne du processeur se décom-
pose en une partie opérative et une partie contrôle. La
partie opérative (PO) contient les registres et les opéra-
teurs. Elle réalise des transferts élémentaires de données
entre un ou plusieurs registres sources et un registre
destination. Un transfert élémentaire est exécuté en un
cycle. La partie opérative est commandée par la partie
contrôle (PC). La partie contrôle est chargée de définir,
pour chaque cycle d'horloge, les transferts élémentaires
qui doivent être réalisés par la partie opérative. La par-
tie contrôle contient principalement un séquenceur dé-
crit comme un automate d'états finis (automate de
MOORE).
L'interface entre la partie opérative et la partie contrôle est définie par deux nappes de fils. Dans le
sens PC → PO, cette nappe de fils est décomposée en six champs de commande qui définissent de fait le
format de la micro-instruction. Ce format ainsi que les valeurs possibles des différents champs de com-
mande constituent le "langage de micro-programmation". Dans le sens PO → PC, cette nappe de fils est
constituée de signaux de compte-rendu permettant au séquenceur de prendre des décisions.
49
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
6. Chemin de Données
En plus des registres visibles du logiciel, le pro-
cesseur possède 3 registres internes:
• IR Registre instruction qui mémorise l'instruc-
tion lue en mémoire.
• DT Registre data qui reçoit la donnée provenant
de la mémoire
• AD Registre d’adresse qui peut être utilisé
comme registre temporaire.
Les registres SR et CR sont implantés dans la par-
tie contrôle.
Le processeur possède deux bus opérandes X et Y
et une seule "boîte à opérations" capable d'effec-
tuer des opérations logiques, arithmétiques, mais
aussi des opérations de comparaison, ou des déca-
lages multi-bits. Toutes les opérations s'exécutent
en un cycle, sauf les opérations de multiplication
et de division qui s'exécutent en deux cycles. Seuls
les registres PC et AD permettent d’adresser la
mémoire externe.
Un mot de 32 bits provenant de la mémoire peut
être écrit dans les registres DT ou IR.
Un mot de 32 bits provenant de la boîte à opéra-
tions peut être écrit dans les registres PC, EPC,
SR, CR, BAR, HI, LO, AD, ou dans un registre
général R(n). Ceci signifie que cette partie opéra-
tive est capable d'effectuer deux transferts élémen-
taires à chaque cycle: un transfert interne (qui uti-
lise deux registres sources, la boîte à opérations et
un registre résultat), et un transfert externe (lecture
d'un mot en mémoire externe et écriture dans IR
ou DT).
Le banc de registre R(n) ne possède que 2 accès simultanés (un en lecture et un en écriture).
Des pseudo-registres permettent de forcer des valeurs constantes sur les bus X et Y.
Les 32 bits du registre d'instruction IR sont envoyés à la partie contrôle pour lui permettre de prendre des
décisions. Par ailleurs, la partie opérative envoie vers la partie contrôle le signal NUL qui vaut 1 quand
RES = Ø. Elle renvoie également vers la partie contrôle les bits de signe des deux opérandes X et Y, ainsi
que celui du résultat, la retenue de l'UAL et les deux bits de poids faibles du résultat. Ces signaux, calcu-
lés par la micro-instruction i peuvent être utilisés par la partie contrôle pour choisir la micro-instruction
i+1.
51
Architecture des Ordinateurs 2eme année LMD Informatique CHAP IV : Conception du jeu d’instruction
52
Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions
L’espace mémoire est découpé en 2 segments identifiés par le bit de poids fort de l’adresse :
adr 31 = 0 ==> segment utilisateur
adr 31 = 1 ==> segment système
Quand le processeur est en mode superviseur, les 2 segments sont accessibles. Quand le proces-
seur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en excep-
tion si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment sys-
tème alors que le processeur est en mode utilisateur.
Il existe quatre types d’évènements qui peuvent interrompre l’exécution "normale" d’un programme:
les exceptions
les interruptions
les appels système (instructions SYSCALL et BREAK)
le signal RESET
Dans tous ces cas, le principe général consiste à passer la main à une procédure logicielle spécia-
lisée qui s’exécute en mode superviseur, à qui il faut transmettre les informations minimales lui per-
mettant de traiter le problème.
1. Exceptions
Les exceptions sont des évènements "anormaux", le plus souvent liés à une erreur de programmation,
qui empêchent l’exécution correcte de l’instruction en cours. La détection d’une exception entraîne
l’arrêt immédiat de l’exécution de l’instruction fautive. Ainsi, on assure que l’instruction fautive ne
modifie pas la valeur d’un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas
masquables. Il y a 7 types d’exception dans cette version du processeur R3000 :
ADEL : Adresse illégale en lecture : adresse non alignée ou se trouvant dans le segment sys-
tème alors que le processeur est en mode utilisateur.
ADES : Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le
segment système alors que le processeur est en mode utilisateur.
DBE : Data bus erreur : le système mémoire signale une erreur en activant le signal BERR
à la suite d’un accès de donnée.
IBE : Instruction bus erreur : le système mémoire signale une erreur en activant le signal
BERR à l’occasion d’une lecture instruction.
OVF : Dépassement de capacité : lors de l’exécution d’une instruction arithmétique (ADD,
ADDI ou SUB), le résultat ne peut être représenté sur 32 bits.
RI : Codop illégal: le codop ne correspond à aucune instruction connue (il s’agit probable-
ment d’un branchement dans une zone mémoire ne contenant pas du code exécutable.
CPU : Coprocesseur inaccessible: tentative d’exécution d’une instruction privilégiée (MTC0,
MFC0, RFE) alors que le processeur est en mode utilisateur.
Le processeur doit alors passer en mode superviseur, et se brancher au gestionnaire d'exceptions
qui est une routine logicielle implantée conventionnellement à l’adresse "0x80000080". Toutes les
exceptions étant fatales dans cette version du processeur R3000, il n’est pas nécessaire de sauvegar-
der une adresse de retour car il n’y a pas de reprise de l’exécution du programme contenant
l’instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions
l’adresse de l’instruction fautive et indiquer dans le registre de cause le type d’exception détectée.
53
Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions
Lorsqu’une exception est détectée, 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
branche à l’adresse "0x80000080".
2. Interruptions
Les requêtes d’interruption matérielles sont des évènements asynchrones provenant généralement
de périphériques externes. Elles peuvent être masquées. Le processeur possède 6 lignes
d’interruptions externes qui peuvent être masquées globalement ou individuellement. L’activation
d’une de ces ligne est une requête d’interruption. Elles sont inconditionnellement écrites dans le re-
gistre CR, et elles sont prises en compte à la fin de l’exécution de l’instruction en cours si elles ne
sont pas masquées. Cette requête doit être maintenue active par le périphérique tant qu’elle n’a pas
été prise en compte par le processeur.
Le processeur passe alors en mode superviseur et se branche ici encore au gestionnaire d'excep-
tions. Comme il faut reprendre l’exécution du programme en cours à la fin du traitement de
l’interruption, il faut sauvegarder une adresse de retour.
Lorsqu’une requête d’interruption non-masquée est détectée, le processeur:
sauvegarde l’adresse de retour (PC + 4) dans le registre EPC
sauvegarde l’ancienne valeur du registre d’état SR
passe en mode superviseur et masque les interruptions dans SR
écrit qu’il s’agit d’une interruption dans le registre CR
branche à l’adresse "0x80000080".
En plus des 6 lignes d’interruption matérielles, le processeur R3000 possède un mécanisme
d’interruption logicielle: Il existe 2 bits dans le registre de cause CR qui peuvent être écrits par le
logiciel au moyen de l’instruction privilégiée MTC0. La mise à 1 de ces bits déclenche le même trai-
tement que les requêtes d’interruptions externes, s’ils ne sont pas masqués.
4. Signal RESET
54
Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions
Le processeur possède également une ligne RESET dont l’activation, pendant au moins un cycle,
entraîne le branchement inconditionnel au logiciel d’initialisation. Cette requête est très semblable à
une septième ligne d’interruption externe avec les différences importantes suivantes :
elle n’est pas masquable.
il n’est pas nécessaire de sauvegarder une adresse de retour.
le gestionnaire de reset est implanté à l’adresse "0xBFC00000".
Dans ce cas, le processeur :
passe en mode superviseur et masque les interruptions dans SR
branche à l’adresse "0xBFC00000".
5. Retour d’interruption
Avant de reprendre l’exécution d’un programme qui a effectué un appel système (instructions SYS-
CALL ou BREAK) ou qui a été interrompu, il est nécessaire d’exécuter l’instruction RFE. Cette
instruction effectue la restitution de l’état précédent dans le registre SR
6. Gestion du registre d’état SR
Le registre d’état contient l’état courant du processeur, défini par le bit de mode KUC et par le
bit de masque global des interruptions IEC. La valeur 00 pour les bits KUC et IEC correspond à
l’état superviseur et interruptions masquées. Le registre SR contient aussi l’état précédent (bits KUP
et IEP) et l’état antérieur (bits KUO et IEO). Il constitue donc une petite pile matérielle capable
d’empiler 3 états successifs du processeur. Le registre SR contient par ailleurs 6 bits MIRQ(5:0)
permettant de masquer individuellement les 6 interruptions externes et 2 bits MSWI(1:0) permettant
de masquer les deux interruptions logicielles. Les 16 bits de poids fort et les deux bits 6 et 7 du re-
gistre SR ne sont pas utilisés: On récupère la valeur 0 en lecture et ils ne sont pas modifiés par les
écritures.
La figure suivante montre le format du registre d’état SR:
55
Architecture des Ordinateurs 2eme année LMD Informatique CHAP V : Exeptions et Interruptions
La restitution de l’ancien état, réalisée par l’instruction RFE, est obtenue par un simple déca-
lage de deux bits vers la droite des six bits de poids faible du registre SR (les 8 bits MIRQ et MSWI
ne sont pas modifiés) :
56
Architecture des Ordinateurs 2eme année LMD Informatique CHAP VI: Pipline
CHAP VI Pipeline
1. Introduction
Dans la microarchitecture d'un processeur, un pipeline est une technique de conception des
processeurs où l'exécution des instructions est découpée en étages, et où à un instant donné, chaque
étage peut exécuter une instruction.
Dans une architecture sans pipeline, il faut un certain nombre d’étapes pour exécuter une ins-
truction.
Exemple 1 : Add Rd, Rs, Rt
Etapes :
1. Lire l'instruction
2. Décoder l'instruction
3. Extraire les opérandes
4. Effectuer le calcul : Add
5. Mettre le résultat dans Rd
6. Calcul de l'adresse de l'instruction suivante
Exemple 3: Jr Rs
Etapes :
1. Lire l'instruction
2. Décoder l'instruction
3. Extraire l'opérande
4. Adresse suivante
2. Définition
Pour MIPS, le processeur est divisé en 5 étages
Séquençage des instructions dans un processeur sans pipeline. Il faut 15 cycles pour exécuter
3 instructions.
Si l'on insère des registres tampons (pipeline registers) entre chaque unité à l'intérieur du pro-
cesseur, celui ci peut alors contenir plusieurs instructions, chacune à une étape différente.
Les 5 instructions s'exécuteront en 9 cycles, et le processeur sera capable de terminer une ins-
truction par cycle à partir de la cinquième, bien que chacune d'entre elles nécessite 5 cycles pour
s'exécuter complètement.
Séquençage des instructions dans un processeur doté d'un pipeline à 5 étages. Il faut 9 cycles
pour exécuter 5 instructions. À t = 5, tous les étages du pipeline sont sollicités, et les 5 opérations ont
lieu en même temps.
Au 5e cycle, tous les étages sont en cours d'exécution.
3. Règles du pipeline
1. Les étages du pipeline doivent être équilibrés
2. Calibrer l'horloge sur l'étage le plus long
3. Les étages doivent être séparés par des registres
4. Le matériel doit être spécifique à l'étage
58
Architecture des Ordinateurs 2eme année LMD Informatique CHAP VI: Pipline
4. Problèmes
Les pipelines provoquent de nouveaux problèmes, en particulier d'interdépendance, ils ne sont pas
tous listés ci dessous, juste deux cas simples sont abordés.
Interdépendance des données
Une instruction ne peut récupérer le résultat de la précédente car celui-ci n'est pas encore dis-
ponible. Ainsi, la séquence:
add $at, $v0, $v1 // $at = $v0 + $v1
sw $at, 1000($zero) // (1000) = $at
Ne stocke pas à l'emplacement mémoire 1000 la valeur de $at contenant la somme $v0 + $v1,
mais la valeur de $at contenue avant l'instruction ADD. Pour résoudre ce problème particulier, il est
parfois possible de créer des courts-circuits pour amener le résultat de l'étape précédente vers l'unité
qui en a besoin directement, sans passer par les registres de pipeline.
Interdépendance procédurale
Se pose le même problème avec les sauts:
lw $ra, 1000($zero) // $ra = 1000
Jr $ra // Saut inconditionnel
$ra ne contient pas encore la valeur 1000 au moment où l'instruction de saut va s'exécuter.
Une solution possible à ces deux problèmes est d'insérer une instruction entre les deux qui sont inter-
dépendantes. Prenons par exemple la séquence suivante :
1: add $t0, $t1, $t2
2: add $t3, $t0, $t2
3: add $t4, $t3, $t1
qui comporte une dépendance directe simple, $t0 ne pouvant être disponible pour la partie droite de
la seconde instruction.
la première solution, triviale, est d'insérer des NOP (No Operation), c'est ce que font les com-
pilateurs quand on ne précise pas d'option d'optimisation du code :
1: add $t0, $t1, $t2
1b: NOP
2: add $t3, $t0, $t2
3: add $t4, $13, $t1
la seconde solution consiste à réarranger les instructions. Dans cet exemple, l'opération de la
ligne 3 n'a aucune interdépendance avec les deux précédentes. Le code modifié sera:
1: add $t0, $t1, $t2
2: add $t4, $13, $t1
3: add $t3, $t0, $t2
59
Architecture des Ordinateurs 2eme année LMD Informatique CHAP VI: Pipline
60
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
Travaux dirigés
CHAP I
Codage de l’Informations
2. Entiers Signés
• Donnez le codage sur 8 et 16 bits des nombres suivants: (-1010) 2 ; (-AC) 16 ; (-183) 10
• Donnez la valeur en base 10 des nombres binaires 0101 0101; 1001 0001.
• Effectuer sur 8 bits les opérations binaires suivantes:
76H+64H; 4AH+DEH ; 8CH+9AH ; 47H -3BH ; 6EH - BOH; B4H - 95H
Préciser si le nombre est nul, s'il est négatif, s'il y a retenue et s'il y a dépassement de capacité.
• Calculez l’opposé des nombres relatifs codés sur 16 bits : ABCDH, FFFFH, 5A72H en base 16
et en base 2. Trouvez une autre règle de conversion.
3. Flottants
Donnez le codage IEEE des nombres suivants: 1.0; 2; 4; 8; −1; 0.5; −2; 96.875;
−544.0625; 299892; 5.5; 19.6; -1/3
Donnez la valeur du nombre suivant stocké et codé selon la norme IEEE: C8 80 00 00 00
Faire l'addition des nombre IEEE suivants: C8 80 00 00 + C8 00 00 00
Donnez pour les nombres stockés et codés selon la norme IEEE:
• Le plus grand et le plus petit nombre normalisé représentable (en valeur absolue ou non).
• Le codage du zéro
• Le codage du résultat d'une division par zéro
-126 -126
• Le résultat de la soustraction suivante: (1,1) 2 * 2 – (1,0) 2 * 2
61
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
Machine Von Neumann
Exercice 1:
1. Quelle est la fonction de la mémoire principale?
2. Quelle est la fonction du processeur centrale?
3. Qu’est ce qu'un programme?
4. Donner un schéma général d’un ordinateur.
5. Que fait le processeur pour chaque exécution d’une instruction?
Exercice 2:
1. Donner une relation entre le Bus Adresse et la taille de la MP.
Si la taille de d’une mémoire principale est de 1 Go, quelle est la largeur du bus d’adresse?
Donner la taille de cette mémoire en mot mémoire si un mot mémoire = (16 bits, 32 bits, 64 bits) .
62
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
CHAP II Microprocesseur MIPS R3000
Architecture externe
Exercice 1:
a. Initialiser le registre $a1 à 0
b. Initialiser le registre $a1 à 0x4567 (valeur 16 bits)
c. Initialiser le registre $a1 à 0x4567ABCD (valeur 32 bits)
Exercice 2:
Programmez en assembleur MIPS la fonction F = 2*X + 2*Y - Z .
On suppose que la variable X se trouve dans le registre $t0, la variable Y dans $t1, la variable Z
dans $t2 et que le résultat de la fonction F se trouve dans le registre $v0.
Exercice 3:
1. Ecrire une séquence d’instructions assembleur pour permuter le contenu de 2 registres, On utilisera
un registre intermédiaire.
2. Permuter deux registres sans utiliser un registre intermédiaires (penser à XOR).
3. Ecrire une séquence d’instructions assembleur qui permute le contenu de 2 variables 32 bits. Même
chose pour deux variables 16 bits, puis 8 bits.
Exercice 4:
Programmez en assembleur MIPS les expressions (variables à 32 bits):
1. x = y+z–2*t
2. S = a* x2 + b * x + c
3. S = a2 + b2 + c2
4. (x + 5 - y) * 35 / 3
Exercice 5:
a. Supposez que $a0 = 0x1234 et $a1 = 0x3. Quelle est la valeur du registre $t0 après
l’exécution du programme MIPS suivant ?
add $t0, $zero, $zero
toto: add $t0, $t0, $a0
addi $a1, $a1, -1
bne $a1, $zero, toto
srl $t0, $t0, 4
b. Supposez le code MIPS suivant, qui reçoit deux entrées dans les registres $t2 et $t3 et produit
une sortie dans le registre $s4.
add $t1, $zero, $zero
lo: beq $t3, $zero, fin
add $t1, $t1, $t2
subi $t3, $t3, 1
j lo
fin: addi $t1, $t1, 100
add $s4, $t1, $zero
a) Décrivez en une phrase la fonction du programme.
b) Quelle est la valeur de $s4 à la fin du programme, si $t2 = 4 et $t3 = 6 au début du programme?
63
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
Exercice 6: Opérations logiques bit à bit.
Pour chaque question, donner la réponse en langage machine MIPS.
1- Multiplier $t0 par 8.
2- Inverser le bit 4 de $t0.
3- Si $t0 est pair, $t0 = 0, sinon $t0 = 1.
4- Mettre à un le bit 7 de $t0.
Exercice 7:
Programmez en assembleur MIPS les fonctions suivantes:
a) PGCD(A, B) = B si A mod B = 0
= PGCD(B , A mod B ) sinon
c) Fn = 1 si n = 0 ou n = 1
= Fn-1 + Fn-2 si n > 1
d) A*B = 0 si B = 0
= (2*A) * ( B div 2) si B est pair
= (2*A) * ( B div 2) + A si B est impair
e) Ab = 1 si b = 0
= A(b div 2) * A(b div 2) si b est pair
= A(b div 2) * A(b div 2) * A si b est impair
Exercice 8:
Ecrire des fonctions en MIPS pour :
1. Vérifier si un nombre est valable dans un système de numération à base B
2. Transformer un nombre entier d’une base B en nombre entier sur 16 bits
3. Ecrire un nombre entier 16 bits dans une base B
Le nombre entier est lu sous forme de chaîne de caractères (pour les bases > 10, on utilise les
chiffres A, B, C, D, E, F )
Exercice 9:
Programmez en assembleur MIPS un programme qui lit une phrase terminée par un ‘.’ au
clavier et qui et qui affiche (en pascal) le nombre de mots.
Exercice 10:
Programmez en assembleur MIPS un programme qui lit une phrase terminée par un ‘.’ au
clavier et qui et qui affiche (en pascal) le nombre de mots qui se termine par la lettre ‘s’.
Exercice 11 :
Programmer la fonction copy une chaine de caractères d’un emplacement mémoire à un autre.
64
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
CHAP III La programmation structurée
Exercices :
Traduire en assembleur MIPS les programmes C suivants
65
Architecture des Ordinateurs 2eme année LMD Informatique Travaux dirigés
2. Instructions registres/registres :
srlv $t0, $t9, $s8
nor $t4, $v0, $v0
3. Adressage mémoire en mode indirect registre (le seul supporté par le MIPS) :
lh $a2, 0xFF($a0)
sb $a3, 12($s0)
Exercice 2 : nous supposerons pour l’exemple suivant que l’instruction à coder se trouve en
$pc=0x00400020, et que les étiquettes auxquelles on saute se trouvent en plus = 0x0040003C, et
moins = 0x00400018.
syscall
mfc0 $ra, $13
Décodage :
0x00031880
0x00021080
0x3C16FFFF
0x00A21026
0x80E30006
0xAE2200C8
66
Registres Nom Description
$0 $zero vaut zéro en lecture, non modifié par écriture
$1 $at Réservé à l’assembleur pour les macros. Ne doit pas être utilisé
$2 $v0 Utilisé pour les valeurs de retour des fonctions
$3 $v1 Utilisé. pour les appels systèmes. Contient le numéro d'appel de la fonction système syscall.
$4,$5,$6,$7 $a0 … $a3 Utilisés par le compilateur pour optimiser les appels de fonctions pour contenir les arguments
$8, … , $15 $t0 … $t7 Registres de travail utilisable par le code utilisateur
$16, … , $23 $s0 … $s7 Registres de sauvegardes d'usage universel
$24, $25 $t8, $t9 Registres de travail utilisable par le code utilisateur
$26, $27 $k0, $k1 Réservés aux procédures noyau.
$28 $gp Pointeur global. Constant pour tout processus .
$29 $sp Pointeur de pile
$30 $s8 Pointeur sur la zone des variables globales (section data)
$31 $ra Contient l’adresse de retour d’une fonction
Registres spéciaux
HI Poids fort du résultat d’une multiplication sur 64 bits ou reste de division.
LO Poids faible du résultat d’une multiplication sur 64 bits ou quotient de division.
PC Registre compteur de programme (Program Counter).
Registres protégés
SR Registre d’état (Status Register).
CR Registre de cause (Cause Register).
EPC Registre d’exception (Exception Program Counter). Il contient l’adresse de retour (PC+4)
BAR Registre d’adresse illégale, il contient la valeur de l’adresse illégale. (registre numéro 8)
Quelques notations:
Mem[ad] : Contenu de la mémoire d’adresse ad
|| : Concaténation entre deux chaînes de bits
Bn : Réplication du bit B n fois dans une chaîne de bits
X p..q : Sélection des bits p à q dans une chaîne de bits X
Categorie Instruction Exemple Signification
addition add $1,$2,$3 $1 = $2 + $3
or or $1,$2,$3 $1 = $2 | $3
Move to HI mthi $1 HI = $1
Move to LO mtlo $1 LO = $1
Branch if greater or equal zero bgez $1, label if ($1 >= 0 ) go to label
Branch if greater than zero bgtz $1, label if ($1 > 0 ) go to label
branchements
Conditionnels Branch if less or equal zero blez $1, label if ($1 <= 0 ) go to label
Branch if less than zero bltz $1, label if ($1 < 0 ) go to label
DECODAGE OPCOD
000 001 010 011 100 101 110 111
000 SPECIAL BCOND J JAL BEQ BNE BLEZ BGTZ
001 ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI
010 COPRO
011
100 LB LH LW LBU LHU
101 SB SH SW
110
111
1 RS 0 offset bltz
1 RS 1 offset bgez
1 RS 16 offset bltzal
1 RS 17 offset bgezal
2 Adresse mot j
3 Adresse mot jal
4 RS RT offset beq
5 RS RT offset bne
6 RS 0 offset blez
7 RS 0 offset bgtz