Patricia Renault UPMC 2005/2006 UE MAREP Cours 6 : La pile d’exécution (Fonctions sans variables locales - Passage des arguments par valeur) Patricia Renault UPMC 2005/2006
Plan Qu’est-ce qu’une pile ? Appel de sous-programme Implantation d’une pile d’exécution en MIPS
Plan Qu’est-ce qu’une pile ? Appel de sous-programme Structure d’une pile Opérations relatives à une pile Appel de sous-programme Implantation d’une pile d’exécution en MIPS
Structure d’une pile Une pile permet de représenter une collection d’éléments en conservant l’ordre dans lequel les éléments sont apparus et en les retirant dans l’ordre inverse d’apparition Exemple : pile d’assiette
Structure d’une pile Représentation possible d’une pile P … Y en en-1 X Sommet de pile Vers les adresses faibles
Opérations relatives à une pile Empile(e,P) Avant Après … Y en en-1 e1 X … e en en-1 e1 X Sommet de pile Sommet de pile
Opérations relatives à une pile Dépile(e,P) Avant Après e=en … Y en en-1 e1 X … Y en en-1 e1 X Sommet de pile Sommet de pile
Opérations relatives à une pile Est-vide(P) renvoie VRAI si P= FAUX sinon Est_pleine (P) renvoie VRAI si | P | = taille_max
Plan Qu’est-ce qu’une pile ? Appel de fonction Exemple Mécanisme d’appel et retour de fonction Mécanisme de retour d’une valeur de la fonction appelée vers la fonction appelante Mécanisme de passage des arguments Mécanisme de sauvegarde des registres persistants Appel d’une fonction par une fonction Convention Implantation d’une pile d’exécution en MIPS
Exemple int fmin(int a, int b){ if (a<b) return a; else return b ; } int x = 2, y = 3, z = 4; int t1, t2; void main(){ t1 = fmin(x,y); t2 = fmin(t1,z); printf("%d\n",t2); exit(0);
Exemple Dans cet exemple, la fonction fmin est appelée par la fonction main. On appelle : fmin la fonction appelée main la fonction appelante
Mécanisme d’appel et retour de sous-programme int fmin(int a, int b){ if (a<b) return a; else return b ; } int x = 2, y = 3, z = 4; int t1, t2; void main(){ t1 = fmin(x,y); t2 = fmin(t1,z); printf("%d\n",t2); exit(0); Adresse de retour après 1er appel de min Adresse de retour après 2sd appel de min Adresse de retour de fmin dynamique
Mécanisme d’appel et retour de sous-programme Instruction d’appel de fonction : jal (jump and link) jal fmin saut au label f sauvegarde dans $31 l’adresse de retour (l’adresse de l’instruction suivante) Instruction de retour à la fonction appelante : jr (jump register) jr $31 saut à l’adresse contenue dans le registre $31
Mécanisme de retour d’une valeur de l’appelé vers l’appelant Par convention, la valeur retournée par la fonction appelée est sauvegardée dans le registre 2 la fonction appelée range dans le registre 2 la valeur à retourner à la fonction appelante la fonction appelante trouve dans le registre 2 la valeur retournée par la fonction appelée
Mécanisme de passage des arguments La fonction appelante transmet à la fonction appelée via la pile les valeurs des arguments (dans l’exemple, a prend 2 et b prend 3). La fonction appelée lit dans la pile les valeurs des arguments donnés par la fonction appelante.
Mécanisme de sauvegarde des registres persistants La fonction appelée sauvegarde tous les registres qu’elle utilise avant de les utiliser. La fonction appelée restaure tous les registres qu’elle utilise avant de retourner à la fonction appelante.
Convention La fonction appelante La fonction appelée Empile les arguments (en commençant par le dernier) Effectue l’appel à l’appelé Obtient le résultat dans $2 Dépile les arguments La fonction appelée Empile $31 Empile les registres dont elle se sert dans son traitement Effectue son traitement et place le résultat dans $2 Restaure les valeurs des registres qu’elle avait sauvegardées Dépile $31 Retourne à l’appelant prologue épilogue
Plan Qu’est-ce qu’une pile ? Appel de sous-programme Implantation d’une pile d’exécution en MIPS Introduction Exemple Cas général
Introduction Pile implantée en mémoire dans le segment stack .stack m : réserve m octets pour la pile progresse par adresse décroissante sommet de pile repéré par $29 ($29 repère le dernier mot empilé) lors du chargement d’un programme $29 contient 0x7FFF EFFC
Introduction Empiler le mot contenu dans $5 addiu $29,$29, -4 sw $5, ($29) Dépiler un mot dans $6 lw $6, ($29) addiu $29,$29, 4 $5 X3X2X1X0 $29 $29 avant empilement Y3Y2Y1Y0 X3X2X1X0 $29 avant dépilement $29 $6 contient le mot Y3Y2Y1Y0
Exemple int fmin(int a, int b){ if (a<b) return a; else return b ; } int x = 2, y = 3, z = 4; int t1, t2; void main(){ t1 = fmin(x,y); t2 = fmin(t1,z); printf("%d\n",t2); exit(0);
Exemple .data x : .word 2 y : .word 3 z : .word 4 t1 : .word .stack 256 #256 octets pour la pile .text __start : lui $3, x>>16 ori $3, $3, x & 0xFFFF lw $3, ($3) # x dans $3
Exemple addiu $29, $29, -8 lui $4, y>>16 ori $4, $4, y & 0xFFFF lw $4, ($4) # y dans $4 lui $5, z>>16 ori $5, $5, z & 0xFFFF lw $5, ($5) # z dans $5 addiu $29, $29, -8 sw $4, 4($29) # passage de y sw $3, ($29) # passage de x jal fmin addiu $29, $29, 8
Exemple lui $15, t1 >> 16 ori $15, $15, t1 & 0xFFFF sw $2, ($15) # met fmin(x,y) ds mot d’@ t1 addiu $29, $29, -8 sw $5, 4($29) # passage de z sw $2, ($29) # passage de t1 jal fmin addiu $29, $29, 8
Exemple lui $15, t2 >> 16 ori $15, $15, t2 & 0xFFFF sw $2, ($15) # met fmin(t1,z) ds mot d’@ t2 ori $4, $2, 0 # affichage ori $2, $0, 1 syscall ori $2, $0, 10 # fin
Exemple fmin : addiu $29, $29, -16 #$31+3 registres sw $31, 12($29) lw $8, 16($29) # $8 contient a lw $9, 20($29) # $9 contient b slt $10, $8, $9 # $10 = 1 si a < b bgtz $10, cas_if
Exemple ori $2, $9, 0 # valeur de retour = b j fin_fonction cas_if : ori $2, $8, 0 # valeur de retour = a fin_fonction : lw $10, ($29) lw $9, 4($29) lw $8, 8($29) lw $31, 12($29) addiu $29, $29, 16 jr $31
Cas général f appelle une fonction g avec na arguments. g utilise nr registres pour réaliser le traitement. Soient RAi le registre contenant l’argument i (dans l’appelant f ) RRj le registre persistant numéro j (dans l’appelé g) RPk le registre contenant le paramètre k (dans l’appelé g) Code de f : … addiu $29, $29, -4 * na sw $Ana-1, (4*na-1)($29) sw $Ana-2, (4*na-2)($29) sw $A0, 0($29) jal g addiu $29, $29, 4 * na
Cas général code de g g : addiu $29, $29, -4*(nr +1) # prologue sw $31, 4*nr ($29)# sauvegarde des registres sw $Rnr, 4 * (nr – 1) ($29) … sw $R0, 0($29) lw $P0, 4*(nr+1)($29) # récupération des arg lw $P1,4*(nr+2)($29) lw $Pna-1, 4*(nr + na)($29) … traitement de la fonction # $2 contient le résultat de la fonction
Cas général code de g lw $R0, 0($29) # épilogue … lw $Rnr, 4 * (nr – 1) ($29) lw $31, 4 * (nr) ($29) addiu $29, $29, 4* (nr +1) jr $31 # retour appelant