Changes between Version 41 and Version 42 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 13, 2020, 11:37:31 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

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

    v41 v42  
    6868 Comportement des instructions `mtc0`et `mfc0`::
    6969
    70  || instruction assembleur  || ||comportement dans le processeur       || || Remarques ||
    71  ||**`mtc0 $gpr, $c0`**   || || Copro. 0 (`$c0`) ← GPR (`$gpr`)  || || `$c0 ` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr` = `$0` ... `$31`      ||
    72  ||**`mfc0 $gpr, $c0`**       || || GPR (`$gpr`) ← Copro. 0 (`$c0`)  || || `$c0` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr ` = `$0` ... `$31`          ||
     70 || **instruction assembleur**  || **comportement dans le processeur**      || **Remarques** ||
     71 ||**`mtc0 $gpr, $c0`**   || Copro. 0 (`$c0`) ← GPR (`$gpr`) || `$c0 ` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr` = `$0` ... `$31`      ||
     72 ||**`mfc0 $gpr, $c0`**       || GPR (`$gpr`) ← Copro. 0 (`$c0`) || `$c0` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr ` = `$0` ... `$31`          ||
    7373 
    7474
     
    7878
    7979
    80 L’espace d'adressage de la mémoire est découpé en 2 parties identifiés par le bit de poids fort de l’adresse (bit n°31) :
     80L’espace d'adressage de la mémoire est découpé en 2 parties identifiés par le bit de poids fort de l’adresse (bit n°31). Quand le processeur est en mode ''kernel'' alors les 2 parties (protégée et non protégée) sont accessibles. Quand le processeur est en mode ''user'' alors seule la partie protégée est accessible.
    8181
    8282{{{
    83 bit n°31 de l'adresse = 0 : partie non protégée, mode user pour l'utilisateur
    84 bit n°31 de l'adresse = 1 : partie protégée mode kernel : réservée au noyau du système d'exploitation
    85 }}}
    86 
    87 Quand le processeur est en mode ''kernel'' alors les 2 parties (utilisateur et système) sont accessibles. Quand le processeur est en mode ''user'' alors seule la partie utilisateur est accessible.
    88 
    89 Quand le processeur est en mode utilisateur, si une instruction essaie d'accéder à la mémoire avec une adresse de la partie système alors le processeur part en exception, c'est-à-dire que le programme est dérouté vers le noyau du système d'exploitation (voir section E)
    90 
    91 Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, alors le système mémoire le signale ce qui déclenche également un départ en exception.
    92 
    93 
    94 
    95 
    96 == D) JEU D'INSTRUCTIONS
    97 
    98 
    99 === 1) Généralités et format des instructions
    100 
    101 
    102 Le processeur possède 57 instructions qui se répartissent en 4 classes :
    103 
    104 - 33    instructions arithmétiques/logiques entre registres
    105 - 12    instructions de branchement
    106 - 7     instructions de lecture/écriture mémoire
    107 - 5     instructions système
    108 
    109 Toutes les instructions ont une longueur de 32 bits et possèdent l'un des trois formats suivants R, I ou J:
    110 
    111  Format R::
    112    Le format R est utilisé par les instructions ayant 2 registres sources (désignés par RS et RT) et un registre résultat désigné par RD.\\
    113    La forme générale est `OPCOD RD, RS, RT` dont le comportement est `RD <- RS OPCOD RT`.\\
    114    Par exemple `sub $4,$8,$16` réalise `$4 <- $8 - $16`.\\
    115    Codage:
    116 
     83bit n°31 de l'adresse = 0       partie non protégée utilisable dans tous les modes du processeur
     84                                destinée au programme de l'utilisateur
     85bit n°31 de l'adresse = 1       partie protégée utilisable seulement en mode kernel
     86                                réservée au noyau du système d'exploitation
     87}}}
     88
     89Quand le processeur est en mode utilisateur, si une instruction essaie d'accéder à la mémoire avec une adresse de la partie système alors le processeur part en exception, c'est-à-dire que le programme fautif est dérouté vers le noyau du système d'exploitation.
     90
     91
     92
     93=  4. Instructions protégées
     94
     95
     96
     97La version du MIPS32 que nous utilisons possède une cinquantaine d'instructions, il y a les instructions standards utilisables quel que soit le mode d'exécution du processeur et il y a les instructions protégées (ou privilégiées) qui ne sont utilisables qu'en mode ''kernel''. Les instructions standards sont présentées dans le document sur [htdocs:cours/doc_MIPS32.pdf l'architecture et l'assembleur en mode user]. Elles contiennent les instructions arithmétiques/logiques entre registres, les instructions de branchement, les instructions de lecture et écriture mémoire et l'instruction `syscall`. Cette section décrit les instructions protégées.
     98
     99 Les instructions protégées utilise le format R:: \\
    117100{{{#!html
    118101<table border="1" cellspacing="0" cellpadding="0"align=center>
     
    139122}}}
    140123
    141  Format I::
    142    Le format I est utilisé (i) par les instructions de lecture/écriture mémoire, (ii) par les instructions utilisant un opérande immédiat, (iii) ainsi que par les branchements courte distance (conditionnels).\\
    143    La forme générale est `OPCOD RT, RS, IMD16` dont le comportement est `RT <- RS OPCOD IMM16`.\\
    144    Par exemple `addi $4,$8,-42` réalise `$4 <- $8 - 42` ou `lb $4,42($8)` réalise `$4 <- MEM[$8 + 42]`\\
    145    Codage:
    146 
    147 {{{#!html
    148 <table border="1" cellspacing="0" cellpadding="0"align=center>
    149 <tr>
    150 <td style="width:70px"; align=center> OPCOD</td>
    151 <td style="width:58px"; align=center> RS</td>
    152 <td style="width:58px"; align=center> RT</td>
    153 <td style="width:190px"; align=center> IMD16</td>
    154 </tr>
    155 </table>
    156 <table border="0" cellspacing="0" cellpadding="0"align=center>
    157 <tr>
    158 <td style="width:72px"; align=left> 31</td>
    159 <td style="width:60px"; align=left> 25</td>
    160 <td style="width:60px"; align=left> 20</td>
    161 <td style="width:96px"; align=left> 15</td>
    162 <td style="width:96px"; align=right> 0</td>
    163 </tr>
    164 </table>
    165 }}}
    166 
    167  Format J::
    168    Le format J n’est utilisé que pour les branchements inconditionnels longue distance
    169    La forme générale est `OPCOD IMD26` dont le comportement est `PC <- PC+IMD26`.\\
    170    Par exemple `j 0x40` réalise `PC <- PC + 0x40` (notez que l'argument de l'instruction est presque toujours une étiquette du programme et que c'est le programme d'assemblage qui calcule la valeur IMD26).\\
    171    Codage:
    172 
    173 {{{#!html
    174 <table border="1" cellspacing="0" cellpadding="0" align=center>
    175 <tr>
    176 <td style="width:70px"; align=center> OPCOD</td>
    177 <td style="width:310px"; align=center> IMD26</td>
    178 </tr>
    179 </table>
    180 <table border="0" cellspacing="0" cellpadding="0"align=center>
    181 <tr>
    182 <td style="width:72px"; align=left> 31</td>
    183 <td style="width:156px"; align=left> 25</td>
    184 <td style="width:156px"; align=right> 0</td>
    185 </tr>
    186 </table>
    187 }}}
    188 
    189 
    190 
    191 === 2) Codage des instructions
    192 
    193 
    194 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")
    195 
    196 \\
    197 - codage du champ OPCOD:
    198 {{{#!html
    199 <div align=center><b>INS 28:26</div>
    200 <table border="1" cellspacing="0" cellpadding="0" align=center>
    201 <th>
    202 <b>INS 31:29
    203 <td align=center style="width:60px"; > <b>000</td>
    204 <td align=center style="width:60px"; > <b>001</td>
    205 <td align=center style="width:60px"; > <b>010</td>
    206 <td align=center style="width:60px"; > <b>011</td>
    207 <td align=center style="width:60px"; > <b>100</td>
    208 <td align=center style="width:60px"; > <b>101</td>
    209 <td align=center style="width:60px"; > <b>110</td>
    210 <td align=center style="width:60px"; > <b>111</td>
    211 </th>
    212 <tr>
    213 <td align=center style="width:90px"><b>000</td>
    214 <td align=center> SPECIAL</td>
    215 <td align=center> BCOND</td>
    216 <td align=center> J</td>
    217 <td align=center> JAL</td>
    218 <td align=center> BEA</td>
    219 <td align=center> BNE</td>
    220 <td align=center> BLEZ</td>
    221 <td align=center> BGTZ</td>
    222 </tr>
    223 <tr>
    224 <td align=center style="width:90px"><b>001</td>
    225 <td align=center> ADDI</td>
    226 <td align=center> ADDIU</td>
    227 <td align=center> SLTI</td>
    228 <td align=center> SLTIU</td>
    229 <td align=center> ANDI</td>
    230 <td align=center> ORI</td>
    231 <td align=center> XORI</td>
    232 <td align=center> LUI</td>
    233 </tr>
    234 <tr>
    235 <td align=center style="width:90px"><b>010</td>
    236 <td align=center> COPRO</td>
    237 <td align=center> </td>
    238 <td align=center> </td>
    239 <td align=center> </td>
    240 <td align=center> </td>
    241 <td align=center> </td>
    242 <td align=center> </td>
    243 <td align=center> </td>
    244 </tr>
    245 <tr>
    246 <td align=center style="width:90px"><b>011</td>
    247 <td align=center> </td>
    248 <td align=center> </td>
    249 <td align=center> </td>
    250 <td align=center> </td>
    251 <td align=center> </td>
    252 <td align=center> </td>
    253 <td align=center> </td>
    254 <td align=center> </td>
    255 </tr>
    256 <tr>
    257 <td align=center style="width:90px"><b>100</td>
    258 <td align=center> LB</td>
    259 <td align=center> LH</td>
    260 <td align=center> </td>
    261 <td align=center> LW</td>
    262 <td align=center> LBU</td>
    263 <td align=center> LHU</td>
    264 <td align=center> </td>
    265 <td align=center> </td>
    266 </tr>
    267 <tr>
    268 <td align=center style="width:90px"><b>101</td>
    269 <td align=center> SB</td>
    270 <td align=center> SH</td>
    271 <td align=center> </td>
    272 <td align=center> SW</td>
    273 <td align=center> </td>
    274 <td align=center> </td>
    275 <td align=center> </td>
    276 <td align=center> </td>
    277 </tr>
    278 <tr>
    279 <td align=center style="width:90px"><b>110</td>
    280 <td align=center> </td>
    281 <td align=center> </td>
    282 <td align=center> </td>
    283 <td align=center> </td>
    284 <td align=center> </td>
    285 <td align=center> </td>
    286 <td align=center> </td>
    287 <td align=center> </td>
    288 </tr>
    289 <tr>
    290 <td align=center style="width:90px"><b>111</td>
    291 <td align=center> </td>
    292 <td align=center> </td>
    293 <td align=center> </td>
    294 <td align=center> </td>
    295 <td align=center> </td>
    296 <td align=center> </td>
    297 <td align=center> </td>
    298 <td align=center> </td>
    299 </tr></table>
    300 <div align=center><br>
    301 Par exemple, ce tableau indique que l'instruction LHU a un OPCOD à "100101".
    302 </div>
    303 }}}
    304 
    305 - Lorsque l'OPCODE a la valeur SPECIAL ("000000"), il faut analyser les 6 bits de poids faible de l'instruction (INS 5:0):
    306 
    307 {{{#!html
    308 <div align=center><b>INS 2:0</div>
    309 <table border="1" cellspacing="0" cellpadding="0" align=center>
    310 <th>
    311 <b>INS 5:3
    312 <td align=center style="width:60px"; > <b>000</td>
    313 <td align=center style="width:60px"; > <b>001</td>
    314 <td align=center style="width:60px"; > <b>010</td>
    315 <td align=center style="width:60px"; > <b>011</td>
    316 <td align=center style="width:60px"; > <b>100</td>
    317 <td align=center style="width:60px"; > <b>101</td>
    318 <td align=center style="width:60px"; > <b>110</td>
    319 <td align=center style="width:60px"; > <b>111</td>
    320 </th>
    321 <tr>
    322 <td align=center style="width:90px"><b>000</td>
    323 <td align=center> SLL</td>
    324 <td align=center> </td>
    325 <td align=center> SRL</td>
    326 <td align=center> SRA</td>
    327 <td align=center> SLLV</td>
    328 <td align=center> </td>
    329 <td align=center> SRLV</td>
    330 <td align=center> SRAV</td>
    331 </tr>
    332 <tr>
    333 <td align=center style="width:90px"><b>001</td>
    334 <td align=center> JR</td>
    335 <td align=center> JALR</td>
    336 <td align=center> </td>
    337 <td align=center> </td>
    338 <td align=center> SYSCALL</td>
    339 <td align=center> BREAK</td>
    340 <td align=center> </td>
    341 <td align=center> </td>
    342 </tr>
    343 <tr>
    344 <td align=center style="width:90px"><b>010</td>
    345 <td align=center> MFHI</td>
    346 <td align=center> MTHI</td>
    347 <td align=center> MFLO</td>
    348 <td align=center> MTLO</td>
    349 <td align=center> </td>
    350 <td align=center> </td>
    351 <td align=center> </td>
    352 <td align=center> </td>
    353 </tr>
    354 <tr>
    355 <td align=center style="width:90px"><b>011</td>
    356 <td align=center> MULT</td>
    357 <td align=center> MULTU</td>
    358 <td align=center> DIV</td>
    359 <td align=center> DIVU</td>
    360 <td align=center> </td>
    361 <td align=center> </td>
    362 <td align=center> </td>
    363 <td align=center> </td>
    364 </tr>
    365 <tr>
    366 <td align=center style="width:90px"><b>100</td>
    367 <td align=center> ADD</td>
    368 <td align=center> ADDU</td>
    369 <td align=center> SUB</td>
    370 <td align=center> SUBU</td>
    371 <td align=center> AND</td>
    372 <td align=center> OR</td>
    373 <td align=center> XOR</td>
    374 <td align=center> NOR</td>
    375 </tr>
    376 <tr>
    377 <td align=center style="width:90px"><b>101</td>
    378 <td align=center> </td>
    379 <td align=center> </td>
    380 <td align=center> STL</td>
    381 <td align=center> SLTU</td>
    382 <td align=center> </td>
    383 <td align=center> </td>
    384 <td align=center> </td>
    385 <td align=center> </td>
    386 </tr>
    387 <tr>
    388 <td align=center style="width:90px"><b>110</td>
    389 <td align=center> </td>
    390 <td align=center> </td>
    391 <td align=center> </td>
    392 <td align=center> </td>
    393 <td align=center> </td>
    394 <td align=center> </td>
    395 <td align=center> </td>
    396 <td align=center> </td>
    397 </tr>
    398 <tr>
    399 <td align=center style="width:90px"><b>111</td>
    400 <td align=center> </td>
    401 <td align=center> </td>
    402 <td align=center> </td>
    403 <td align=center> </td>
    404 <td align=center> </td>
    405 <td align=center> </td>
    406 <td align=center> </td>
    407 <td align=center> </td>
    408 </tr></table>
    409 <div align=center><br>
    410 Par exemple, l'instruction MTLO a un OPCOD à "000000" et le champ FUNC est à "010011".
    411 </div>
    412 }}}
    413 
    414 - Lorsque l'OPCOD a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction.
     124 Lorsque l'OPCOD 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.
    415125
    416126{{{#!html
     
    424134<tr>
    425135<td align=center style="width:90px"><b>0</td>
    426 <td align=center> BLTZ</td>
    427 <td align=center> BGEZ</td>
    428 </tr>
    429 <tr>
    430 <tr>
    431 <td align=center style="width:90px"><b>1</td>
    432 <td align=center> BLTZAL</td>
    433 <td align=center> BGEZAL</td>
    434 </tr>
    435 <tr></table>
    436 <div align=center><br>
    437 Par exemple, l'instruction BTLZAL a un OPCOD à "000001",<br>le bit IN20 est à "1" et le bit INS16 est à "0"</div>
    438 }}}
    439 
    440 
    441 - Lorsque l'OPCOD 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.
    442 
    443 {{{#!html
    444 <div align=center><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INS 16</div>
    445 <table border="1" cellspacing="0" cellpadding="0" align=center>
    446 <th>
    447 <b>INS 20
    448 <td align=center style="width:60px"; > <b>0</td>
    449 <td align=center style="width:60px"; > <b>1</td>
    450 </th>
    451 <tr>
    452 <td align=center style="width:90px"><b>0</td>
    453136<td align=center> MFC0</td>
    454137<td align=center> MTC0</td>
     
    457140<tr>
    458141<td align=center style="width:90px"><b>1</td>
    459 <td align=center> ERET</td>
    460 <td align=center> ERET</td>
     142<td align=center COLSPAN="2"> ERET</td>
    461143</tr>
    462144<tr></table>
     
    468150
    469151
    470 === 3) Jeu d'instructions
    471 
    472 
    473 Le jeu d'instructions est "orienté registres". Cela signifie que les instructions arithmétiques et logiques prennent leurs opérandes dans des registres et rangent leur 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.
    474 
    475 La plupart des instructions arithmétiques et logiques se présentent sous les 2 formes registre-registre et registre-immédiat:
    476 
    477  || instruction assembleur  || ||comportement dans le processeur || || format d'instruction ||
    478  ||**add rd, rs, rt**       || || R(rd) <--- R(rs) op R(rt)      || || ''format R''         ||
    479  ||**addi rd, rs, imm**     || || R(rd) <--- R(rs) op IMD16      || || ''format I''         ||
     152
     153 || **instruction**  || ||  **comportement** || || **commentaire** ||
     154 ||**mtc0 RT, RD**   || ||`C0_RD` ← `RT`   || ||Recopie le contenu du registre GPR n°**RT**\\dans le registre du coprocesseur 0 n°**RD** ||
     155 ||**mfc0 RT, RD**   || ||`RT` ← `C0_RD`   || ||Recopie le contenu du registre du coprocesseur 0 n°**RD**\\dans le registre GPR n°**RT**||
     156 ||**eret**          || ||`PC` ← `C0_EPC`\\`C0_SR.EXL` ← `0` || || ||
    480157 
    481158L’opérande immédiat 16 bits est signé pour les opérations arithmétiques et non signé pour les opérations logiques.