| 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 | | |
| | 83 | bit 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 |
| | 85 | bit 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 | |
| | 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 fautif est dérouté vers le noyau du système d'exploitation. |
| | 90 | |
| | 91 | |
| | 92 | |
| | 93 | = 4. Instructions protégées |
| | 94 | |
| | 95 | |
| | 96 | |
| | 97 | La 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:: \\ |
| 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. |