Changes between Initial Version and Version 1 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Sep 16, 2020, 12:30:35 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Doc-MIPS-Archi-Asm-kernel

    v1 v1  
     1[[PageOutline]]
     2
     3= Architecture externe du Processeur MIPS32
     4
     5 — Version 3.0\\
     6 — Septembre 2020\\
     7 — Alain Greiner (auteur initial)
     8
     9
     10
     11
     12== A) INTRODUCTION
     13
     14
     15Ce document présente une version simplifiée de l'architecture externe du processeur MIPS32. Pour des raisons de simplicité, tous les mécanismes matériels de gestion de la mémoire virtuelle ont été délibérément supprimés.
     16
     17L'architecture externe représente ce que doit connaître un utilisateur souhaitant programmer en assembleur, ou souhaitant écrire un compilateur. Elle définit:
     18
     19 - Les registres visibles du logiciel.
     20 - L'adressage de la mémoire.
     21 - Le jeu d'instructions.
     22 - Les mécanismes de traitement des interruptions, des exceptions et appels système.
     23
     24Le processeur MIPS32 est un processeur 32 bits conçu dans les années 1980. Son jeu d'instructions est de type RISC. Il existe de nombreuses réalisations industrielles de cette architecture (SIEMENS, NEC, LSI LOGIC, SILICON GRAPHICS, MICROCHIP, etc.)
     25
     26Cette architecture est suffisamment simple pour présenter les principes de base de l'architecture des processeurs, et suffisamment puissante pour supporter un système d'exploitation multitâches tel qu'UNIX, puisqu’il supporte deux modes de fonctionnement utilisateur (''user'') et superviseur (''kernel'').
     27
     28 - Dans le mode ''user'', certaines régions de la mémoire et certains registres du processeur sont protégés et donc inaccessibles.
     29 - Dans le mode ''kernel'', toutes les ressources sont accessibles, c'est-à-dire toutes la mémoire et tous les registres.
     30
     31L'architecture interne (qui n'est pas présentée ici) dépend des choix de réalisation matérielle. Plusieurs implantations matérielles de cette architecture ont été réalisées à Sorbonne Université dans un but d'enseignement et de recherche : une version microprogrammée, simple mais peu performante (1 instruction s'exécute en 4 cycles d'horloge), une version pipeline plus performante (1 instruction par cycle) mais plus complexe, une version superscalaire, encore plus performante (2 instructions par cycle) mais beaucoup plus complexe.
     32
     33La spécification du langage d'assemblage,  des conventions d’utilisation des registres, ainsi que des conventions d’utilisation de la pile fait l'objet d'un document séparé.
     34
     35
     36
     37
     38== B) REGISTRES VISIBLES DU LOGICIEL
     39
     40
     41Tous les registres visibles du logiciel, c'est-à-dire ceux dont la valeur peut être lue ou modifiée par les instructions, sont des registres 32 bits.
     42
     43Afin de mettre en oeuvre les mécanismes de protection nécessaires pour un système d'exploitation multitâche, le processeur possède deux modes de fonctionnement : utilisateur/superviseur. Ces deux modes de fonctionnement imposent d'avoir deux catégories de registres.
     44
     45
     46
     47=== 1) Registres non protégés
     48
     49
     50Le processeur possède 35 registres manipulés par les instructions standards (c'est-à-dire les instructions qui peuvent s'exécuter aussi bien en mode ''user'' qu'en mode ''kernel'').
     51
     52 Registres GPR `$0` à `$31`::
     53   32 registres généraux (GPR : ''General Purpose Register'')\\
     54   Ces registres sont directement adressés par les instructions, et permettent de stocker des résultats de calculs intermédiaires.\\
     55   Le registre `$0` est particulier:\\
     56   — la lecture fournit la valeur constante `0x00000000` \\
     57   — l’écriture ne modifie pas son contenu.\\
     58   Le registre `$31` est utilisé par les instructions d'appel de fonctions pour sauvegarder l'adresse de retour.\\
     59   — Les instructions d'appel de fonctions sont : `bgezal`, `bltzal`, `jal`et `jalr`
     60
     61 Registre `PC`::
     62   Registre compteur de programme (''Program Counter'').\\
     63   Ce registre contient l'adresse de l'instruction en cours d'exécution. Sa valeur est modifiée
     64   par toutes les instructions.
     65
     66 Registres `HI` et `LO`::
     67   Registres pour la multiplication entière ou la division Euclidienne.\\
     68   Ces deux registres 32 bits sont utilisés pour stocker le résultat d'une multiplication
     69   ou d'une division.\\
     70   La multiplication de deux nombre de 32 bits est un mot de 64 bits.\\
     71   La division Euclidienne de deux nombres 32 bits produit un quotient sur 32 bits
     72   et un reste sur 32 bits
     73
     74
     75
     76=== 2) Registres protégés
     77
     78
     79L'architecture du MIPS32 définit 32 registres protégés (numérotés de 0 à 31). Ces registres protégés ne sont accessibles, en lecture comme en écriture, que par les instructions privilégiées `mtc0` et `mfc0` ne pouvant être exécutées qu'en mode ''kernel''. `mtc0` et `mfc0` signifient respectivement ''Move-To-Coprocessor-0'' et ''Move-From-Coprocessor-0''. Ces registres appartiennent au "coprocesseur système" (appélé aussi `c0` pour ''Coprocessor 0''). En pratique, cette version du processeur MIPS32 en définit 6. Ils sont utilisés par le système d’exploitation pour la gestion des interruptions, des exceptions et des appels système  (voir chapitre E).
     80
     81 Registre `c0_sr`::
     82   Le registre `sr` de `c0` est le registre d'état (''Status Register'').
     83   Il contient en particulier le bit qui définit le mode : ''user'' ou ''kernel'',
     84   ainsi que les bits de masquage des interruptions.\\
     85   Ce registre a le numéro `$12`.
     86
     87 Registre `c0_cause`::
     88   Le registre `cause` de `c0` est le registre de cause (''Cause Register'').
     89   En cas d'interruption, d'exception ou d'appel système, le code en cours d'exécution
     90   par le processeur est dérouté vers le noyau du système d'exploitation.
     91   Le  contenu de `c0_cause` définit la cause d'appel du noyau.\\
     92   Ce registre a  le numéro `$13`.
     93
     94 Registre `c0_epc`::
     95   Le registre `epc` de `c0 est le registre d'exception (''Exception Program Counter'').
     96   Il contient soit l'adresse de retour (PC + 4) en cas d'interruption, soit l'adresse de l'instruction courante
     97   (`pc`) en cas d'exception ou d'appel système.\\
     98   Ce registre a le numéro `$14`.
     99
     100 Registre `c0_bar`::
     101   Le registre `bar` de `c0` est legistre d'adresse illégale (''Bad Address Register'').
     102   En cas d'exception de type "adresse illégale", il contient la valeur de l'adresse mal formée.\\     
     103   Ce registre a le numéro `$8`.
     104 
     105 Registre `c0_procid`::
     106   Le registre `procid` est le registre en lecture seulement contenant le numéro du processeur.
     107   Cet index « cablé » est utilisé par le noyau du système d’exploitation
     108   pour gérer des architectures multiprocesseurs.\\
     109   Ce registre possède le numéro `$15`.
     110
     111 Registre `c0_count`::
     112   Le registre `count` de `c0` est le registre en lecture seulement contenant
     113   le nombre de cycles exécutés depuis l’initialisation du processeur. \\
     114   Ce registre possède le numéro `$16`.
     115
     116
     117
     118
     119== C) ADRESSAGE MÉMOIRE
     120
     121
     122=== 1) Espace d'adressage : adressage par octet
     123
     124
     125L'ensemble des adresses que peut former le processeur définit son espace d'adressage. Toutes les adresses formées sont des adresses d'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.
     126
     127Les 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. Pour les transferts de mots et de demi-mots, le processeur respecte la convention "little endian".
     128
     129L'adresse d'un mot de donnée ou d'une instruction doit être multiple de 4. L'adresse d'un demi-mot doit être multiple de 2. (on dit que les adresses doivent être "alignées"). Le processeur part en exception si une instruction calcule une adresse qui ne respecte pas cette contrainte.
     130
     131
     132
     133=== 2) Calcul d'adresse
     134
     135
     136Il existe un seul mode d’adressage, consistant à effectuer la somme entre le contenu d'un registre général Ri, défini dans l'instruction, et d'un déplacement qui est une valeur immédiate signée, sur 16 bits, contenue également dans l'instruction:
     137
     138{{{
     139adresse = Ri + Déplacement
     140}}}
     141
     142
     143=== 3) Mémoire virtuelle
     144
     145
     146Pour des raisons de simplicité, cette version du processeur MIPS32 ne possède pas de mémoire virtuelle, c'est à dire que le processeur ne contient aucun mécanisme matériel de traduction des adresses virtuelles en adresses physiques. Les adresses calculées par le logiciel sont donc transmises au système mémoire sans modifications.
     147
     148On suppose que la mémoire répond en un cycle. Un signal permet au système mémoire de "geler" le processeur s'il n'est pas capable de répondre en un cycle (ce mécanisme peut être utilisé pour gérer les MISS du ou des caches).
     149
     150
     151
     152=== 4) Protection mémoire
     153
     154
     155En l’absence de mémoire virtuelle, l’espace mémoire est simplement découpé en 2 segments identifiés par le bit de poids fort de l’adresse :
     156
     157{{{
     158adr 31 = 0      ==>     segment utilisateur
     159adr 31 = 1      ==>     segment système
     160}}}
     161
     162Quand le processeur est en mode superviseur, les 2 segments sont accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en exception si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment système alors que le processeur est en mode utilisateur.
     163
     164Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, le système mémoire peut le signaler au moyen d'un signal d'erreur, qui déclenche un départ en exception.
     165
     166
     167
     168
     169== D) JEU D'INSTRUCTIONS
     170
     171
     172=== 1) Généralités
     173
     174
     175Le processeur possède 57 instructions qui se répartissent en 4 classes :
     176
     177- 33    instructions arithmétiques/logiques entre registres
     178- 12    instructions de branchement
     179- 7     instructions de lecture/écriture mémoire
     180- 5     instructions système
     181
     182Toutes les instructions ont une longueur de 32 bits et possèdent un des trois formats suivants :
     183
     184 - 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.
     185
     186{{{#!html
     187<table border="1" cellspacing="0" cellpadding="0"align=center>
     188<tr>
     189<td style="width:70px"; align=center> OPCOD</td>
     190<td style="width:58px"; align=center> RS</td>
     191<td style="width:58px"; align=center> RT</td>
     192<td style="width:58px"; align=center> RD</td>
     193<td style="width:58px"; align=center> SH</td>
     194<td style="width:70px"; align=center> FUNC</td>
     195</tr>
     196</table>
     197<table border="0" cellspacing="0" cellpadding="0"align=center>
     198<tr>
     199<td style="width:72px"; align=left> 31</td>
     200<td style="width:60px"; align=left> 25</td>
     201<td style="width:60px"; align=left> 20</td>
     202<td style="width:60px"; align=left> 15</td>
     203<td style="width:60px"; align=left> 10</td>
     204<td style="width:60px"; align=left> 5</td>
     205<td style="width:12px"; align=right> 0</td>
     206</tr>
     207</table>
     208}}}
     209
     210 - 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 courte distance (conditionnels).
     211
     212{{{#!html
     213<table border="1" cellspacing="0" cellpadding="0"align=center>
     214<tr>
     215<td style="width:70px"; align=center> OPCOD</td>
     216<td style="width:58px"; align=center> RS</td>
     217<td style="width:58px"; align=center> RT</td>
     218<td style="width:190px"; align=center> IMD16</td>
     219</tr>
     220</table>
     221<table border="0" cellspacing="0" cellpadding="0"align=center>
     222<tr>
     223<td style="width:72px"; align=left> 31</td>
     224<td style="width:60px"; align=left> 25</td>
     225<td style="width:60px"; align=left> 20</td>
     226<td style="width:96px"; align=left> 15</td>
     227<td style="width:96px"; align=right> 0</td>
     228</tr>
     229</table>
     230}}}
     231
     232 - Le format J n’est utilisé que pour les branchements inconditionnels lointains
     233
     234{{{#!html
     235<table border="1" cellspacing="0" cellpadding="0" align=center>
     236<tr>
     237<td style="width:70px"; align=center> OPCOD</td>
     238<td style="width:310px"; align=center> IMD26</td>
     239</tr>
     240</table>
     241<table border="0" cellspacing="0" cellpadding="0"align=center>
     242<tr>
     243<td style="width:72px"; align=left> 31</td>
     244<td style="width:156px"; align=left> 25</td>
     245<td style="width:156px"; align=right> 0</td>
     246</tr>
     247</table>
     248}}}
     249
     250
     251
     252=== 2) Codage des instructions
     253
     254
     255- Le codage des instructions est principalement défini par les 6 bits du champ code opération (appelé OPCOD) de l'instruction (INS 31:26). Cependant, trois valeurs particulières de ce champ définissent en fait une famille d'instructions : il faut alors analyser d'autres bits de l'instruction pour décoder l'instruction. Ces codes particuliers sont : SPECIAL (valeur "000000"), BCOND (valeur "000001") et COPRO (valeur "010000")
     256
     257{{{#!html
     258<div align=center><b>INS 28:26</div>
     259<table border="1" cellspacing="0" cellpadding="0" align=center>
     260<th>
     261<b>INS 31:29
     262<td align=center style="width:60px"; > <b>000</td>
     263<td align=center style="width:60px"; > <b>001</td>
     264<td align=center style="width:60px"; > <b>010</td>
     265<td align=center style="width:60px"; > <b>011</td>
     266<td align=center style="width:60px"; > <b>100</td>
     267<td align=center style="width:60px"; > <b>101</td>
     268<td align=center style="width:60px"; > <b>110</td>
     269<td align=center style="width:60px"; > <b>111</td>
     270</th>
     271<tr>
     272<td align=center style="width:90px"><b>000</td>
     273<td align=center> SPECIAL</td>
     274<td align=center> BCOND</td>
     275<td align=center> J</td>
     276<td align=center> JAL</td>
     277<td align=center> BEA</td>
     278<td align=center> BNE</td>
     279<td align=center> BLEZ</td>
     280<td align=center> BGTZ</td>
     281</tr>
     282<tr>
     283<td align=center style="width:90px"><b>001</td>
     284<td align=center> ADDI</td>
     285<td align=center> ADDIU</td>
     286<td align=center> SLTI</td>
     287<td align=center> SLTIU</td>
     288<td align=center> ANDI</td>
     289<td align=center> ORI</td>
     290<td align=center> XORI</td>
     291<td align=center> LUI</td>
     292</tr>
     293<tr>
     294<td align=center style="width:90px"><b>010</td>
     295<td align=center> COPRO</td>
     296<td align=center> </td>
     297<td align=center> </td>
     298<td align=center> </td>
     299<td align=center> </td>
     300<td align=center> </td>
     301<td align=center> </td>
     302<td align=center> </td>
     303</tr>
     304<tr>
     305<td align=center style="width:90px"><b>011</td>
     306<td align=center> </td>
     307<td align=center> </td>
     308<td align=center> </td>
     309<td align=center> </td>
     310<td align=center> </td>
     311<td align=center> </td>
     312<td align=center> </td>
     313<td align=center> </td>
     314</tr>
     315<tr>
     316<td align=center style="width:90px"><b>100</td>
     317<td align=center> LB</td>
     318<td align=center> LH</td>
     319<td align=center> </td>
     320<td align=center> LW</td>
     321<td align=center> LBU</td>
     322<td align=center> LHU</td>
     323<td align=center> </td>
     324<td align=center> </td>
     325</tr>
     326<tr>
     327<td align=center style="width:90px"><b>101</td>
     328<td align=center> SB</td>
     329<td align=center> SH</td>
     330<td align=center> </td>
     331<td align=center> SW</td>
     332<td align=center> </td>
     333<td align=center> </td>
     334<td align=center> </td>
     335<td align=center> </td>
     336</tr>
     337<tr>
     338<td align=center style="width:90px"><b>110</td>
     339<td align=center> </td>
     340<td align=center> </td>
     341<td align=center> </td>
     342<td align=center> </td>
     343<td align=center> </td>
     344<td align=center> </td>
     345<td align=center> </td>
     346<td align=center> </td>
     347</tr>
     348<tr>
     349<td align=center style="width:90px"><b>111</td>
     350<td align=center> </td>
     351<td align=center> </td>
     352<td align=center> </td>
     353<td align=center> </td>
     354<td align=center> </td>
     355<td align=center> </td>
     356<td align=center> </td>
     357<td align=center> </td>
     358</tr></table>
     359<div align=center><br>
     360Par exemple, ce tableau indique que l'instruction LHU a un OPCOD à "100101".
     361<br><br></div>
     362}}}
     363
     364- 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)
     365
     366{{{#!html
     367<div align=center><b>INS 2:0</div>
     368<table border="1" cellspacing="0" cellpadding="0" align=center>
     369<th>
     370<b>INS 5:3
     371<td align=center style="width:60px"; > <b>000</td>
     372<td align=center style="width:60px"; > <b>001</td>
     373<td align=center style="width:60px"; > <b>010</td>
     374<td align=center style="width:60px"; > <b>011</td>
     375<td align=center style="width:60px"; > <b>100</td>
     376<td align=center style="width:60px"; > <b>101</td>
     377<td align=center style="width:60px"; > <b>110</td>
     378<td align=center style="width:60px"; > <b>111</td>
     379</th>
     380<tr>
     381<td align=center style="width:90px"><b>000</td>
     382<td align=center> SLL</td>
     383<td align=center> </td>
     384<td align=center> SRL</td>
     385<td align=center> SRA</td>
     386<td align=center> SLLV</td>
     387<td align=center> </td>
     388<td align=center> SRLV</td>
     389<td align=center> SRAV</td>
     390</tr>
     391<tr>
     392<td align=center style="width:90px"><b>001</td>
     393<td align=center> JR</td>
     394<td align=center> JALR</td>
     395<td align=center> </td>
     396<td align=center> </td>
     397<td align=center> SYSCALL</td>
     398<td align=center> BREAK</td>
     399<td align=center> </td>
     400<td align=center> </td>
     401</tr>
     402<tr>
     403<td align=center style="width:90px"><b>010</td>
     404<td align=center> MFHI</td>
     405<td align=center> MTHI</td>
     406<td align=center> MFLO</td>
     407<td align=center> MTLO</td>
     408<td align=center> </td>
     409<td align=center> </td>
     410<td align=center> </td>
     411<td align=center> </td>
     412</tr>
     413<tr>
     414<td align=center style="width:90px"><b>011</td>
     415<td align=center> MULT</td>
     416<td align=center> MULTU</td>
     417<td align=center> DIV</td>
     418<td align=center> DIVU</td>
     419<td align=center> </td>
     420<td align=center> </td>
     421<td align=center> </td>
     422<td align=center> </td>
     423</tr>
     424<tr>
     425<td align=center style="width:90px"><b>100</td>
     426<td align=center> ADD</td>
     427<td align=center> ADDU</td>
     428<td align=center> SUB</td>
     429<td align=center> SUBU</td>
     430<td align=center> AND</td>
     431<td align=center> OR</td>
     432<td align=center> XOR</td>
     433<td align=center> NOR</td>
     434</tr>
     435<tr>
     436<td align=center style="width:90px"><b>101</td>
     437<td align=center> </td>
     438<td align=center> </td>
     439<td align=center> STL</td>
     440<td align=center> SLTU</td>
     441<td align=center> </td>
     442<td align=center> </td>
     443<td align=center> </td>
     444<td align=center> </td>
     445</tr>
     446<tr>
     447<td align=center style="width:90px"><b>110</td>
     448<td align=center> </td>
     449<td align=center> </td>
     450<td align=center> </td>
     451<td align=center> </td>
     452<td align=center> </td>
     453<td align=center> </td>
     454<td align=center> </td>
     455<td align=center> </td>
     456</tr>
     457<tr>
     458<td align=center style="width:90px"><b>111</td>
     459<td align=center> </td>
     460<td align=center> </td>
     461<td align=center> </td>
     462<td align=center> </td>
     463<td align=center> </td>
     464<td align=center> </td>
     465<td align=center> </td>
     466<td align=center> </td>
     467</tr></table>
     468<div align=center><br>
     469Par exemple, l'instruction MTLO a un OPCOD à "000000" et le champ FUNC est à "010011".
     470<br><br></div>
     471}}}
     472
     473- Lorsque le code opération a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction.
     474
     475{{{#!html
     476<div align=center><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INS 16</div>
     477<table border="1" cellspacing="0" cellpadding="0" align=center>
     478<th>
     479<b>INS 20
     480<td align=center style="width:60px"; > <b>0</td>
     481<td align=center style="width:60px"; > <b>1</td>
     482</th>
     483<tr>
     484<td align=center style="width:90px"><b>0</td>
     485<td align=center> BLTZ</td>
     486<td align=center> BGEZ</td>
     487</tr>
     488<tr>
     489<tr>
     490<td align=center style="width:90px"><b>1</td>
     491<td align=center> BLTZAL</td>
     492<td align=center> BGEZAL</td>
     493</tr>
     494<tr></table>
     495<div align=center><br>
     496Par exemple, l'instruction BTLZAL a un OPCOD à "000001",<br>le bit IN20 est à "1" et le bit INS16 est à "0".
     497<br><br></div>
     498}}}
     499
     500
     501- Lorsque 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. Remarquez que ERET à deux codages.
     502
     503{{{#!html
     504<div align=center><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INS 16</div>
     505<table border="1" cellspacing="0" cellpadding="0" align=center>
     506<th>
     507<b>INS 20
     508<td align=center style="width:60px"; > <b>0</td>
     509<td align=center style="width:60px"; > <b>1</td>
     510</th>
     511<tr>
     512<td align=center style="width:90px"><b>0</td>
     513<td align=center> MFC0</td>
     514<td align=center> MTC0</td>
     515</tr>
     516<tr>
     517<tr>
     518<td align=center style="width:90px"><b>1</td>
     519<td align=center> ERET</td>
     520<td align=center> ERET</td>
     521</tr>
     522<tr></table>
     523<div align=center><br>
     524Par exemple, l'instruction MTC0 a un OPCOD à "010000",<br>le bit IN20 est à "0" et le bit INS16 est à "0".
     525<br><br></div>
     526}}}
     527
     528
     529
     530=== 3) Jeu d'instructions
     531
     532
     533Le 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 effectuent un simple transfert entre un registre général et la mémoire, sans aucun traitement arithmétique ou logique.
     534
     535La plupart des instructions arithmétiques et logiques se présentent sous les 2 formes registre-registre et registre-immédiat:
     536
     537 || instruction assembleur  || ||comportement dans le processeur || || format d'instruction ||
     538 ||**add rd, rs, rt**       || || R(rd) <--- R(rs) op R(rt)      || || ''format R''         ||
     539 ||**addi rd, rs, imm**     || || R(rd) <--- R(rs) op IMD16      || || ''format I''         ||
     540 
     541L’opérande immédiat 16 bits est signé pour les opérations arithmétiques et non signé pour les opérations logiques.
     542
     543Le 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 $31. Ces instructions sont utilisées pour les appels de sous-programme.
     544
     545Toutes 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 ordinal et un déplacement signé.
     546
     547Les 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 ERET qui permet de restaurer l'état antérieur du registre d'état avant de sortir du gestionnaire d'exceptions.
     548
     549
     550
     551
     552== E) EXCEPTIONS / INTERRUPTIONS / APPELS SYSTÈME
     553
     554
     555Il existe quatre types d'évènements qui peuvent interrompre l'exécution "normale" d'un programme:
     556 - les exceptions
     557 - les interruptions 
     558 - les appels système (instructions SYSCALL et BREAK)
     559 - le signal RESET
     560Dans tous ces cas, le principe général consiste à passer la main à une procédure logicielle spécialisée (appelée Gestionnaire d’Interrutions, Exceptions et Trappes) qui s'exécute en mode superviseur, à qui il faut transmettre les informations minimales lui permettant de traiter le problème.
     561
     562
     563
     564=== 1) Exceptions
     565
     566
     567Les exceptions sont des évènements "anormaux", le plus souvent liés à une erreur de programmation, qui empêche 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 MIPS32 :
     568
     569 ADEL:: Adresse illégale en lecture : adresse non alignée ou se trouvant dans le segment système alors que le processeur est en mode utilisateur.
     570 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.
     571 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.
     572 IBE::  Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l'occasion d'une lecture instruction.       
     573 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.
     574 RI::   OPCOD illégal : l'OPCOD ne correspond à aucune instruction connue (il s'agit probablement d'un branchement dans une zone mémoire ne contenant pas du code exécutable.
     575 CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (MTC0, MFC0, ERET) alors que le processeur est en mode utilisateur.
     576
     577Le processeur doit alors passer en mode superviseur, et se brancher au  Gestionnaire d'Interruptions, Exceptions et Trappes (GIET), implanté conventionnellement à l'adresse "0x80000180". Après avoir identifié que la cause est une exception (en examinant le contenu du registre CR), le GIET se branche alors au gestionnaire d’exception. Toutes les exceptions étant fatales il n'est pas nécessaire de sauvegarder 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. Lorsqu’il détecte une exception, le matériel doit donc:
     578
     579 - sauvegarder PC (l'adresse de l'instruction fautive) dans le registre EPC
     580 - passer en mode superviseur et masque les interruptions dans SR
     581 - sauvegarder éventuellement l’adresse fautive dans BAR       
     582 - écrire le type de l'exception dans le registre CR
     583 - brancher à l'adresse "0x80000180".
     584
     585=== 2) Interruptions
     586
     587
     588Les 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 lignes est une requête d'interruption. Elles sont écrites dans le registre 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.
     589
     590Le processeur doit alors passer alors en mode superviseur et se brancher au GIET. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre CR), le GIET se branche au gestionnaire d’interruption, qui doit appeler la routine d’interruption (ISR) appropriée. 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’il reçoit une requête d’interruption non masquée, le matériel  doit donc :
     591
     592 - sauvegarder PC+4 (l'adresse de retour) dans le registre EPC
     593 - passer en mode superviseur et masque les interruptions dans SR       
     594 - écrire qu'il s'agit d'une interruption dans le registre CR
     595 - brancher à l'adresse "0x80000180".
     596
     597En plus des 6 lignes d'interruption matérielles, le processeur MIPS32 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 traitement que les requêtes d'interruptions externes, s'ils ne sont pas masqués.
     598
     599
     600
     601=== 3) Appels système: instructions SYSCALL et BREAK
     602
     603
     604L'instruction SYSCALL permet à une tâche (utilisateur ou système) de demander un service au système d'exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et un éventuel paramètre doivent avoir été préalablement rangés dans des registres généraux. L'instruction BREAK est utilisée plus spécifiquement pour poser un point d'arrêt (dans un but de déverminage du logiciel): on remplace brutalement une instruction du programme à déverminer par l'instruction BREAK. Dans les deux cas, le processeur passe en mode superviseur et se branche ici encore au GIET. Après avoir identifié que la cause est un appel système (en examinant le contenu du registre CR), le GIET se branche au gestionnaire d’appels système. Lorsqu’il rencontre une des deux instructions SYSCALL ou BREAK, le matériel effectue les opérations suivantes :
     605
     606 - sauvegarder PC (l'adresse de l'instruction) dans le registre EPC (l’adresse de retour est PC + 4)
     607 - passer en mode superviseur et masquage des interruptions dans SR
     608 - écrire  la cause du déroutement dans le registre CR
     609 - brancher à l'adresse "0x80000180".
     610
     611
     612
     613=== 4) Signal RESET
     614
     615
     616Le processeur possède également une entrée RESET dont l'activation, pendant au moins un cycle, entraîne le branchement inconditionnel au logiciel bootloader. Ce logiciel, implanté conventionnellement à l’adresse 0xBFC00000 doit principalement charger le code du système d’exploitation dans la mémoire et initialiser les périphériques. Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes :
     617
     618 - elle n'est pas masquable.
     619 - il n'est pas nécessaire de sauvegarder une adresse de retour.
     620 - le gestionnaire de reset est implanté à l'adresse "0xBFC00000".
     621
     622Dans ce cas, le processeur doit :
     623
     624 - passer en mode superviseur et masque les interruptions dans SR       
     625 - brancher à l'adresse "0xBFC00000"
     626
     627
     628
     629=== 5) Sortie du GIET ou du bootloader
     630
     631
     632Avant de reprendre l'exécution d'un programme qui a effectué un appel système (instructions SYSCALL ou BREAK) ou qui a été interrompu par une interruption, ou pour sortir du bootloader, il est nécessaire d'exécuter l'instruction ERET.
     633Cette instruction modifie le contenu du registre SR, et effectue un branchement à l’adresse  contenue dans le registre EPC.
     634
     635
     636
     637=== 6) Gestion du registre d'état SR
     638
     639
     640Le registre SR contient le mode d'exécution du processeur. Cela concerne son comportement vis-à-vis des signauc d'interruptions, c'est-à-dire les masques, et s'il est en mode ''kernel'' ou en mode ''user''
     641- La figure suivante présente le contenu des 16 bits de poids faible du registre SR. Cette version du MIP32 n’utilise que 12 bits:
     642{{{#!html
     643<br><br>
     644<table border="1" cellspacing="0" cellpadding="0">
     645<tr>
     646<td style="width:238px"; align=center> IM[7:0]</td>
     647<td style="width:30px"; align=center> 0</td>
     648<td style="width:30px"; align=center> 0</td>
     649<td style="width:30px"; align=center> 0</td>
     650<td style="width:30px"; align=center> UM</td>
     651<td style="width:30px"; align=center> 0</td>
     652<td style="width:30px"; align=center> ERL</td>
     653<td style="width:30px"; align=center> EXL</td>
     654<td style="width:30px"; align=center> IE</td>
     655</tr>
     656</table>
     657<table border="0" cellspacing="0" cellpadding="0">
     658<tr>
     659<td style="width:120px"; align=left>  &nbsp;15</td>
     660<td style="width:120px"; align=right> 8&nbsp;&nbsp;</td>
     661<td style="width:32px"; align=center> 7</td>
     662<td style="width:32px"; align=center> 6</td>
     663<td style="width:32px"; align=center> 5</td>
     664<td style="width:32px"; align=center> 4</td>
     665<td style="width:32px"; align=center> 3</td>
     666<td style="width:32px"; align=center> 2</td>
     667<td style="width:32px"; align=center> 1</td>
     668<td style="width:32px"; align=center> 0</td>
     669</tr>
     670</table>
     671}}}
     672
     673 ||**IE        **||Interrupt Enable  ||
     674 ||**EXL       **||Exception Level   ||
     675 ||**ERL       **||Reset Level       ||
     676 ||**UM        **||User Mode         ||
     677 ||**IM![7:0]  **||Masques individuels pour les six lignes d’interruption matérielles (bits IM![7:2])\\et pour les 2 interruptions logicielles (bits IM![1:0])
     678
     679 - Le processeur a le droit d’accéder aux ressources protégées (registres du CP0,
     680   et adresses mémoires > 0x7FFFFFFF) si et seulement si le bit UM vaut 0,
     681   ou si l’un des deux bits ERL et EXL vaut 1.
     682 - Les  interruptions sont autorisées si et seulement si le bit IE vaut 1,
     683   et si les deux bits ERL et EXL valent 00, et si le bit correspondant de IM vaut 1.
     684 - Les trois types d’évènements qui déclenchent le branchement au GIET
     685   (interruptions, exceptions et appels système) forcent le bit EXL à 1,
     686   ce qui masque les interruptions et autorise l’accès aux ressources protégées.
     687 - L’activation du signal RESET qui force le branchement au Boot-Loader force le bit ERL à 1,
     688   ce qui masque les interruptions et autorise l’accès aux ressources protégées.
     689 - L’instruction ERET force le bit EXL  à  0.
     690
     691Lors de l’activation du RESET :
     692
     693 - SR contient donc la valeur 0x0004.
     694 - Pour exécuter un programme utilisateur en mode protégé, avec interruptions activées,
     695   il doit contenir la valeur 0xFF11.
     696 - Le code de boot doit écrire la valeur 0xFF13 dans SR et l’adresse du programme utilisateur
     697   dans EPC avant d’appeler l’instruction ERET.
     698
     699
     700
     701=== 7) Gestion du registre de cause CR
     702
     703
     704Le registre CR contient trois champs. Les 4 bits du champ XCODE(3:0) définissent la cause de l'appel au GIET. Les 6 bits du champ IRQ(5:0) représentent l'état des lignes d'interruption externes au moment de l'appel au GIET. Les 2 bits SWI(1:0) représentent les requêtes d'interruption logicielle.
     705
     706- La figure suivante montre le format du registre de cause CR :
     707{{{#!html
     708<br><br>
     709<table border="1" cellspacing="0" cellpadding="0">
     710<tr>
     711<td style="width:238px"; align=center> IM[7:0]</td>
     712<td style="width:30px"; align=center> 0</td>
     713<td style="width:30px"; align=center> 0</td>
     714<td style="width:30px"; align=center> 0</td>
     715<td style="width:30px"; align=center> UM</td>
     716<td style="width:30px"; align=center> 0</td>
     717<td style="width:30px"; align=center> ERL</td>
     718<td style="width:30px"; align=center> EXL</td>
     719<td style="width:30px"; align=center> IE</td>
     720</tr>
     721</table>
     722<table border="0" cellspacing="0" cellpadding="0">
     723<tr>
     724<td style="width:120px"; align=left>  &nbsp;15</td>
     725<td style="width:120px"; align=right> 8&nbsp;&nbsp;</td>
     726<td style="width:32px"; align=center> 7</td>
     727<td style="width:32px"; align=center> 6</td>
     728<td style="width:32px"; align=center> 5</td>
     729<td style="width:32px"; align=center> 4</td>
     730<td style="width:32px"; align=center> 3</td>
     731<td style="width:32px"; align=center> 2</td>
     732<td style="width:32px"; align=center> 1</td>
     733<td style="width:32px"; align=center> 0</td>
     734</tr>
     735</table>
     736}}}
     737
     738 - Les valeurs possibles du champ XCODE sont les suivantes :
     739
     740 ||0000||** INT  **||Interruption
     741 ||0001||**      **||Inutilisé
     742 ||0010||**      **||Inutilisé
     743 ||0011||**      **||Inutilisé
     744 ||0100||** ADEL **||Adresse illégale en lecture
     745 ||0101||** ADES **||Adresse illégale en écriture
     746 ||0110||** IBE  **||Bus erreur sur accès instruction
     747 ||0111||** DBE  **||Bus erreur sur accès donnée
     748 ||1000||** SYS  **||Appel système (SYSCALL)
     749 ||1001||** BP   **||Point d'arrêt (BREAK)
     750 ||1010||** RI   **||   OPCOD illégal
     751 ||1011||** CPU  **||   Coprocesseur inaccessible
     752 ||1100||** OVF  **||   Overflow arithmétique
     753 ||1101||**      **||   Inutilisé
     754 ||1110||**      **||   Inutilisé
     755 ||1111||**      **||   Inutilisé
     756