Vous êtes sur la page 1sur 21

Mokrani Hocine

dr.mokrani@gmail.com

1
Chapitre IV

Quelques conventions
Appel de fonctions
Multi-tâche, exceptions & interruptions.
Conclusion.

2
Quelques conventions

3
Convention d’organisation de la
mémoire
$sp ->0x 7FFF FFFF
Pile
.stack
Conventions logiciels

Données
Dynamiques .data
$gp ->0x 1000 8000
Données
Statiques
0x 1000 0000
Instructions du
.Text
programme
pc ->0x 0040 0000
Réservée Partie réservée au système
0 4
Convention de passage d’arguments

• Les premiers arguments d’entrées sont passées à la


fonction dans les registres $a0, $a1, $a2, and $a3.

• Toutes les arguments d’entrées additionnels sont


passées par la pile.

• Registre $v0 est utilisé pour retourner une valeur.

• Possibilité d’utilisation de la pile pour toutes les


paramètres d’entrées/sorties.

5
Appel de fonction

6
Appel de fonction
jal pr2 # appel pr2
add …
sub …
…. Pr2:
add …
sub …
mult…
jr $31 # return

• L’instruction jal pr2 permet d’exécuter le sous-programme de label pr2.


L’adresse de retour est stocker dans le registre $31.
• Cependant,
 Le sous-programme peut affecter les valeurs contenues dans les
registres au moment de l’appel : pas de notion de variables locales et
de portée/masquage de variables.
 La sauvegarde de l’adresse de retour dans un registre ne permet pas
l’enchaînement des appels à des sous-programmes, encore moins
des sous-programmes récursifs.
7
Appel de fonction
• Solution :
– Sauvegarder la valeur des registres (en mémoire) de l’appelant
et restaurer ces valeurs à l’issue de l’appel.
– Sauvegarder l’adresse de retour du programme appelant en
mémoire.

• On sauvegarde les (une partie des) registres en mémoire


dans une pile.

• Les registres $a0-$a3 sont ceux qui ne sont pas


sauvegardées car ils contiennent lors de l’appel la valeur
des paramètres effectifs, et au retour les valeurs retournés
par le sous-programme.

8
Appel de fonction
(Utilisation d’une Pile)
• Une pile est une mémoire qui se manipule via deux
opérations :
 push : empiler un élément (le contenu d’un registre) au sommet
de la pile.
 pop : dépiler un élément (et le récupérer dans un registre).

• Ces deux instructions n’existent pas en assembleur MIPS,


mais elles peuvent être “simulées”.

 En utilisant les instructions sw et lw.


 En stockant l’adresse du sommet de pile dans le registre $sp (le
pointeur de pile)

9
Appel de sous-programmes
(politique de gestion de la pile)

• Deux politiques de sauvegarde des registres :


 sauvegarde par l’appelant : le programme appelant
sauvegarde tous les registres sur la pile (avant l’appel).
 sauvegarde par l’appelé : le programme appelant suppose
que tous les registres seront préservés par le sous-
programme appelé.

• Remarque:
un sous-programme doit rendre la pile intacte.

10
Exemple d’appel de fonction

addiu $sp, $sp, -24 # Allocation d’espace dans la pile


sw $t1, 0($sp) # Premier paramètre d’entrée à la Mem[Sp]
sw $t2, 4($sp) # Second paramètre d’entrée à la Mem[Sp+ 4]
sw $t3, 8($sp) # troisième paramètre d’entrée à la Mem[Sp+ 8]
sw $ra, 20($sp) # Sauvegarder l’adresse de retour.
jal FUN # Appeler la fonction JILL
lw $ra, 20($sp) # Restaurer l’adresse de retour.
lw $t4, 12($sp) # Récupérer le premier paramètre de sortie la fonction à la Mem[Sp+12]
lw $t5, 16($sp) # Récupérer le second paramètre de sortie de la fonction à la Mem[Sp+16]
addiu $sp, $sp, 24 # Libération de l’espace de la pile.

11
Besoin de sauvegarder d’autres
données?
addiu $sp, $sp, -32 # Allocation d’espace dans la pile
sw $t1, 0($sp) # Premier paramètre d’entrée à la Mem[Sp]
sw $t2, 4($sp) # Second paramètre d’entrée à la Mem[Sp+ 4]
sw $t3, 8($sp) # troisième paramètre d’entrée à la Mem[Sp+ 8]
sw $ra, 20($sp) # Sauvegarder l’adresse de retour.
sw $t6, 24($sp) # Sauvegarder $t6 dans la pile
sw $t7, 28($sp) # Sauvegarder $t3 dans la pile
jal FUN # Appeler la fonction JILL
lw $t6, 24($sp) # Restaurer $t6 depuis la pile
lw $t7, 28($sp) # Restaurer $t7 depuis la pile
lw $ra, 20($sp) # Restaurer l’adresse de retour.
lw $t4, 12($sp) # Récupérer le premier paramètre de sortie la fonction à la Mem[Sp+12]
lw $t5, 16($sp) # Récupérer le second paramètre de sortie de la fonction à la Mem[Sp+16]
addiu $sp, $sp, 24 # Libération de l’espace de la pile.

12
Exemple de programmation d’une
fonction appelée
FUN:
lw $a0, 0($sp) # Récupérer le premier paramètre “A” dans Mem[Sp]
lw $a1, 4($sp) # Récupérer le second paramètre “B” dans Mem[Sp+4]
lw $a2, 8($sp) # Récupérer le second paramètre “C” dans Mem[Sp+8]
… # Quelques instruction de la fonction
sw $v0, 12($sp) #Ecrire le premier paramètre de sortie “D” dansMem[Sp+12]
sw $v1, 16($sp) # Ecrire le seconde paramètre de sortie “E” at Mem[Sp+16]
jr $ra # Retour à la fonction appelante

13
Variables locales et Conventions

• Les variables locales sont allouées généralement dans la pile.


• Par exemple si la fonction appelée (FUN) a besoin d’un tableau temporaire de
16 caractère.

addiu $sp, $sp, -16 # Alloué de l’espace pour le tableau temporaire


move $a0, $sp # Initialisation d’un pointeur du tableau.

• Remarque:
– Il faut libérer l’espace du tableau avant de quitter la fonction.
– Faire attention concernant le décalage par rapport au sommer de la pile.
 Utilisation du registre $fp (Frame pointer) pour différencier les
paramètres de la fonction et les variables locales

14
Multi-tâches, Exceptions &
Interruptions

15
Multi-tâches
Pour permettre à un processeur d’exécuter plusieurs programme au
même temps.

 Le processeur doit posséder deux modes, le mode utilisateur


(ou user) pour exécuter les applications, et le mode noyau (ou
kernel) pour exécuter le système.

 Des mécanismes de protections sont mis en œuvre pour l’accès


aux registres relatifs au système.

Remarque: les tâches ne s’exécute pas ou même temps. Chaque


tâche s’exécute sur le processeur dans un temps définie par le
système d’exploitation.

16
Multi-tâches & Exceptions
• Chaque fois qu’un bouton de la souris est poussé ou la souris est déplacée, ou une
touche du clavier est pressée.
=> l’ordinateur répond !?

• Comment programmer un ordinateur pour produire de telles réponses interactives ?


=> Utilisation des interruptions.

• Comment peut-on gérer les interruptions ?


=> Inclure du matériel pour gérer les interruptions lorsque quelques événements
spéciaux arrivent.

=> Sur MIPS: conception d’un coprocesseur (0) qui envoi un signal d’interruption au
contrôleur de processeur lorsque une exception arrive. (Accès au mode noyau).

Remarque: Coprocesseur (1) est l’unité arithmétique des nombres réels.

17
Quelques registres du coprocesseur0
(MIPS)
Ces registres concernent la gestion des exceptions, interruptions et appels systèmes.

• badvaddr (bad virtual address)


ce registre contient l’adresse fautive en cas d’exception de type « adresse illégale » ;

• status:
c’est le registre d’état. Il contient les masques d’interruption et le mode ;

• cause:
c’est le registre qui contient la cause de l’exception ;

• epc (exception program counter):


ce registre contient l’adresse de retour en cas d’interruption et l’adresse de
l’instruction fautive en cas d’exception ou d’appel système.

Remarque: Il existe d’autres registres qui permettent la gestion de la mémoire


virtuelle.

18
Exécution des exceptions & interruptions
(Mips)
1. Lorsque une interruption est signalée et le processeur est arriver à la fin de
l’instruction en cours d’exécution et avant même de commencer l’exécution de
l’instruction suivante, l’unité de contrôle entre dans un état spécial.
2. Dans cet état spécial:
a) Le contenu du registre PC est sauvegarder dans le registre EPC. Et le conteur PC est
mis-à-jours par l’adresse de la première instruction de la routine à exécuter. Aussi il
faut sauvegarder le contenu des autres registres pour éviter l’écrasement des
données (sauvegarder le contexte du CPU).
b) Le mode d’exécution est changé en mode noyau dans le registre status et les
interruptions sont masquées.
c) Le registre cause est récupéré, pour voir la cause de l’exception. Aussi, le registre
BadVaddr est récupéré avec quelques registres de gestion de mémoire virtuelle.
d) Le processeur exécute les instructions du code associé à l’interruption. (c’est le
programme d’interruption qui règle l’exception).
3. Après la fin d’exécution de la routine d’interruption:
a) Sauvegarder le contenu du registre EPC dans le registre PC. (Revenir à la prochaine
instruction à exécuter sur le programme de départ).
b) Restaurer le contexte du CPU.
c) Sortir de l’état spéciale du contrôleur et continuer l’exécution normale du programme
jusqu’à rencontrer une nouvelle interruption.
19
Conclusion

20
Conclusion
Il faut:
1. Gérer la mémoire selon des conventions définies.
2. Gérer le sauvegarde et la restauration des données lors des
appels des fonctions.
3. Suivre la convention d’utilisation des arguments d’appel de
fonction.
4. Utiliser la pile système pour sauvegarder les variables locales.
5. Avoir un processeur qui permet deux modes d’exécution
(superviseur/ utilisateur) pour pouvoir réaliser le multi-tâche.
6. Avoir un composant matériel liée au processeur qui permet la
gestion des exceptions et les différents modes.

21

Vous aimerez peut-être aussi