Processeur MIPS R3000. Architecture externe et jeu d`instructions

publicité
Ensimag - Filières SLE/ISI
Processeur M IPS R3000.
Architecture externe et jeu d’instructions
M IPS R3000 jeu d’instructions
page - 1
Ensimag - Filières SLE/ISI
A)
Introduction
Ce document décrit l’architecture externe ainsi que le jeu d’instructions du processeur M IPS R3000. Le M IPS
R3000 est la deuxième génération de processeur de la société M IPS1 , et n’est plus commercialisé aujourd’hui.
Son successeur est le R4000 qui lui ressemble fort. Des informations sur cette famille de processeurs, très utilisée dans les applications embarquées et dans les machines parallèle à mémoire partagées, sont disponibles
sur le site www.mips.com.
L’architecture externe est le niveau d’abstraction nécessaire à l’écriture de programmes assembleur, de la
partie génération de code d’un compilateur, et du programmeur de systèmes d’exploitation multi-processus
(et/ou multi-tâches). Sont détaillés :
– les registres visibles du logiciel ;
– l’adressage de la mémoire ;
– le jeu d’instruction ;
– les mécanismes de traitement des exceptions, interruptions et appels systèmes.
L’architecture interne sera décrite en détail durant le cours.
B)
Notations
Par convention, nous utiliserons les notations du langage C pour la description des constantes, et pour la
terminologie en général.
La description des instructions nécessite également l’introduction de quelques notations :
=
+
−
×
.
.
mod
and
or
nor
xor
memb [a]
←
⇒
k
xn
xp...q
test d’égalité
addition entière en complément à deux
soustraction entière en complément à deux
multiplication entière en complément à deux
division entière en complément à deux
reste de la division entière en complément à deux
opérateur et bit-à-bit
opérateur ou bit-à-bit
opérateur non-ou bit-à-bit
opérateur ou-exclusif bit-à-bit
contenu de la mémoire à l’adresse a accédée sur b octets
assignation
implication
concaténation de chaînes de bits
réplication du bit x dans une chaîne de n bits. Notons que x est
un unique bit
sélection des bits p à q de la chaîne de bits x
Certains opérateurs n’étant pas évidents, nous donnons ici quelques exemples.
1 M IPS
signifie Microprocessor without Interlocked Pipeline Stage.
M IPS R3000 jeu d’instructions
page - 2
Ensimag - Filières SLE/ISI
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
Posons 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 la chaîne de bit x, qui a une longueur de 16 bits, le bit le plus à
droite étant le bit de poids faible et de numéro zéro, et le bit le plus à gauche étant le bit de poids fort et de
numéro 15. x6...3 est la chaîne 1001. x16
15 crée une chaîne de 16 bits de long dupliquant le bit 15 de x, zéro
16
dans le cas présent. x15 k x15...0 est la valeur 32 bits avec extension de signe d’un immédiat en complément
à deux de 16 bits.
M IPS R3000 jeu d’instructions
page - 3
Ensimag - Filières SLE/ISI
C)
Architecture externe
Le processeur possède deux modes, le mode utilisateur (ou user) pour exécuter les applications, et le mode
noyau (ou kernel) pour exécuter le système. Ces 2 modes sont nécessaires à l’exécution sure de plusieurs
processus sur un même processeur.
1)
Registres visibles du logiciel
Les registres du M IPS R3000 visibles du logiciel, c.-à-d. qui sont manipulés par les instructions implicitement
ou explicitement, ont tous une taille de 32 bits.
Le M IPS R3000 visant par construction l’exécution de multiples processus, des mécanismes de protections
sont mis en œuvre pour l’accès aux registres relatifs au système. Ces derniers registres appartiennent à un
coprocesseur système dit coprocesseur 0 ou cop0. Les accès à ce coprocesseur ne peuvent avoir lieu qu’en
mode noyau.
registres du processeur
hormis $0 et $31, ils sont identiques du point de vue du matériel, et ils peuvent être accèdes dans les
2 modes.
$i , (0 ≤ i ≤ 31)
ce sont les registres d’usage général. Les opérandes des instructions et leur(s) résultat(s) y sont
placés.
Le registre $0 peut être écrit mais retourne toujours 0x00000000 lors de la lecture.
Le registre $31 est utilisé implicitement (c.-à-d. que le matériel en impose l’utilisation et qu’il
n’apparaît donc pas dans l’instruction) pour sauvegarder l’adresse de retour d’appels de foncions
lors des instructions bgezal, bltzal, et jal ;
pc , program counter
ce registre contient l’adresse de l’instruction à exécuter. Sa valeur est modifiée par toutes les
instructions ;
ir , instruction register
ce registre contient l’instruction en cours d’exécution. Il n’est pas directement accessible
hi et lo
ces registres contiennent le résultat de la multiplication sur 64 bits, ou le résultat de la division
euclidienne (quotient dans lo et reste dans hi).
registres du coprocesseur 0
ces registres concernent la gestion des exceptions, interruptions et appels systèmes.
badvaddr , bad virtual address
ce registre contient l’adresse fautive en cas d’exception de type « adresse illégale » ;
status
c’est le registre d’état. Il contient les masques d’interruption et le mode ;
cause
c’est le registre qui contient la cause de l’exception ;
M IPS R3000 jeu d’instructions
page - 4
Ensimag - Filières SLE/ISI
$0
$pc
$1
$ir
$hi
$31
$lo
F IG . 1 – Registres généraux du M IPSR3000.
epc , exception program counter
ce registre contient l’adresse de retour en cas d’interruption et l’adresse de l’instruction fautive en
cas d’exception ou d’appel système.
Ces registres concernent la gestion de la mémoire virtuelle.
TLB , Transaltion Lookaside Buffer
c’est la mémoire associative pour la traduction adresse virtuelle vers adresse physique ;
index
registre contenant l’index de la TLB dans lequel faire les accès ;
random
registre contenant un index aléatoire valide pour les accès à la TLB ;
context
registre utilisé partiellement par le logiciel (une partie sert à pointer sur la structure des pages
du système d’exploitation) et par le matériel (l’autre partie contient les poids forts de l’adresse
fautive lors d’une traduction qui échoue) pour faciliter l’écriture en logiciel de la gestion de la
mémoire virtuelle ;
entryhi et entrylo
valeur à comparer aux entrées de la TLB pour savoir s’il y a une erreur de page (page fault).
entryhi
10
TLB
entrylo
2
index
0
status
12
random
1
cause
13
context
4
epc
14
badvaddr 8
prid
15
F IG . 2 – Registres du coprocesseur 0 du M IPSR3000.
M IPS R3000 jeu d’instructions
page - 5
Ensimag - Filières SLE/ISI
2)
Adressage mémoire
Toutes les adresses émises par le processeur sont des adresses octet (byte), codées sur 32 bits.
Le processeur peut lire des instructions (32 bits), des mots (32 bits), des demi-mots (16 bits) et des octets
(8 bits). Il peut écrire des mots, des demi-mots et des octets.
Les adresses des mots et les instructions doivent être des multiples de 4, et celles des demi-mots doivent être
des multiples de 2. Un accès à une adresse non alignée génère une exception.
Il n’y a qu’un seul mode d’adressage, qui est le mode « indirect registre ». L’adresse effective est a =
$i + offset. Ou $i est n’importe quel registre général et offset un immédiat sur 16 bits étendu de signe.
L’immédiat se trouve dans les 16 bits de poids faible du registre ir.
La conversion des adresses virtuelles vers les adresses physiques se fait grâce à une table de translation
d’adresses totalement associative. Le cache est en adresses physiques.
0xFFFFFFFF
kseg2
0xc0000000
0xbFFFFFFF
kseg1
0xa0000000
0x9FFFFFFF
kseg0
0x80000000
0x7FFFFFFF
kuseg
1 Giga octets
Traduites
Cachées
0.5 Giga octets
Non traduites
Non cachées
0.5 Giga octets
Non traduites
Cachées
2 Giga octets
Traduites
Cachées
segment
noyau
segment
utilisateur
0x00000000
F IG . 3 – Segmentation mémoire du M IPSR3000.
D)
1)
Reset, appels systèmes, interruptions et exceptions
Fonctionnement
Ces actions passent toutes en mode noyau.
Le reset à lieu lors de la mise sous tension du processeur, ou lors de la mise à zéro de la broche reset. Le
registre pc prend la valeur 0xbfc00000, les interruptions sont masquées, le registre random prend la valeur
du dernier index de la TLB et les interruptions sont masqués par action sur le registre status.
Les « appels systèmes » correspondent à des services fournies par le noyau auxquels on accède grâce aux
deux instructions syscall et break. Le registre pc prend la valeur 0x80000080, et les interruptions sont
masquées. Le registre epc contient l’adresse de l’instruction qui à causé l’appel système.
M IPS R3000 jeu d’instructions
page - 6
Ensimag - Filières SLE/ISI
Int
MOD
0x0
0x1
TLBL
0x2
TLBS
0x3
AdEL
0x4
AdES
IBE
0x5
0x6
DBE
0x7
Sys
Bp
RI
CpU
Ovf
0x8
0x9
0xA
0xB
0xC
TAB . 1 – Raisons des déroutements
interruption.
modification de TLB. Cette exception est levée lorsque
que l’adresse virtuelle d’une écriture correspond à une
entrée de la TLB marqué non-inscriptible ;
rechargement de la TLB. Indique que le système d’exploitation doit recharger la TLB pour effectuer une lecture ;
rechargement de la TLB. Indique que le système d’exploitation doit recharger la TLB pour effectuer une
écriture ;
erreur d’adressage lors de la lecture d’une donnée ou
d’une instruction ;
erreur d’adressage lors de l’écriture d’une donnée ;
erreur lors d’un accès mémoire pour la lecture d’une
instruction ;
erreur lors d’un accès mémoire pour la lecture ou
l’écriture d’une donnée ;
appel système ;
point d’arrêt ;
instruction inconnue (ou réservée) ;
tentative avortée d’accès à un coprocesseur ;
dépassement de capacité lors d’un calcul arithmétique.
Les interruptions matérielles sont des évènements asynchrones déclenchés par la mise à 1 d’une broche du
processeur. Il y a 6 broches d’interruption sur le M IPS, et elles sont masquables soit individuellement soit
collectivement par action sur le registre status. L’interruption doit être maintenue par le périphérique tant
qu’elle n’a pas été acquittée. Le registre pc prend la valeur 0x80000080, et les interruptions sont masquées.
L’instruction en cours d’exécution lors d’une interruption est achevée, puis le programme est dérouté. Le
registre epc contient l’adresse de l’instruction qui suit l’instruction durant laquelle l’interruption a été levée.
Il existe également deux interruptions logicielles, qui sont levées par la mise à 1 d’un bit dans le registre
cause, et donc le comportement est identique aux interruptions matérielles.
Les exceptions sont des évènements synchrones liés à la mauvaise exécution d’une instruction. Le registre pc
prend la valeur 0x80000080 dans le cas général, ou 0x80000000 dans certain cas particulier liés à la gestion
de la mémoire virtuelle. les interruptions sont masquées, et le registre epc contient l’adresse de l’instruction
fautive, ce qui permet d’émettre des diagnostiques.
Si une des ces actions à lieu dans une instruction qui suit un branchement, ce n’est pas l’adresse de l’instruction qui est mise dans epc, mais celle du branchement, et le bit bd du registre cause est mis à 1.
2)
Détail des registres liés aux exceptions autres que celles relatives à la gestion de
la mémoire virtuelle
Ces registres ne sont accessibles que par les instructions mfc0 et mtc0, qui elles mêmes ne sont utilisables
qu’en mode noyau. Les registres ci-dessous sont mis à jour lors d’un déroutement. Les mécanismes à mettre
en œuvre lorsque la gestion de la mémoire virtuelle est concernée sont complémentaires, et présentés dans
la section suivante.
M IPS R3000 jeu d’instructions
page - 7
Ensimag - Filières SLE/ISI
Registre status($12 du coprocesseur 0, accessible en lecture/écriture)
31
30
29
28
CU3 CU2 CU1 CU0
27 26 25 24
23
22 21 20 19 18 17 16
0
BEV
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
HIM5 HIM4 HIM3 HIM2 HIM1 HIM0 SIM1 SIM0 0 KUo IEo KUp IEp KUc IEc
CUi coprocessor usable. Ces 4 bits sont des bits de présence des coprocesseurs. Le M IPSde base n’en comporte
qu’un, CP0. D’autres implantations peuvent en avoir jusqu’à trois autres. Un bit à 1 indique que le
coprocesseur est utilisable ;
BEV bootstrap exception vector. Ce bit définit l’adresse du gestionnaire d’interruption. Les différents cas, en fonction de BEV et de la cause du déroutement sont tabulés ici.
BEV cause
adresse
x
reset
0xbfc00000
0
!reset && !TLB refill 0x80000080
0
!reset && TLB refill 0x80000000
1
!reset && !TLB refill 0xbfc00180
1
!reset && TLB refill 0xbfc00100
HIMi , SIMi hardware and software interrupt mask. Ces bits contrôlent individuellement le fait qu’une certaine ligne d’interruption puisse interrompre le processeur. Un et logique avec les bits d’interruption
en attente dans le registre cause permet au logiciel de connaître les interruptions actives. Un bit à 1
autorise l’interruption ;
KU kernet/user. Indique le mode d’exécution. Un 0 indique le mode noyau, un 1 le mode utilisateur ;
IE interrupt enable. Autorise ou inhibe toutes les interruptions. Un 0 masque les interruptions, un 1 les
autorise.
Lors d’un déroutement, le registre status est modifié par le matériel. Les bits KUo et IEo sont perdus. Les
bits KUp et IEp sont copiés dans KUo et IEo . Les bits KUc et IEc sont copiés dans KUp et IEp . Les bits KUc et
IEc sont mis à zéro.
Le suffixe indique donc le niveau d’imbrication des déroutements : c signifie current, p previous et o old.
L’opération à peu près inverse est effectuée sur le registre status lors de l’exécution de l’instruction rfe : les
bits KUp et IEp sont copiés dans KUc et IEc , et les bits KUo et IEo sont copiés dans KUp et IEp .
Registre cause($13 du coprocesseur 0, accessible en lecture)
31
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
BD 0 CE
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
HIP5 HIP4 HIP3 HIP2 HIP1 HIP0 SIP1 SIP0 0 EXCODE 0
BD branch delay. Ce bit est à 1 si l’exception ou l’interruption a été levée dans le delayed slot d’un branchement ;
CE coprocessor error. Indique le numéro du coprocesseur en erreur sur une exception de type CpU ;
HIPi , SIPi hardware and software interrupt pending. Ces bits reflètent l’état des lignes d’interruption. Un et
logique avec les bits de masque d’interruption du registre status permet au logiciel de connaître les
interruptions actives. Un 1 signifie que l’interruption est présente sur la ligne ;
EXCODE exception code. Code indiquant la raison pour laquelle le déroutement a eu lieu. La valeur du code
sur 4 bits est donnée par la table 1.
Registre epc($14 du coprocesseur 0, accessible en lecture)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
EPC
M IPS R3000 jeu d’instructions
page - 8
Ensimag - Filières SLE/ISI
EPC exception program counter. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une
interruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si
le bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette
instruction si BD est à 1.
Registre badvaddr($8 du coprocesseur 0, accessible en lecture)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
BVA
BVA bad virtual address. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une interruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si le
bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette
instruction si BD est à 1.
E)
Gestion de la mémoire virtuelle
La gestion de la mémoire virtuelle est intimement liée aux exceptions, car la possibilité d’exécuter du code
est directement lié à la présence physique des données et des instructions, et ne doit en rien être visible du
programmeur d’applications. Le chargement des pages doit donc être géré de manière transparente vis-à-vis
du programme qui s’exécute par le système d’exploitation.
L’objectif de la mémoire virtuelle est de rendre disponible à un programme donné tout l’espace adressable
par le M IPS, même si la mémoire physique est d’une part partagée par plusieurs programmes et d’autre part
de taille inférieure à 232 (ou 264 sur les machines 64 bits).
Il y a donc 2 idées derrière la mémoire virtuelle :
1. pouvoir partager l’espace mémoire physique entre divers processus sans qu’ils se perturbent les uns les
autres (c’est la différence entre un process et un thread dans l’acception Unixienne de ces termes) ;
2. rendre accessible la totalité de l’espace adressable à un processus.
Pour ce faire, a) la mémoire (physique ou virtuelle) est découpée en pages, b) chaque processus reçoit un
identifiant unique parmi tous les processus connus du processeur, et c) le disque est utilisé pour sauver les
pages de mémoire physique qui sont utilisées plusieurs fois à des dates différentes (qu’elles appartiennent
au même processus ou à différents processus).
La traduction associe, à un instant t, une adresse (de page) physique à un couple (identifiant de processus,
adresse (de page) virtuelle). Dans le M IPSR3000, les mécanismes nécessaires pour garantir la gestion cohérente de ces traductions (par ex., s’il n’y a plus de pages physiques libres, il faut en évincer une sur le disque
(le swap) et la réaffecter temporairement à un nouveau couple ((identifiant de processus, adresse virtuelle))
reposent complètement sur le logiciel. Ces aspects seront étudiés dans le cours de Système d’exploitation.
Néanmoins, comme l’exécution doit être transparente aux programmes applicatifs, le matériel doit détecter
l’absence d’une page en mémoire physique et donner suffisamment d’information au système d’exploitation
pour effectuer sa gestion de manière cohérente.
Pour ce faire, le M IPSR3000 possède une table de traduction (Translation Lookaside Buffer ou TLB) de 64
entrées de 64 bits. Cette table permet d’associer une adresse de page physique à un couple (identifiant
de processus, adresse virtuelle). Il se peut que, vu sa petite taille, la table ne contienne pas l’information
nécessaire à la traduction. Dans ce cas une exception de type TLB refill (TLBL ou TLBS) est levée, et c’est au
M IPS R3000 jeu d’instructions
page - 9
Ensimag - Filières SLE/ISI
système d’exploitation d’aller la mettre à jour. Notez que le système peut lui même avoir une des pages le
concernant évincée, ce qui va lever un nouveau TLB refill durant la gestion du précédent TLB refill. Le support
spécifique fourni par le M IPSdans ce cas est que l’adresse du gestionnaire d’exception est différente dans les
2 cas, car l’écriture d’un gestionnaire de rechargement réentrant n’est simplement pas possible, puisque ce
sont des variables globales qui sont utilisées.
Format du couple (identifiant, adresse virtuelle) :
37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
ASID
8
VPN
7
6
5
4
3
2
1
0
OFFSET
ASID address space identifier. L’identifiant du processus dont il est question ici n’est pas le process id obtenu
par getpid (2), mais un nombre sur 6 bits (car log2 64 = 6) calculé par le système d’exploitation
uniquement pour la gestion de la TLB ;
VPN virtual page number. Ces 20 bits représentent le numéro de page virtuelle. Il y a donc 220 , soit 1 Mega,
pages virtuelles. Les 3 bits de poids fort de l’adresse définissent le type de traduction à effectuer (voir
la figure 3). Les adresses dans les segments kseg0 et kseg1 ne subissent pas la traduction d’adresse
standard. Une adresse a de kseg0 sera émise sur le bus comme a - Ox80000000, et une adresse a de
kseg1 sera émise sur le bus comme a - Oxa0000000 ;
OFFSET ces 12 bits représentent le déplacement dans la page sont passés sans modification sur le bus
mémoire. La taille de la page est de 212 , soit 4 Kilo.
Les entrées de la TLB sont sur 64 bits, et correspondent à la concaténation des registres entryhi et entrylo.
Ne sont donc ici décrit que ces 2 registres.
Registre entryhi($10 du coprocesseur 0, accessible en lecture/écriture) :
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
VPN
8
7
6
5
4
3
ASID
2
1
0
0
VPN virtual page number. Les 20 bits de poids fort de l’adresse virtuelle ;
ASID address space identifier. L’identifiant du processus qui permet de savoir si deux adresses virtuelles
identiques appartiennent à deux processus différents ou non.
Registre entrylo($2 du coprocesseur 0, accessible en lecture/écriture) :
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
PFN
8
7
6
5
NDVG
4
3
2
1
0
0
PFN page frame number. Les 20 bits de poids fort de l’adresse physique. Si la traduction d’adresse est valide,
alors les bits de PFN sont substitué à ceux de VPN dans le cycle ;
N non cachable. L’accès mémoire se fait sans passer par le cache ;
D dirty. Si ce bit est à 0, la page est protégée en écriture, et un accès en écriture dans la page lèvera
l’exception MOD. Ceci permet au système d’exploitation de gérer des zones en lecture seulement (comme
le code ou les constantes d’un programme par exemple) ;
V valid. Indique que l’entrée dans la TLB est valide. Si ce bit est à zéro, une exception de type TLBS ou TLBL
est levée ;
G global. La translation d’adresse se fait en ignorant purement et simplement le champs ASID lors de la
traduction.
Registre index($0 du coprocesseur 0, accessible en lecture/écriture) :
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
PF
0
INDEX
8
7
6
5
4
3
2
1
0
0
PF probe failure. Ce bit est mis à un si l’instruction tlbp n’a pas détecté d’entrée valide dans la TLB ;
M IPS R3000 jeu d’instructions
page - 10
Ensimag - Filières SLE/ISI
INDEX index de l’entrée de la TLB qui sera affectée par les instructions tlbr et tlbw.
Registre random($1 du coprocesseur 0, accessible en lecture) :
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
0
RANDOM
8
7
6
5
4
3
2
1
0
0
RANDOM index de l’entrée de la TLB qui sera affectée par l’instruction tlbwr. Cet index est compris entre
8 et 63. Les 7 premiers index peuvent donc être réservés à des usages spécifiques par le système
d’exploitation.
M IPS R3000 jeu d’instructions
page - 11
Ensimag - Filières SLE/ISI
F)
Instructions
Une instruction M IPSest un mot de 32 bits. Il y a trois catégories (formats) d’instruction :
31
2625
2120
1615
Format R : opcode
rs
rt
Format I : opcode
rs
rt
1110
rd
65
sh
0
func
imm16
Format J : opcode
imm26
Dans ce qui suit, nous notons rd la valeur du champs rd, c’est à dire un entier entre 0 et 31 car rd est codé
sur 5 bits, et indiquons par $rd le registre indexé par ce champs. Si $rd est le membre de gauche d’une
affectation, alors nous en imposons la valeur, si il fait parti du membre de droite, nous en lisons la valeur.
Nous ne pouvons en aucun cas modifier rd qui est une constante décidée lors de la compilation. Notons
qu’un registre source peut être le registre destination d’une même instruction assembleur. Un opérande
immédiat sera noté imm, et sa taille sera spécifié dans la description de l’instruction. Les instructions de saut
prennent comme argument une étiquette, où label, qui est utilisée pour calculer l’adresse de saut. Toutes
les instructions modifient implicitement ou explicitement un registre non accessible du logiciel, le program
counter noté $pc. Pour lever l’ambiguïté liée aux calculs des sauts relatifs au $pc, nous noterons que l’adresse
de l’instruction en cours d’exécution est toujours égale à $pc − 4, car $pc est incrémenté (pour passer
à l’instruction suivante) en même temps que l’instruction à exécutée est chargée. Le $pc à droite d’une
affectation est donc toujours égal à l’adresse de l’instruction courante plus 4. Attention : le M IPS R3000 est
un processeur pipeline tel que l’instruction qui suit un branchement (relatif ou absolu) est toujours exécutée.
On appel cet emplacement le delay slot et on dit que le branchement effectif est retardé d’une instruction.
Le résultat d’une multiplication ou d’une division est mis dans deux registres spéciaux, $hi pour les poids
forts (multiplication) ou le reste (division), et $lo pour les poids faibles (multiplication) ou le quotien
(division).
add
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
100000
action
Addition registre registre signée
syntaxe
add $rd, $rs, $rt
description
Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé
dans le registre $rd.
opération
$rd ← $rs + $rt
exception
génération d’une exception si dépassement de capacité.
addi
M IPS R3000 jeu d’instructions
page - 12
Ensimag - Filières SLE/ISI
format
31
26 25
001000
21 20
rs
16 15
0
rt
imm16
action
Addition registre immédiat signée
syntaxe
addi $rt, $rs, imm
description
La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre
$rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi
utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1.
opération
$rt ← imm16
15 k imm15...0 + $rs
exception
génération d’une exception si dépassement de capacité.
addiu
format
31
26 25
001001
21 20
rs
16 15
0
rt
imm16
action
Addition registre immédiat non-signée
syntaxe
addiu $rt, $rs, imm
description
La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre
$rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi
utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1.
opération
$rt ← imm16
15 k imm15...0 + $rs
addu
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
100001
action
Addition registre registre non-signée
syntaxe
addu $rd, $rs, $rt
description
Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé
dans le registre $rd.
opération
$rd ← $rs + $rt
and
M IPS R3000 jeu d’instructions
page - 13
Ensimag - Filières SLE/ISI
format
31
26 25
000000
21 20
16 15
rs
rt
11 10
rd
6 5
00000
0
100100
action
Et bit-à-bit registre registre
syntaxe
and $rd, $rs, $rt
description
Un et bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé dans
le registre $rd.
opération
$rd ← $rs and $rd
andi
format
31
26 25
001100
21 20
rs
16 15
rt
0
imm16
action
Et bit-à-bit registre immédiat
syntaxe
andi $rt, $rs, imm
description
La valeur immédiate sur 16 bits subit une extension de zéros. Un et bit-à-bit est effectué entre
cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre
$rt.
opération
$rt ← 016 k imm and $rs
beq
format
31
26 25
000100
21 20
rs
16 15
rt
0
imm16
action
Branchement si registre égal registre
syntaxe
beq $rs, $rt, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres $rs
et $rt sont comparés. S’ils sont égaux, le programme saute à l’adresse précédemment calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs = $rt ⇒ $pc ← $addr
bgez
format
31
26 25
000001
21 20
rs
M IPS R3000 jeu d’instructions
16 15
00001
0
imm16
page - 14
Ensimag - Filières SLE/ISI
action
Branchement si registre supérieur ou égal à zéro
syntaxe
bgez $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre
$rs a son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs31 = 0 ⇒ $pc ← $addr
bgezal
format
31
26 25
000001
21 20
rs
16 15
10001
0
imm16
action
Branchement à une fonction si registre supérieur ou égal à zéro
syntaxe
bgezal $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement,
l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre
$rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$31 ← $pc
$rs31 = 0 ⇒ $pc ← $addr
bgtz
format
31
26 25
000111
21 20
rs
16 15
00000
0
imm16
action
Branchement si registre strictement supérieur à zéro
syntaxe
bgtz $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $ri
à son bit de signe à zéro et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment
calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs31 = 0 ∧ $rs 6= 0 ⇒ $pc ← $addr
M IPS R3000 jeu d’instructions
page - 15
Ensimag - Filières SLE/ISI
blez
format
31
26 25
000110
21 20
rs
16 15
00000
0
imm16
action
Branchement si registre inférieur ou égal à zéro
syntaxe
blez $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $rs
à son bit de signe à un et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment
calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs31 = 1 ∧ $rs 6= 0 ⇒ $pc ← $addr
bltz
format
31
26 25
000001
21 20
rs
16 15
00000
0
imm16
action
Branchement si registre strictement inférieur à zéro
syntaxe
bltz $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre
$rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs31 = 1 ⇒ $pc ← $addr
bltzal
format
31
26 25
000001
21 20
rs
16 15
10000
0
imm16
action
Branchement à une fonction si registre supérieur ou égal à zéro
syntaxe
bltzal $rs, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement,
l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre
$rs à son bit de signe à un, le programme saute à l’adresse précédemment calculée.
M IPS R3000 jeu d’instructions
page - 16
Ensimag - Filières SLE/ISI
opération
2
$addr ← $pc + imm14
15 k imm k 0
$31 ← $pc
$rs31 = 1 ⇒ $pc ← $addr
bne
format
31
26 25
000101
21 20
rs
16 15
0
rt
imm16
action
Branchement si registre différent de registre
syntaxe
bne $rs, $rt, imm
description
L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres
$rs et $rt sont comparés. S’ils sont différents, le programme saute à l’adresse précédemment
calculée.
opération
2
$addr ← $pc + imm14
15 k imm k 0
$rs 6= $rt ⇒ $pc ← $addr
break
format
31
26 25
6 5
000000
code
0
001101
action
Arrêt et saut à la routine d’exception
syntaxe
break code
description
Un point d’arrêt est detecté, et le programme saute à l’adresse de la routine de gestion des exceptions. Le champs code est utilisable par le logiciel pour identifier le type de point d’arrêt.
opération
pc ← 0x80000080
exception
Déclenchement d’une exception de type point d’arrêt.
div
format
31
26 25
000000
21 20
rs
16 15
rt
6 5
0000000000
0
011010
action
Division entière et reste signé registre registre
syntaxe
div $rs, $rt
M IPS R3000 jeu d’instructions
page - 17
Ensimag - Filières SLE/ISI
description
Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres
étant considéré comme des nombres en complément à deux. Le résultat de la division est placé
dans le registre spécial $lo, et le reste dans $hi. La division est une opération multicycles.
opération
$lo ← $rs
$rt
$hi ← $rs mod $rt
divu
format
31
26 25
000000
21 20
rs
16 15
6 5
rt
0000000000
0
011011
action
Division entière et reste non-signé registre registre
syntaxe
divu $rs, $rs
description
Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres
étant considéré comme des nombres non signés. Le résultat de la division est placé dans le registre
spécial $lo, et le reste dans $hi.
opération
$lo ← 0k$rs
0k$rt
$hi ← 0 k $rs mod 0 k $rt
j
format
31
26 25
000010
0
imm26
action
Branchement inconditionnel immédiat
syntaxe
j imm
description
L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2
bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. Le programme saute inconditionnellement à l’adresse ainsi calculée.
opération
$pc ← $pc31...28 k imm k 02
jal
format
31
26 25
000011
0
imm26
action
Appel de fonction inconditionnel immédiat
syntaxe
jal imm
M IPS R3000 jeu d’instructions
page - 18
Ensimag - Filières SLE/ISI
description
L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2
bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. L’adresse de l’instruction suivant
le jal est sauvée dans le registre $31. Le programme saute inconditionnellement à l’adresse ainsi
calculée.
opération
$31 ← $pc
$pc ← $pc31...28 k imm k 02
jalr
format
31
26 25
000000
21 20
rs
16 15
00000
11 10
rd
6 5
00000
0
001001
action
Appel de fonction inconditionnel registre
syntaxe
jalr $rs ou
jalr $rd, $rs
description
Le programme saute à l’adresse contenue dans le registre $rs. L’adresse de l’instruction suivant
le jalr est sauvée dans le registre $rd. Si le registre $rd n’est pas spécifié, alors l’assembleur
y mettra par défaut le registre $31. Attention, l’adresse contenue dans le registre $rs doit être
aligné sur une frontière de mots.
opération
$rd ← $pc
$pc ← $rs
jr
format
31
26 25
000000
21 20
6 5
rs
000000000000000
0
001000
action
Branchement inconditionnel registre
syntaxe
jr $rs
description
Le programme saute à l’adresse contenue dans le registre $ri. Attention, cette adresse doit être
aligné sur une frontière de mots.
opération
$pc ← $rs
lb
format
31
26 25
100000
21 20
rs
16 15
rt
0
imm16
action
Lecture d’un octet signé de la mémoire
M IPS R3000 jeu d’instructions
page - 19
Ensimag - Filières SLE/ISI
syntaxe
lb $rt, imm($rs)
description
L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et
est ensuite placé dans le registre $rt.
opération
$rt ← mem1 [imm + $rs]24
7 k mem1 [imm + $rs]7...0
exception
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
lbu
format
31
26 25
100100
21 20
rs
16 15
rt
0
imm16
action
Lecture d’un octet non-signé de la mémoire
syntaxe
lbu $rt, imm($rs)
description
L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite
placé dans le registre $rt.
opération
$rt ← 024 k mem1 [imm + $rs]7...0
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
lh
format
31
26 25
100001
21 20
rs
16 15
rt
0
imm16
action
Lecture d’un demi-mot signé de la mémoire
syntaxe
lh $rt, imm($rs)
description
L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et
est ensuite placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit
être à zéro.
opération
$rt ← mem2 [imm + $rs]16
15 k mem2 [imm + $rs]15...0
M IPS R3000 jeu d’instructions
page - 20
Ensimag - Filières SLE/ISI
exceptions
– Adresse non alignée sur une frontière de demi-mot. ;
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
lhu
format
31
26 25
100101
21 20
rs
16 15
rt
0
imm16
action
Lecture d’un demi-mot non-signé de la mémoire
syntaxe
lhu $rt, imm($rs)
description
L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite
placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit être à zéro.
opération
$rt ← 016 k mem2 [imm + $rs]15...0
exceptions
– Adresse non alignée sur une frontière de demi-mot. ;
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
lui
format
31
26 25
001111
21 20
00000
16 15
rt
0
imm16
action
Lecture d’une constante dans les poids forts
syntaxe
lui $rt, 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. La
valeur ainsi obtenue est placée dans $rt.
opération
$rt ← imm k 016
lw
format
31
26 25
100011
21 20
rs
16 15
rt
0
imm16
action
Lecture d’un mot de la mémoire
M IPS R3000 jeu d’instructions
page - 21
Ensimag - Filières SLE/ISI
syntaxe
lw $rt, imm($rs)
description
L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
signe, et du contenu du registre $rs. Le contenu de cette adresse est placé dans le registre $rt.
Attention, les deux bits de poids faible de l’adresse résultante doivent être à zéro.
opération
$rt ← mem4 [imm + $rs]
exceptions
– Adresse non alignée sur une frontière de mot ;
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
mfc0
format
31
26 25
010000
21 20
00000
16 15
rt
11 10
0
rd
0000000000
action
Copie d’un registre spécialisé dans d’un registre général
syntaxe
mfc0 $rt, $rd
description
Le contenu du registre spécialisé $rd — non directement accessible au programmeur — est recopié dans le registre général $rt. Les registres possibles pour $rd sont ceux du coprocesseur 0 qui
servent à la gestion des exceptions et interruptions.
opération
$rt ← copro0 [$rd]
exception
– Utilisation de l’instruction en mode utilisateur.
mfhi
format
31
26 25
000000
16 15
0000000000
11 10
rd
6 5
00000
0
010000
action
Copie le registre $hi dans un registre général
syntaxe
mfhi $rd
description
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.
opération
$rd ← $hi
M IPS R3000 jeu d’instructions
page - 22
Ensimag - Filières SLE/ISI
mflo
format
31
26 25
16 15
000000
0000000000
11 10
rd
6 5
00000
0
010010
action
Copie le registre $lo dans un registre général
syntaxe
mflo $rd
description
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.
opération
$rd ← $lo
mtc0
format
31
26 25
010000
21 20
00100
16 15
rt
11 10
rd
0
0000000000
action
Copie d’un registre général dans un registre spécialisé
syntaxe
mtc0 $rt, $rd
description
Le contenu du registre général $rt est recopié dans le registre spécialisé $rd — non directement
accessible au programmeur —. Ces registres sont ceux du coprocesseur 0 qui servent à la gestion
des exceptions et interruptions.
opération
copro0 [$rd] ← $rt
mthi
format
31
26 25
000000
21 20
rs
6 5
000000000000000
0
010001
action
Copie d’un registre général dans le registre $hi
syntaxe
mthi $rs
description
Le contenu du registre général $rs est recopié dans le registre spécialisé $hi.
opération
$hi ← $rs
mtlo
format
31
26 25
000000
21 20
rs
M IPS R3000 jeu d’instructions
6 5
000000000000000
0
010011
page - 23
Ensimag - Filières SLE/ISI
action
Copie d’un registre général dans le registre $lo
syntaxe
mtlo $rs
description
Le contenu du registre général $rs est recopié dans le registre spécialisé $lo.
opération
$lo ← $rs
mult
format
31
26 25
000000
21 20
rs
16 15
rt
6 5
0000000000
0
001110
action
Multiplication signé registre registre
syntaxe
mult $rs, $rt
description
Le contenu du registre $rs est multiplié par le contenu du registre $rs, le contenu des deux
registres étant considéré comme des nombres en complément à deux. 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. La multiplication
est une opération multicycles.
opération
$lo ← ($rs × $rt)31...0
$hi ← ($rs × $rt)63...32
multu
format
31
26 25
000000
21 20
rs
16 15
rt
6 5
0000000000
0
011000
action
Multiplication signé registre registre
syntaxe
multu $rs, $rt
description
Le contenu du registre $rs est multiplié par le contenu du registre $rt, le contenu des deux
registres étant considéré comme des nombres non-signés. 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. La multiplication est une
opération multicycles.
opération
$lo ← (0 k $rs × 0 k $rt)31...0
$hi ← (0 k $rs × 0 k $rt)63...32
nor
format
31
26 25
000000
21 20
rs
M IPS R3000 jeu d’instructions
16 15
rt
11 10
rd
6 5
000000
0
00000
100111
page - 24
Ensimag - Filières SLE/ISI
action
Non-ou bit-à-bit registre registre
syntaxe
nor $rd, $rs, $rt
description
Un non-ou bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé
dans le registre $rd.
opération
$rd ← $rs nor $rt
or
format
31
26 25
21 20
000000
rs
16 15
rt
11 10
rd
6 5
000000
0
00000
100101
action
Ou bit-à-bit registre registre
syntaxe
or $rd, $rs, $rt
description
Un ou bit-à-bit est effectué entre les contenus des registres $rs et $rs. Le résultat est placé dans
le registre $rd.
opération
$rd ← $rs or $rt
ori
format
31
26 25
21 20
001101
rs
16 15
rt
0
imm16
action
Ou bit-à-bit registre immédiat
syntaxe
ori $rt, $rs, imm
description
La valeur immédiate sur 16 bits subit une extension de zéros. Un ou bit-à-bit est effectué entre
cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre
$rt.
opération
$rt ← (016 k imm) or $rs
rfe
format
31
26 25
010000
24
1
6 5
00000000000000000000
0
010000
action
Restauration des bits d’état en fin d’exception
syntaxe
rfe
M IPS R3000 jeu d’instructions
page - 25
Ensimag - Filières SLE/ISI
description
Recopie les anciennes valeurs des bits de masques d’interruption et de mode (noyau ou utilisateur)
du registre d’état — un des registres spécialisé — à la valeur qu’il avait avant l’exécution du
programme d’exception courant.
opération
$sr ← $sr31...4 k $sr5...2
exception
Utilisation de l’instruction en mode utilisateur.
sb
format
31
26 25
101000
21 20
rs
16 15
rt
0
imm16
action
Écriture d’un octet en mémoire
syntaxe
sb $rt, imm($rs)
description
L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
et du contenu du registre $rs. L’octet de poids faible du registre $rt est écrit à l’adresse ainsi
calculée.
opération
mem1 [imm + $rs] ← $rt7...0
exceptions
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
sh
format
31
26 25
101001
21 20
rs
16 15
rt
0
imm16
action
Écriture d’un demi-mot en mémoire
syntaxe
sh $rt, imm($rs)
description
L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et
du contenu du registre $rs. Les deux octets de poids faible du registre $rt sont écrit à l’adresse
ainsi calculée. Le bit de poids faible de cette adresse doit être à zéro.
opération
mem2 [imm + $rs] ← $rt15...0
exceptions
– Adresse non alignée sur une frontière de demi-mot ;
M IPS R3000 jeu d’instructions
page - 26
Ensimag - Filières SLE/ISI
– Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
– Mémoire inexistante à l’adresse de chargement.
sll
format
31
26 25
000000
21 20
00000
16 15
rt
11 10
rd
6 5
shamt
0
000000
action
Décalage à gauche immédiat
syntaxe
sll $rd, $rt, shamt
description
Le registre $rt 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 $rd.
opération
$rd ← $rt31−shamt...0 k 0shamt
sllv
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
000100
action
Décalage à gauche registre
syntaxe
sllv $rd, $rt, $rs
description
Le registre $rt est décalé à gauche du nombre de bits spécifiés dans les 5 bits de poids faibles du
registre $rs, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le
registre $rr.
opération
$rd ← $rt31−$rs4...0 ...0 k 0$rs4...0
slt
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
101010
action
Comparaison signée registre registre
syntaxe
slt $rd, $rs, $rt
description
Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant considérées comme des quantités signées. Si la valeur contenue dans $rs est inférieure à celle contenue
dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro.
opération
$rs < $rt ⇒ $rd ← 031 k 1
$rs ≥ $rt ⇒ $rd ← 032
M IPS R3000 jeu d’instructions
page - 27
Ensimag - Filières SLE/ISI
slti
format
31
26 25
001010
21 20
rs
16 15
0
rt
imm16
action
Comparaison signée registre immédiat
syntaxe
slti $rt, $rs, imm
description
Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une extension
de signe. Les deux valeurs étant considérées comme des quantités signées, si la valeur contenue
dans $rs est inférieure à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon il prend
la valeur zéro.
opération
31
$rs < imm16
k1
15 k imm ⇒ $rt ← 0
16
$rs ≥ imm15 k imm ⇒ $rt ← 032
sltiu
format
31
26 25
001011
21 20
rs
16 15
0
rt
imm16
action
Comparaison non-signée registre immédiat
syntaxe
sltiu $rt, $rs, imm
description
Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une extension de signe. Les deux valeurs étant considérées comme des quantités non-signées, si la valeur
contenue dans $rs est inférieur à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon
il prend la valeur zéro.
opération
31
0 k $rs < 0 k imm16
k1
15 k imm ⇒ $rt ← 0
16
0 k $rs ≥ 0 k imm15 k imm ⇒ $rt ← 032
sltu
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
101011
action
Comparaison non-signée registre registre
syntaxe
sltu $rd, $rs, $rt
description
Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant considérés comme des quantités non-signées. Si la valeur contenue dans $rs est inférieur à celle contenue
dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro.
M IPS R3000 jeu d’instructions
page - 28
Ensimag - Filières SLE/ISI
opération
0 k $rs < 0 k $rt ⇒ $rd ← 031 k 1
0 k $rs ≥ 0 k $rt ⇒ $rd ← 032
sra
format
31
26 25
000000
21 20
00000
16 15
rt
11 10
rd
6 5
shamt
0
000011
action
Décalage à droite arithmétique immédiat
syntaxe
sra $rd, $rt, shamt
description
Le registre $rt est décalé à droite de la valeur immédiate codée sur 5 bits, le bit de signe du
registre étant introduit dans les bits de poids fort. Le résultat est placé dans le registre $rd.
opération
$rd ← $rtimm
k $rt31...imm
31
srav
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
000111
action
Décalage à droite arithmétique registre
syntaxe
srav $rd, $rt, $rs
description
Le registre $rt est décalé à droite du nombre de bits spécifiés dans les 5 bits de poids faible du
registre $rs, le signe de $rt étant introduit dans les bits de poids fort ainsi libérés. Le résultat est
placé dans le registre $rd.
opération
$rs4...0
$rd ← $rt31
k $rt31...$rs4...0 ...0
srl
format
31
26 25
000000
21 20
00000
16 15
rt
11 10
rd
6 5
shamt
0
000010
action
Décalage à droite logique immédiat
syntaxe
srl $rd, $rt, shamt
description
Le registre $rt est décalé à droite de la valeur immédiate codée sur 5 bits, des zéros étant introduits dans les bits de poids fort. Le résultat est placé dans le registre $rd.
opération
$rd ← 0imm k $rt31...imm
srlv
M IPS R3000 jeu d’instructions
page - 29
Ensimag - Filières SLE/ISI
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
000110
action
Décalage à droite logique registre
syntaxe
srlv $rd, $rs, $rt
description
Le registre $rt est décalé à droite du nombre de bits spécifiés dans les 5 bits de poids faible du
registre $rs, des zéros étant introduits dans les bits de poids fort ainsi libérés. Le résultat est placé
dans le registre $rd.
opération
rd ← 0$rs4...0 k $rt31...$rs4...0 ...0
sub
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
100010
action
Soustraction registre registre signée
syntaxe
sub $rd, $rs, $rt
description
Le contenu du registre $rt est soustrait du contenu du registre $rs pour former un résultat sur
32 bits qui est placé dans le registre $rd.
opération
$rd ← $rs − $rt
exception
Dépassement de capacité.
subu
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
00000
0
100011
action
Soustraction registre registre non-signée
syntaxe
subu $rd, $rs, $rt
description
Le contenu du registre $rt est soustrait du contenu du registre $rs pour former un résultat sur
32 bits qui est placé dans le registre $rd.
opération
$rd ← $rs − $rt
sw
format
31
26 25
101011
21 20
rs
M IPS R3000 jeu d’instructions
16 15
rt
0
imm16
page - 30
Ensimag - Filières SLE/ISI
action
Écriture d’un mot en mémoire
syntaxe
sw $rt, imm($rs)
description
L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et
du contenu du registre $rs. Le contenu du registre $rt est écrit à l’adresse ainsi calculée. Les deux
bits de poids faible de cette adresse doivent être à zéro.
opération
mem4 [imm + $rs] ← $rt
exception
Adresse non alignée sur une frontière de mot.
syscall
format
31
26 25
6 5
000000
00000 00000 00000 00000
0
001100
action
Appel à une fonction du système (en mode noyau).
syntaxe
syscall
description
Un appel système est effectué, transférant immédiatement, et inconditionnellement le contrôle au
gestionnaire d’exception. Note : par convention, le numéro de l’appel système, c.-à-d. le code de
la fonction système à effectuer, est placé dans le registre $2.
opération
pc ← 0x80000080
exception
Déclenchement d’une exception de type appel système systématique.
tlbp
format
31
26 25
010000
24
1
6 5
00000000000000000000
0
001000
action
Vérifie la présence d’une entrée valide dans le tampon de traduction d’adresse.
syntaxe
tlbp
description
Le contenu du registre $entryhi est comparé à l’ensemble des entrées du tampon de traduction
d’adresses. Si une entrée correspond, alors l’adresse de cette entrée est écrite dans le registre
$index. Sinon, le bit de poids fort du registre $index est mis à 1.
opération
si ∃i|T LB[i]63..44 = $entryhi31..12 et (T LB[i]8 ou T LB[i]43..38 = $entryhi11..6 )
alors $index = 018 k i5..0 k 08
sinon $index = 1 k 031
M IPS R3000 jeu d’instructions
page - 31
Ensimag - Filières SLE/ISI
exception
Utilisation en mode utilisateur.
tlbr
format
31
26 25
010000
24
1
6 5
00000000000000000000
0
000001
action
Lit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $index du
coprocesseur 0.
syntaxe
tlbr
description
Cette instruction charge les registres $entryhi et $entrylo avec le contenu du tampon de traduction d’adresse indicé le registre $index.
opération
$entryhi ← T LB[$index13..8 ]63..32
$entrylo ← T LB[$index13..8 ]31..0
exception
Utilisation en mode utilisateur.
tlbwi
format
31
26 25
010000
24
1
6 5
00000000000000000000
0
000010
action
Écrit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $index
du coprocesseur 0.
syntaxe
tlbwi
description
Le contenu de la case indexée par le registre d’index du tampon de traduction d’adresse est écrasé
par les valeurs contenues dans les registres $entryhi et $entrylo du coprocesseur 0. Ceci permet
de modifier une entrée dans le tampon pour un processus en cours d’exécution, ou d’évincer les
informations de traduction d’un processus dont on sait qu’il va être peu utile dans le futur proche.
opération
T LB[$index13..8 ] ← $entryhi k $entrylo
exception
Utilisation en mode utilisateur.
tlbwr
format
31
26 25
010000
24
1
6 5
00000000000000000000
0
000110
action
Écrit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $random
du coprocesseur 0.
M IPS R3000 jeu d’instructions
page - 32
Ensimag - Filières SLE/ISI
syntaxe
tlbwr
description
Le contenu de la case indexée par le registre d’index du tampon de traduction d’adresse est écrasé
par les valeurs contenues dans les registres $entryhi et $entrylo du coprocesseur 0. Ceci permet
de créer une entrée dans le tampon pour un processus en cours d’exécution.
opération
T LB[$random13..8 ] ← $entryhi k $entrylo
exception
Utilisation en mode utilisateur.
xor
format
31
26 25
000000
21 20
rs
16 15
rt
11 10
rd
6 5
000000
0
00000
100110
action
Ou-exclusif bit-à-bit registre registre
syntaxe
xor $rd, $rs, $rt
description
Un ou-exclusif bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est
placé dans le registre $rd.
opération
$rd ← $rs xor $rt
xori
format
31
26 25
001110
21 20
rs
16 15
rt
0
imm16
action
Ou-exclusif bit-à-bit registre immédiat
syntaxe
xori $rt, $rs, imm
description
La valeur immédiate sur 16 bits subit une extension de zéros. Un ou-exclusif bit-à-bit est effectué entre cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le
registre $rt.
opération
$rt ← 016 k imm xor $rs
M IPS R3000 jeu d’instructions
page - 33
Ensimag - Filières SLE/ISI
G)
Encodage des instructions
Les tables suivantes présentent sous forme compacte le codage des différentes instructions.
31...29
5...3
20...19
25...24
5...3
000
001
010
011
100
101
110
111
000
001
010
011
100
101
110
111
00
01
10
11
00
01
10
11
000
001
010
011
100
101
110
111
000
special
addi
cop0
lb
sb
-
000
sll
jr
mfhi
mult
add
-
000
bltz
bltzal
-
000
mfc0
-
000
tlbp
rfe
-
001
regimm
addiu
lh
sh
-
001
jalr
mthi
multu
addu
-
010
j
slti
-
Champ opcode
28...26
011
jal
sltiu
lw
sw
-
100
beq
andi
lbu
-
101
bne
ori
lhu
-
Champ func, lorsque l’ opcode vaut special.
2...0
010
011
100
101
srl
sra
sllv
syscall
break
mflo
mtlo
div
divu
sub
subu
and
or
slt
sltu
-
110
blez
xori
-
111
bgtz
lui
-
110
srlv
xor
-
111
srav
nor
-
001
bgez
bgezal
-
Champ rt, lorsque l’ opcode vaut regimm.
18...16
010
011
100
-
101
-
110
-
111
-
001
-
Champ rs, lorsque l’ opcode vaut cop0.
23...21
010
011
100
mtc0
-
101
-
110
-
111
-
001
tlbr
-
Champ func, lorsque l’ opcode vaut cop0.
2...0
010
011
100
tlbwi
-
101
-
110
tlbwr
-
111
-
M IPS R3000 jeu d’instructions
page - 34
Ensimag - Filières SLE/ISI
H)
Organisation de la mémoire
Le but d’un programme écrit en langage d’assemblage est de fournir à un programme particulier (appelé
« assembleur ») les directives nécessaires pour générer le code binaire représentant les instructions et les
données qui devront être chargées en mémoire pour permettre au programme de s’exécuter sur du matériel.
Dans l’architecture M IPS R3000, l’espace adressable est divisé en deux segments : le segment utilisateur, et
le segment noyau.
Un programme utilisateur utilise généralement (c’est purement conventionnel pour un exécutable, mais
obligatoire avant l’édition de liens) plusieurs sous-segments (appelés sections) dans le segment utilisateur.
Ces sections sont décrites ci-dessous, telles que l’on les trouverait sur une machine Ultrix (du genre de la
DEC 5100) :
– la section .text contient le code exécutable. Elle est implantée conventionnellement à l’adresse
0x00400000 pour les programmes utilisateur. Sa taille est fixe et calculée lors de l’assemblage. La principale tâche de l’assembleur consiste à générer le code binaire correspondant au programme source décrit
en langage d’assemblage, qui sera chargé dans cette section ;
– les données globales (ou statiques) manipulées par le programme sont réparties dans plusieurs sections.
Elles commencent conventionnellement à l’adresse 0x10000000 pour les programmes utilisateur, et se
suivent avec une contrainte d’alignement de la taille du mot. Sa taille est fixe et calculée lors de l’assemblage. Les valeurs contenue dans cette section peuvent être initialisées grâce a des directives contenues
dans le programme source en langage d’assemblage. Le common object file format pour M IPS définit 5 types
de données possibles :
.rodata
les données en lecture seulement, forcément initialisées lors de la déclaration ;
.data
les données initialisées lors de leurs déclarations ;
.sdata
les « petites » (small) données initialisées lors de leurs déclarations. La taille est fixée par l’option -G
du compilateur ;
.sbss
les « petites » données non initialisées lors de la déclaration ;
.bss
les données non initialisées lors de la déclaration.
Les sections .sbss et .bss doivent être allouées lors du lancement du programme et initialisées à zéro2 .
2 bss
signifie blank static storage.
M IPS R3000 jeu d’instructions
page - 35
Ensimag - Filières SLE/ISI
I)
Règles syntaxiques
1. les noms de fichiers :
Les noms des fichiers contenant un programme source en langage d’assemblage doivent être suffixé
par « .s ». Exemple : monprogramme.s
2. les commentaires :
ils commencent par un # ou un ; et s’achèvent à la fin de la ligne courante. Exemple :
###############################################
# Source Assembleur MIPS de la fonction memcpy
###############################################
....
; sauve la valeur copiée dans la mémoire
Les commentaires C sont acceptés si l’on suffixe le programme « .S », car le préprocesseur est alors
également appelé avant l’assemblage.
3. les entiers :
une valeur entière décimale est notée 250, une valeur entière octale est notée 0372 (préfixée par un
zéro), 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.
4. les chaînes de caractères :
elles sont simplement entre guillemets, et peuvent contenir les caractères d’échappement du langage
C.
Exemple : "Bonjour maître\n"
5. les labels :
ce sont des mnémoniques correspondant à des adresses. Ces adresses peuvent être soit des adresses de
variables,soit des adresses de saut. Ce sont des chaînes de caractères qui commencent par une lettre,
majuscule ou minuscule, un $, un _, ou un .. Ensuite, un nombre quelconque de ces mêmes caractères
auxquels on ajoute les chiffres sont utilisés. Pour la déclaration, le label doit être suffixé par « : ».
Exemple : $LC12:
Pour y référer, on supprime le « : ».
Exemple :
message:
.asciiz
"Ceci est une chaîne de caractères...\n"
.text
__start:
la
$4, message ; adresse de la chaîne dans $4
ori
$2, $0, 4
; code du ‘print_string’ dans $2
syscall
Attention : sont illégaux les labels qui ont le même nom qu’un mnémonique de l’assembleur ou qu’un
nom de registre.
6. les immédiats :
ce sont les opérandes contenus dans l’instruction. Ce sont des constantes. Ce sont soit des entiers, soit
des labels. Ces constantes doivent respecter une taille maximum qui est fonction de l’instruction qui
l’utilise : 16 ou 26 bits.
M IPS R3000 jeu d’instructions
page - 36
Ensimag - Filières SLE/ISI
7. les registres :
le processeur M IPS possède 32 registres d’usage général. Chaque registre est connu par son numéro, qui
varie entre 0 et 31, et est préfixé par un $. Par exemple, le registre 31 sera noté $31 dans l’assembleur.
Hormis les registres $0 et $31 , tous les registres sont identiques du point de vue de la machine.
Lorsque le registre $0 est utilisé comme registre source dans une instruction, la valeur lue est toujours
0, et utiliser ce registre comme registre destination dans une instruction ne modifie pas sa valeur. Le
registre $31 est utilisé implicitement pour sauver l’adresse de retour lors des appels de fonctions.
8. les arguments :
si une instruction nécessite plusieurs arguments, comme par exemple l’addition entre deux registres,
ces arguments sont séparés par des virgules. Dans une instruction assembleur, on aura en général
comme argument en premier 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 : add $3, $2, $1
9. l’adressage mémoire :
le M IPS ne possède qu’un unique mode d’adressage : l’adressage indirect registre avec déplacement.
Ainsi l’accès à une case mémoire à partir de l’adresse présente dans un registre se note par le déplacement, c.-à-d. un entier comme défini précédemment, suivi du registre entre parenthèses.
Exemples : 11($12), 013($12) 0xB($12).
Ces trois exemples indiquent la case mémoire ayant comme adresse le contenu du registre $12 plus 11.
S’il n’y a pas d’entier devant la parenthèse ouvrante, le déplacement est nul.
En revanche, il n’est pas possible d’écrire des sauts à des adresses absolues ou relatives constantes,
comme par exemple un j 0x400000 ou un bnez $3, -12. Il faut nécessairement utiliser des labels.
M IPS R3000 jeu d’instructions
page - 37
Ensimag - Filières SLE/ISI
J)
Conventions pour les appels de fonctions
L’exécution de fonctions nécessite une pile en mémoire. Cette pile correspond à la section stack. L’utilisation
de cette pile fait l’objet de conventions qui doivent être respectées par la fonction appelée et par la fonction
appelante.
– la pile s’étend vers les adresses décroissantes ;
– le pointeur de pile pointe toujours sur la dernière case occupée dans la pile. Ceci signifie que toutes les
cases d’adresse strictement inférieure au pointeur de pile sont libres ;
– le R3000 ne possède pas d’instructions spécifiques à la gestion de la pile. On utilise les instructions lw et
sw pour y accéder.
– l’usage conventionnel des registres est le suivant :
$0
vaut zéro en lecture, non modifié par écriture
$1
réservé à l’assembleur. Ne doit pas être employé dans les programmes utilisateur
$2, $3
valeur de retour des fonctions, temporaires à sauvegarder si nécessaire avant d’appeller une fonction
$4, $5, $6, $7
4 premiers arguments des fonctions. Ils doivent être sauvegardés
par la fonction appellante si celle-ci veut les retrouver en l’état
$8, ..., $15, $24, $25 registres de travail à sauver si nécessaire avant d’appeller une
fonction
$16, ..., $23, $30
registres de travail à sauver avant d’utiliser, car la fonction appellante s’attend à les retrouver inchangés
$26, $27
registres réservés aux procédures noyau. Ils ne doivent pas être
employés dans les programmes utilisateur
$28
pointeur sur les variables globales, constante défine à l’édition de
liens
$29
pointeur de pile
$31
adresse de retour d’appel de fonction
Les appels de fonction utilisent un pointeur particulier, appelé pointeur de pile. Ce pointeur est stocké
conventionnellement dans le registre $29. On le désigne aussi par la notation $sp. La valeur de retour
d’une fonction est conventionellement présente dans le registre $2.
Par ailleurs, l’architecture du processeur M IPS R3000 impose l’utilisation du registre $31 pour stocker
l’adresse de retour lors d’un appel de fonction (instructions de type jal ou bgezal).
À 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 appelée plusieurs fois et possèdera donc plusieurs contextes d’exécution dans la pile (c’est ce qui permet l’appel de fonctions récursives).
Nous allons décrire la convention d’appel du compilateur gcc en mode optimisé, ce qui est peut-être moins
clair que l’utilisation des notions qui seront vues en compilation, mais qui sont plus naturelles lorsque l’on
écrit de l’assembleur.
Dans une fonction qui appelle d’autres fonctions, le pointeur de pile $sp pointe sur la dernière case utilisée
du contexte. Cette case est destinée à recevoir le registre $4 si la fonction voulait conserver sa valeur à
travers un appel de fonction. Juste au dessus se trouve les places pour $5, $6, $7, si la fonction qui a 4
arguments. Si les fonctions à appeller possèdent moins d’arguments, la place est réservée seulement pour les
M IPS R3000 jeu d’instructions
page - 38
Ensimag - Filières SLE/ISI
registres concernés. Si parmis les fonctions à appeller, il en existe qui possèdent plus de 4 arguments, alors
les arguments supplémentaires sont empilés au dessus, dans l’ordre identique aux 4 premiers arguments.
Au dessus de ces arguments (potentiels, car si plusieurs fonctions sont appellables, alors ce sont celles qui ont
le plus grand nombre d’arguments qui vont définir cette zone), se trouve une zone pour les variables locales
à la fonction. L’ordre des variables dans cette zone est à la discrétion du programmeur (ou du compilateur).
Finalement, encore au dessus se trouve la zone dans laquelle les registres qui doivent l’être, le dernier étant
$31. Le déplacement du pointeur de pile a lieu une seule fois, à l’entrée dans la fonction, et seulement
si nécessaire, i.e. si la fonction a besoin de beaucoup de variables locales ou appelle elle même d’autres
fonctions.
M IPS R3000 jeu d’instructions
page - 39
Téléchargement