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. |