338 | | ''''''''''''''' |
339 | | }}} |
340 | | 1. Vous savez que pour le processeur MIPS, tous les registres GPR sont équivalents, hormis `$0` qui contient toujours `0` et `$31` qui reçoit l'adresse de retour lors de l'exécution d'une instruction d'appel de fonction, comme `jal` ou `jalr`. Vous savez aussi que l'usage des registres respecte une convention. Il y a déjà la partition en les registres temporaires et persistant, ces derniers ne doivent pas changer de valeur lors d'un appel de fonction alors que les autres le peuvent. a été spécialisé, pour se réserve l'usage de dl'usageux registres, pourquoi et lesquels? |
| 338 | - L'instruction `syscall`sysc |
| 339 | ''''''''''''''' |
| 340 | }}} |
| 341 | 1. `$26` et `$27` sont deux registres temporaires que le noyau se réserve pour faire des calcul sans qu'il ait besoin de les sauvegarder dans la pile. Ce ne sont pas des registres système comme `c0_sr` ou `c0_epc`. En effet l'usage de `$26` et `$27` par l'utilisateur ne provoque pas d'exception du MIPS, mais si le noyau est appelé, il modifie ces registres et donc l'utilisateur perd leur valeur. Le code assembleur ci-après contient les instructions exécutées par le noyau quelque-soit la cause. Les commentaires présents dans le code ont été volontairement retirés. La section `.kentry` sera placée à l'adresse `0x80000000` par l'éditeur de lien. La direction `.org` (ligne 16) permet de déplacer le pointeur de remplissage de la section courante du nombre d'octets donnés en argument, ici `0x180`. Pouvez-vous dire pourquoi ? Expliquer le c |
| 342 | {{{#!c |
| 343 | 15 .section .kentry,"ax" |
| 344 | 16 .org 0x180 |
| 345 | 22 |
| 346 | 23 kentry: |
| 347 | 24 |
| 348 | 25 mfc0 $26, $13 |
| 349 | 26 andi $26, $26, 0x3C |
| 350 | 27 li $27, 0x20 |
| 351 | 28 bne $26, $27, not_syscall |
| 352 | }}} |