Académique Documents
Professionnel Documents
Culture Documents
Mr N. Azizi 2021-2022
PRÉSENTATION DU PROCESSEUR MIPS R3000
• MIPS (de l'anglais Microprocessor without interlocked pipeline stages) a été
développée par la compagnie MIPS Computer Systems Inc., basée en
Californie.
• En 1988, la société MIPS Computer Systems, présente le MIPS R3000 qui succède
au MIPS R2000.
• Son jeu d’instructions est de type RISC.
• Le processeur MIPS R3000 est un processeur 32 bits.
• Le principal marché du MIPS: les applications embarquées, les ordinateurs de
poche, les routeurs Cisco et les consoles de jeux vidéo (Nintendo 64 et Sony
PlayStation, et PSP)…
• Il existe plusieurs réalisations industrielles de cette architecture (Siemens,
Toshiba, Philips, Silicon Graphics, etc...)
2
NOTION D’ARCHITECTURES CISC/RISC:
Deux grandes catégories de processeurs, qui se distinguent par la
conception de leurs jeux d’instructions :
• CISC (Complex Instruction Set Computer)
• jeu étendu d’instructions complexes;
• instructions proches des constructions typiques des langages de haut niveau
• Exemples : Motorola 68000, x86 Intel, AMD...
• RISC (Reduced Instruction Set Computer)
• jeu d’instructions réduit;
• toutes les instructions sont codées avec un même nombre de bits,
généralement un mot machine; Ceci facilite le décodage des instructions.
• Exemples : MIPS, PowerPC, UltraSPARC (Sun), ...
3
MODE UTILISATEUR/SUPERVISEUR:
Afin de mettre en œuvre les mécanismes de protection nécessaires pour un
système, le processeur possède deux modes de fonctionnement :
• Le mode superviseur: permet une plus grande sécurité pour le système. Quand
le processeur est en mode superviseur, l’utilisateur ne peut pas accéder à
certaines zones (ex: mémoire, registres...)
• Le mode utilisateur: Ce mode permet à l’utilisateur d’accéder uniquement aux
zones réservées aux utilisateurs. Le processeur part en exception si l’utilisateur
accède à une zone privilégiée.
Note: quand le processeur est en mode superviseur, le système peut accéder aux
zone protégées et non protégées.
4
LES REGISTRES
• Les registres sont une zone de stockage temporaire située dans le processeur.
• La valeur de certains registres peut être lue ou modifiée par les instructions.
• Selon les modes de fonctionnement du processeur, il existe deux catégories de
registres:
5
LES REGISTRES NON PROTÉGÉS
• Le processeur MIPS possède 32 registres de travail accessibles au programmeur.
• Chaque registre est connu par son numéro, qui varie entre 0 et 31, et est préfixé
par un $.
• Par exemple:
6
LES REGISTRES NON PROTÉGÉS
7
LES REGISTRES NON PROTÉGÉS
Le compteur programme $PC (compteur ordinal)
Ce registre contient l'adresse de l'instruction en cours d'exécution. Sa valeur est
modifiée par toutes les instructions.
Les registres HI et LO
Ces registres à 32 bits sont utilisés pour la multiplication ou la division pour stocker
le
résultat de l’opération
8
LES REGISTRES PROTÉGÉS
• L'architecture MIPS définit 32 registres (numérotés de 0 à 31), qui ne
sont pas accessibles en mode utilisateur.
• Ils sont accessibles par les instructions privilégiées c'est à dire les
instructions qui ne peuvent être exécutées qu'en mode superviseur.
9
LES REGISTRES PROTÉGÉS
Le registre d'état SR (Status Register)
Il contient en particulier le bit qui définit le mode : superviseur ou utilisateur, ainsi que les
bits de masquage des interruptions
10
ORGANISATION DE LA MÉMOIRE (1)
Toutes les adresses émises par le processeur sont des adresses octets, ce qui signifie que
la mémoire est vue comme un tableau d'octets, qui contient aussi bien les données que
les instructions.
• Les adresses sont codées sur 32 bits.
• Les instructions sont codées sur 32 bits.
• Les échanges de données avec la mémoire se font :
• par mot (4 octets consécutifs),
• demi mot (2 octets consécutifs),
• ou par octet.
11
ORGANISATION DE LA MÉMOIRE (2)
• 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 (user)
adr 31 = 1 → segment système (kernel)
12
ORGANISATION DE LA MÉMOIRE (3)
Un programme utilisateur utilise généralement trois sous-
segments (appelés sections)
dans le segment utilisateur :
• la section .text contient le code exécutable en mode
utilisateur. Elle est implantée
conventionnellement à l’adresse 0x00400000.
• la section .data contient les données globales
manipulées par le programme utilisateur.
Elle est implantée conventionnellement à l’adresse
0x10000000.
• la section .stack contient la pile d’exécution du
programme. Sa taille varie au cours de
l’exécution. Elle est implantée conventionnellement à
l’adresse 0x7FFFEFFF. Contrairement
aux sections data et text, la pile s’étend vers les adresses
décroissantes.
13
MODE D'ADRESSAGE
• Indique comment l'architecture spécifie les adresses des objets qu'elle va
accéder dans la mémoire.
• MIPS est une architecture de chargement/rangement (load/store), ce qui
signifie que seules les instructions de chargement et de rangement peuvent
accéder à la mémoire.
14
MODE D'ADRESSAGE
• Le jeux d’instruction étendu (pseudo-instructions) de mips offrent les modes
d’adressage suivants pour les instructions load/store
Format Calcul d’adresse Exemple
(registre) Indirect Le contenu du registre lw $t1, ($t2)
val (registre) Indirect avec Val + Le contenu du registre lw $t1, 10($t2)
déplacement
(relatif)
Val Direct (absolu) valeur lb $t1, 0x0012
label Direct (absolu) Adresse du label lb $t1, chaine
label ± val adresse du label + ou – val lb $t1, chaine+0x0012
label ± val adresse du label + ou – (val + contenu lb $t1, chaine+ 10($t2)
(register) du registre)
15
FORMAT D’UNE INSTRUCTION:
• Toutes les instructions ont une longueur de 32 bits et possèdent un des trois
formats suivants :
• Le format R : est utilisé par les instructions nécessitant deux registres sources (RS et RT) et
un registre résultat (RD).
• Le format I: est utilisé par les instructions de lecture/écriture mémoire, par les
instructions utilisant un opérande immédiat, ainsi que par les branchements
conditionnels.
• Le format J: n’est utilisé que pour les branchements inconditionnels.
16
FORMAT D’UNE INSTRUCTION R:
17
FORMAT D’UNE INSTRUCTION R:
18
FORMAT D’UNE INSTRUCTION I:
19
FORMAT D’UNE INSTRUCTION I:
20
FORMAT D’UNE INSTRUCTION J:
21
CODE OPÉRATION
Il détermine quelle opération effectuer (6 bits de poids forts)
22
CODOP SPÉCIAL
Pour le format R, le codeOp peut être nul et c’est le champ func (6bits de poids faible )
qui détermine l’opération
23
FORMAT D’UN PROGRAMME MIPS:
Un programme Mips est composé
essentiellement de deux parties:
24
DÉCLARATION DE DONNÉES:
Les données (constantes et variables) doivent être déclarées dans « .Data » section.
• Les données doivent commencer par une lettre suivie des lettres, chiffres ou
caractères spéciaux.
• Le format général de la déclaration d’une donnée est:
Exemple:
25
DÉCLARATION DE DONNÉES:
Les données en Mips sont de différents types:
26
DÉCLARATION DE DONNÉES:
Déclaration des entiers :
27
DÉCLARATION DE DONNÉES:
Les chaînes de caractères :
28
DÉCLARATION DE DONNÉES:
Déclaration des nombres réels :
Exemple :
• Les déclarations suivantes sont utilisées pour définir la variable « pi » sur 32 bits par le
type .float et l’initialiser à 3,14159.
• Et la variable « tao » qui prend le type .double et sera enregistrée sur 64 bits. Elle est
initialisée à 6,28318.
29
DÉCLARATION DE DONNÉES:
Déclaration des constantes:
Une constante est une valeur fixe et ne change pas durant le déroulement du
programme.
Exemple :
30
INSTRUCTIONS ET PSEUDO-INSTRUCTIONS
Certaines instructions appelées pseudo-instruction ne sont en pas implantées par le processeur,
mais traduites par l’assembleur en séquences d’instructions plus simples.
Exemple 1 :
blt $t0,$t1, adress
Exemple 2 :
li $t0, 400020
31
LES INSTRUCTIONS DU LANGAGE MIPS
Pour pouvoir faire des programmes sur la machine MIPS R3000, on dispose d'un certain
nombre d'instructions qui forment le langage de la machine.
• Le jeu d'instructions est "orienté registres". Cela signifie que les instructions utilisent les
registres pour le transfert et le rangement des données.
• Le processeur possède 57 instructions qui se répartissent en 4 classes :
32
LES INSTRUCTIONS DE LECTURE/ÉCRITURE MÉMOIRE
Ces instructions transfèrent les données entre la mémoire et les registres.
• L’opération de chargement (Load) permet de lire une donnée de la mémoire et la
charger dans un registre.
• L’opération de sauvegarde (Store) permet d’écrire le contenu d’un registre dans la
mémoire.
33
LES INSTRUCTIONS DE LECTURE/ÉCRITURE MÉMOIRE
1. Les instruction de chargement: (Load)
34
LES INSTRUCTIONS DE LECTURE/ÉCRITURE MÉMOIRE
1. Les instruction de sauvegarde: (Store)
35
LES APPELS SYSTÈME (SYSCALL)
• Pour exécuter certaines fonctions système, principalement les entrées/sorties (lire ou
écrire un nombre, ou un caractère), il faut utiliser des appels système.
36
LES APPELS SYSTÈME (SYSCALL)
• Ecrire un entier: ( Print_int )
• Il faut mettre l’entier à écrire dans le registre $a0 et exécuter l’appel système numéro 1.
37
LES APPELS SYSTÈME (SYSCALL)
• Lire une chaîne de caractères : (Read_string)
Il faut:
• Adresse du début de la chaîne et la passer dans $a0
• La longueur maximum et la mettre dans $a1
• Exécuter l’appel système numéro 8.
38
LES APPELS SYSTÈME (SYSCALL)
• Quitter le programme:
• L’appel système numéro 10 effectue la sortie du programme
39
LES APPELS SYSTÈME (SYSCALL)
40
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
Les instructions arithmétiques et logiques permettent de faire les 4 opérations de calcul
(addition, multiplication, soustraction, division) ainsi que les opérations logiques (Or, And,
xor..) et les opérations de décalage…
2. addi : On peut aussi faire une addition avec les constante au lieu du registre $t2:
41
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
4. mul : add $rd, $rs, $rt #$rd = $rs x $rt
Les contenus des registres $rs et $rt sont multipliés pour former un résultat qui est placé
dans le registre $rd.
permet de multiplier les contenus des registres $rs et $rt. Le résultat est placé dans les
registres spéciaux : hi et lo. Les 32 bits de poids fort du résultat sont placés dans le registre
$hi, et les 32 bits de poids faible dans $lo.
Le contenu du registre $rs est divisé par le contenu du registre $rt. Le résultat de la division
est placé dans le registre $lo, et le reste dans le registre $hi.
42
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
7. mfhi (Move from $hi):
Le contenu du registre spécialisé $hi qui est mis à jour par l’opération de multiplication ou
de division est recopié dans le registre général $rd.
Le contenu du registre spécialisé $lo qui est mis à jour par l’opération de multiplication ou
de division est recopié dans le registre général $rd.
43
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
Les instructions logiques
1. and - Et logique - : and $rd, $rs, $rt # $rd = $rs and $rt (bit à bit)
Un et bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé
dans le registre $rd.
Exemple: Pour faire une copies du registre $t0 dans le registre $t1 en mettant les 6
premiers bits à zéro, on utilise l’instruction suivante: and $t1, $t0, $t8
44
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
2. or - ou logique - : or $rd, $rs, $rt # $rd = $rs or $rt (bit à bit)
Un ou bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé
dans le registre $rd.
Exemple: Pour faire une copies du registre $t0 dans le registre $t1 en mettant les 6
premiers bits à un, on utilise l’instruction suivante: or $t1, $t0, $t8
45
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
3. xor - ou éxclusif - : xor $rd, $rs, $rt # $rd = $rs xor $rt (bit à bit)
Un ou éxclusif bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat
est placé dans le registre $rd.
Exemple: Pour faire une copies du registre $t0 dans le registre $t1 en inversant les 6
premiers bits, on utilise l’instruction suivante: xor $t1, $t0, $t8
46
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
4. neg - négatif - : neg $rd, $rs # $rd = -($rs) . Donne le négatif de $rs.
5. Sll - Shift Left Logical - : Décalage à gauche immédiat, est utilisé pour réalisé la
multiplication par des puissances de 2
48
LES OPÉRATIONS ARITHMÉTIQUES ET LOGIQUES
7. slt – set if less than - : Comparaison signée registre registre.
49
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
50
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
Les instructions de branchement
Instruction Signification
Branch if equal
Branch if not equal
Branch if greater or equal
Branch if greater than
Branch if less or equal
Branch if less than
Branch if greater or equal zero
Branch if greater than zero
Branch if less or equal zero
Branch if less than zero
Branch if not equal zero
Branch if equal zero
51
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
Les instructions de saut
1. j - Jump – :
2. jr - Jump register – :
52
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
IF…..THEN…..
Condition de sortie
53
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
IF…..THEN…..ELSE Jump obligatoire
avant else
54
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
La boucle while Condition pour
sortir de la boucle
while ($a1 < $a2) loop: bge $a1, $a2, done # if $a1 >= $a2 branch to done
{ addi $a1, $a1, 1 # $a1 = $a1 + 1
$a1 = $a1 +1; subi $a2, $a2, 1 # $a2 = $a2 - 1
$a2 = $a2 -1; j loop # branch to loop
} done :
55
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
Calculer la somme de N nombres saisis au clavier jusqu’à entrer le
nombre 0.
56
LES OPÉRATIONS DE SAUT (JUMP) ET DE BRANCHEMENT (BRANCH)
La boucle for
57
LES TABLEAUX ET LES PILES
• Les structures de données comme les tableaux et les piles sont utilisées
en MIPS pour stocker des données les unes à la suite des autres.
• Pour les manipuler, il faut d’abord connaître comment ils sont stockés
en mémoire.
num1: .word 42
num2: .word 5.000.000
58
LES TABLEAUX
• Un tableau est une zone mémoire dans laquelle les données sont
rangées les unes à la suite des autres;
• Il est repéré par l’adresse du premier élément;
• On accède aux différentes cases par déplacement par rapport à la
première;
• Un tableau est déclaré comme suit: .data
T : .word 3, 6, 8, 9, 2
59
LES TABLEAUX
• Le programme suivant permet de faire la somme des éléments d’un tableau:
.data
tab : .word -2, 3, 7, -6,0
.text
li $a0, 0 # somme
li $a1, 5 # taille
la $a2, tab # $a2 reçoit l'adresse du
premier élément
bcl: lw $a3, ($a2) # lire une valeur du tableau
add $a0, $a0, $a3 # ajouter la valeur lu dans $a0
addi $a2, 4 # incrémenter le pointeur du
tableau par 4
addi $a1, -1 # décrémenter le compteur de la
boucle bcl
bne $a1, $zero, bcl # si la valeur n'est pas nulle
brancher sur bcl
Ecrire un programme qui permet de donner la somme des nombres négatifs et la somme
des nombres positifs dans le tableau suivant:
Tab: { - 4, 5 , 8 , -1 , 6 , 7 , 13 , - 7 , - 8 }
61
LES PILES
• La pile est une structure de données, qui permet de stocker les données dans l'ordre
LIFO (Last In First Out) - Dernier Entré Premier Sorti).
• La récupération des données sera faite dans l'ordre inverse de leur insertion.
63
LES PILES
Organisation de la pile:
• Contrairement aux sections .data et .text, la pile s’étend vers les adresses décroissantes.
64
LES PILES
Organisation de la pile:
• Le sommet de la pile est pointé par le registre $sp.
• Tout les éléments empilés et dépilés de la pile sont généralement de taille 32 bits.
Exemple:
Considérons le tableau suivant, on veut le stocker dans une pile: a={7,19,37}
65
LES PILES
Implémentation de la pile :
Push (empiler):
• Empiler ou ajouter un élément à la pile signifie soustraire 4 du registre $sp et stocker le
résultat dans cette adresse.
Exemple :
subu $sp, $sp, 4 # Mettre à jour $sp ,
sw $t0, ($sp) # ranger $t0 au sommet de la pile .
Pop (dépiler):
• Dépiler un élément signifie qu'il est copié à un autre endroit (un registre).
• Retirer un élément de la pile signifie ajouter 4 au registre $sp.
Exemple :
lw $t0, ($sp) # copie le sommet dans $t0
addu $sp, $sp, 4 # Mettre à jour $sp ,
66
LES PILES
Exercice :
67
LES PROCÉDURES ET LES FONCTIONS
• Les fonctions et les procédures permettent de décomposer un
programme complexe en une série de sous-programmes plus simples.
• Une fonction est une suite ordonnée d’instructions qui retourne une
valeur .
• Par contre, une procédure est un sous programme qui ne retourne pas
de valeur.
68
LES PROCÉDURES ET LES FONCTIONS
• Pour déclarer une procédure/fonction
en Mips on utilise: Exemple:
.text
.global main
main:
......
Jal calcul
…
.end main
#------------
.global calcul
calcul:
#code de la
fonction
La directive .global indique que ce qui suit la directive
Jr $ra
est une étiquette globale et peut être référencée à
.end calcul
partir d’autres fichiers
69
LES PROCÉDURES ET LES FONCTIONS
Convention d’appel
• La convention d’appel régit la communication entre appelant et
appelé lors de l’appel de procédure ou de fonction.
• Pour le MIPS, la convention proposée par le fabricant est :
• les arguments sont passés dans $a0-$a3 puis (s’il y en a plus de
quatre) sur la pile ;
• l’adresse de retour est passée dans $ra ;
• la valeur de retour est renvoyée dans $v0, $v1 ;
• les registres $t0-$t9, peuvent être modifiés par l’appelé ; l’appelant
doit donc les sauvegarder si nécessaire ; on les appelle caller-
saved
• les registres s0-s7 doivent être préservés par l’appelé; on les appelle
callee-saved.
70
LES PROCÉDURES ET LES FONCTIONS
• La fonction appelante passe les arguments comme suit:
71
LES PROCÉDURES ET LES FONCTIONS
• Pour appeler une fonction on utilise l’instruction suivante:
Jal <fonct>
72
LES PROCÉDURES ET LES FONCTIONS
Cette exemple permet de calculer la
puissance du nombre X par Y. (XY)
• X et Y sont passées par valeur.
• La valeur du premier argument est
passé dans le registre $a0.
• La valeur du deuxième argument est
passée dans le registre $a1.
• Le résultat est mis dans la variable
answer.
• La fonction power sauvegarde le
résultat dans $v0.
• Le programme principale copie le
contenue de $v0 dans la variable
answer.
73
LES PROCÉDURES ET LES FONCTIONS
Cette exemple permet
de calculer la somme de
six nombres et met le
résultat dans sum
74
LES PROCÉDURES ET LES FONCTIONS
• Chaque appel de fonction (jal) met l’adresse de retour dans le registre $ra (31), et si
on effectue des appels de fonction imbriqués sans sauver ce registre, on perd les
adresses de retour de tous les appels sauf le dernier.
• Si on a des fonctions récursives, chaque instance de la fonction récursive exécute le
même code, et donc utilise forcément les mêmes registres, donc si on ne sauve pas
ces registres quelque part, on perd la valeur qu’ils avaient dans tous les appels, sauf
le dernier.
75
LES PROCÉDURES ET LES FONCTIONS
• Une fonction récursive qui calcule la factorielle
d’un nombre donné
Tester le cas trivial
Sauvegarder $ra et
• Programme principal
$a0 (empiler)
L’appel récursif
76
LES PROCÉDURES ET LES FONCTIONS
Le passage des paramètres:
Le passage des paramètres pour les fonctions et les procédures se fait
par valeur ou par adresse(variable, référence).