= Questions - Réponses pour la préparation de la session 2 de l'année 2019-2020 == A propos du format du sujet * **Où et quand ?**[[BR]] L'examen se déroulera dans l'**amphi 34B** sur le campus Pierre et Marie Curie le **mercredi 1er juillet 2020**. * **Est-ce que c'est un sujet "standard" ?**[[BR]] Hormis le fait qu'il n'y a que 3 parties, ce sera un sujet standard. Vous pouvez vous référer aux annales corrigées. * Assembleur * Cache * GIET et un peu d'archi (probablement un QCM) == Programmation assembleur * **Qui fait le prologue et l’épilogue la fonction appelante ou la fonction appelée ?**[[BR]][[BR]] >C'est la fonction appelée qui a un prologue et un épilogue. [[BR]] >Lorsque fonction `f()` appelle une fonction `g()`, elle se contente de placer les arguments dans les registres `$4` à `$7`et de faire un saut à `g()` par >l'instruction `jal g`. > >**Prologue**[[BR]] >Lorsqu'on commence à exécuter `g`, il faut exécuter un prologue dont voici les étapes : >1. créer le contexte d'exécution dans la pile pour `g()` avec l'instruction `addiu $29, $29, -X` où `X` est le nombre d'octets pris dans la pile (c'est > >toujours un multiple de 4). Ces `X` octets vont servir à trois choses : > 1. sauver la valeur des registres persistants que `g()` va utiliser dont `$31`. > 2. réserver de la place pour les variables locales de la fonction `g()` > 3. réserver de la place pour les arguments des fonctions que `g()` va appeler. >2. Sauver les registres persistants que `g()` va utiliser dans la place réservée pour eux à l'étape précédente [[BR]] > C'est donc une suite de `sw $x, d($29)` où `d` est toujours positif et multiple de 4. >3. Sauver les arguments reçus par `g()` (dans `$4` à `$7`) à la place réservée par `f()` (c'est-à-dire dans le > contexte de `f()`). [[BR]]Cette étape n'est pas toujours présente, elle n'est utile que si `g()` appelle elle-même. > des fonctions et qu'elle a donc besoin de changer la valeur des registres `$4` à `$7` alors qu'elle en a besoin après > ses fonctions appelées. > >**Epilogue**[[BR]] >Avant de sortir de `g` on doit exécuter l'épilogue qui consiste à : >1. restaurer l'état des registres persistants sauvés lors du prologue avec une séquence de `lw $x, d($29)` >2. restaurer l'état du pointeur de pile `addiu $29, $29, X` * **Quand on est en mode user peut on masquer les interruptions ?**[[BR]][[BR]] >Non, c'est impossible parce que pour masquer les interruptions, il faut : >* soit écrire dans le registre status en utilisant l'instruction mtc0.[[BR]]Or cette instruction est interdite en mode user, l'utiliser provoque une exception. >* soit écrire dans le registre de masque de l'ICU dont l'adresse est "mappée" (placée) au-delà de 0x80000000.[[BR]] Or y écrire est interdit en mode user, cela provoque une exception.