La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

La pile un élément essentiel Merci Laurent JEANPIERRE.

Présentations similaires


Présentation au sujet: "La pile un élément essentiel Merci Laurent JEANPIERRE."— Transcription de la présentation:

1 La pile un élément essentiel Merci Laurent JEANPIERRE

2 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

3 Définition de la pile (stack) Structure de données Stratégie LIFO Last In First Out Dernier entré, premier sorti Analogie avec pile dassiettes. Mémoire de stockage Temporaire Stockage bien parenthésé [({}{}{})()({})][]

4 La pile en mémoire Zone de mémoire séparée Registre de segment spécifique SS = Stack Segment Registre de position spécifique eSP = (extended) Stack Pointer ss:esp indique la dernière valeur empilée Sur x86, elle croît à lenvers… Sommet_pile Base_pile

5 Contenu du cours DéfinitionManipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

6 Manipulations de la pile Trois possibilités : Modification de eSP movl %ebp,%esp # ebp esp addl $4,%esp # esp esp+4 Accès direct à la mémoire (voir cours sur modes dadressage) movw 4(%esp), %ax # mem[esp+4] ax Instructions spécifiques pushw, pushl popw, popl

7 Instructions spécifiques PUSH = empiler Met une valeur sur la pile. Le registre esp diminue de la taille spécifiée Lopérande est stockée à ladresse (%esp) POP = dépiler Retire une valeur de la pile. Lopérande est remplie avec le contenu de ladresse (%esp) Le registre esp augmente de la taille spécifiée Spécificité : Pas dopération sur 1 octet (processeur 16 bits)

8 Exemple de manipulation de pile (1) movl$0,%eax pushl $0x pushw $0x89AB pushw$0xCDEF movb(%esp),%al popl%ebx movw%ax,1(%esp) popl%eax

9 esp Exemple de manipulation de pile (2) movl$0,%eax pushl $0x pushw $0x89AB Registres EAXEBXESP ********???????? Pile

10 esp Exemple de manipulation de pile (2) movl$0,%eax pushl $0x pushw $0x89AB Registres EAXEBXESP ???????? Pile esp

11 esp Exemple de manipulation de pile (2) pushl $0x pushw $0x89AB pushw$0xCDEF Registres EAXEBXESP ???????? Pile esp AB 94 10

12 esp Exemple de manipulation de pile (2) pushw $0x89AB pushw$0xCDEF movb(esp),%al Registres EAXEBXESP ???????? Pile esp AB CDEF

13 esp Exemple de manipulation de pile (2) pushw$0xCDEF movb(%esp),%al popl%ebx Registres EAXEBXESP ???????? Pile AB CDEF EF

14 esp Exemple de manipulation de pile (2) movb(esp),%al popl%ebx movw%ax, 1(%esp) Registres EAXEBXESP EF???????? Pile esp AB CDEF 89ABCDEF

15 esp Exemple de manipulation de pile (2) popl%ebx movw%ax, 1(%esp) popl%eax Registres EAXEBXESP EF89ABCDEF Pile AB CDEF 0100 EF67

16 Exemple de manipulation de pile (2) popl%ebx movw%ax,1(%esp) popl%eax Registres EAXEBXESP EF89ABCDEF Pile 0100 EF67 89AB CDEF esp EF67

17 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

18 Appel de fonctions Programme structuré fonctions Exemple : Fonction déplacer(Object o) Soulever(o) SeDéplacer() Poser(o) Fin Fonctions blocs bien parenthésés Utilisation naturelle de la pile

19 Appel de fonctions en assembleur Instruction : call Empile EIP (compteur ordinal) EIP label La fonction sexécute… Instruction : ret Dépile EIP Le programme principal reprend…

20 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

21 Le résultat de la fonction (1) Convention du langage C : Le résultat est renvoyé dans EAX Parfait pour des entiers ou des adresses Inadapté pour le reste Le résultat est stocké temporairement Dans une pseudo-variable locale Dans la dernière variable allouée

22 Le résultat de la fonction (2) Valeurs plus petites (char, short) Extension à 32 bits. Attention au signe ! (unsigned char char) Valeurs plus grandes Par adresse (pointeur dans eax) Cas des structures très délicat. Valeurs flottantes (float, single, double) Dans st(0) (pile FPU, voir cours sur la FPU)

23 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

24 Les variables Une fonction peut avoir des variables… int main() { int a = 3; int b = a+5; } A et B sont locales à la fonction main Comment les mémoriser ? Sur le tas Sur la pile

25 Variables globales : le tas.data a:.long 3 b:.long 0.text main: movl (a), %eax addl$5, %eax movl%eax, (b) ret Très bien pour les variables globales… Mais pour les fonctions récursives ?

26 Fonctions récursives Définition : Une fonction est dite « récursive » si elle sappelle elle-même, ou si elle utilise une autre fonction qui lappelle (la 1 ère ). Exemple : la suite de fibonacci Fibo(0) = 0 Fibo(1) = 1 Fibo(n) = Fibo(n-1) + Fibo(n-2) n …

27 Exemple2 : Fibonacci int Fibo(int n) { int a,b; if (n==0) return 0; if (n==1) return 1; a = Fibo(n-1); b = Fibo(n-2); return a+b; } Chaque appel de Fibo a des valeurs de a et de b différentes… Impossible donc de les stocker en mémoire…

28 Variables locales : la pile La pile offre une mémoire Contextuelle Selon des blocs parenthésés Il suffit dy stocker les variables locales Problème : ESP varie sans cesse… Comment retrouver les variables ? Solution : Le cadre de pile

29 Cadre de pile (ébauche) Utilisation du registre EBP : Mémorise la base de la pile pour la fonction active Accès direct aux variables via EBP Un registre EBP pour chaque fonction Sauvegarde de la valeur précédente… Sur la pile ! Chaque fonction commence donc par : Sauvegarde EBP Allocation du cadre de pile

30 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

31 Les paramètres des fonctions Une fonction peut avoir des paramètres printf ("hello %s!","World"); Un paramètre = une variable initialisée… Géré comme une variable locale Mais Initialisé par lappelant A ce moment, pas encore de cadre de pile Position particulière dans le FUTUR cadre de pile

32 Cadre de pile (complet) Le cadre de pile contient donc : Paramètres de fonction Par lappelant Adresse de retour Automatique (call) Sauvegarde EBP pushl %ebp movl %esp, %ebp Variables Locales subl $taille,%esp Paramètres (taille retour (32b) Svg EBP (32b) Var. Locales (taille ?) ebp esp

33 Note spécifique 386 et plus… La pile est alignée sur 32 bits… Convention logicielle de gcc (et autres…) Pas de justification matérielle Tout paramètre prend n*32 bits ! int/void* 32 bits ok char/short 8/16 bits problème extension du signe ou bourrage si non signé création de variables locales de la bonne taille float/single 32 bits ok double 64 bits ok On ne sintéressera quaux multiples de 32 bits Reste Pas au programme

34 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : Fibonacci Conclusion

35 Fibonacci, le résultat final (1) int fibo(int n) Locales : int a,b,r; _fibo: # sauvegarde EBP pushl%ebp # EBP <- ESP movl%esp, %ebp # Alloue 16 octets # sur la pile subl$16, %esp n EBP 0 a (int) b (int) r (int) * (32b) ebp esp Paramètres Contexte Variables locales Spécial

36 Fibonacci, le résultat final (2) # if n==0 cmpl$0, 8(%ebp)# compare 0 et n (EBP+8) jneL10# saute si différent movl$0, -12(%ebp)# mets 0 dans r (EBP-12) jmpL9# saute à fin L10: # if n==1 cmpl$1, 8(%ebp)# compare 1 et n (EBP+8) jneL11# saute si différent movl$1, -12(%ebp)# mets 1 dans r (EBP-12) jmpL9# saute à fin L11:

37 Fibonacci, le résultat final (3) # a = fibo(n-1) movl8(%ebp), %eax# eax <- n (EBP+8) decl%eax# eax <- eax-1 movl%eax, (%esp)# (ESP+0) <- eax # {Paramètre1 <- n-1} call_fibo# appelle fibo # {résultat dans eax} movl%eax, -4(%ebp)# mets eax dans a (EBP-4) # b = fibo(n-2) movl8(%ebp), %eax# eax <- n (EBP+8) subl$2, %eax# eax <- eax-2 movl%eax, (%esp)# (ESP+0) <- eax # {Paramètre1 = n-2} call_fibo# appelle fibo {res eax} movl%eax, -8(%ebp)# mets eax dans b (EBP-8)

38 Fibonacci, le résultat final (4) # r = a+b movl-8(%ebp), %eax# eax <- b (EBP-8) addl-4(%ebp), %eax# eax <- eax + a (EBP-4) movl%eax, -12(%ebp)# mets eax dans r (EBP-12) L9: movl-12(%ebp), %eax# eax <- r=(EBP+12) movl%ebp, %esp# %esp <- %ebp popl%ebp# Restaure ebp ret# fin Ou encore … (autre solution) L9: movl-12(%ebp), %eax# eax <- r=(EBP+12) leave# Restaure le cadre de pile ret# fin

39 Contenu du cours Définition Manipulations Appel de fonctions Gestion du résultat Gestion des variables Gestion des paramètres Exemple : FibonacciConclusion

40 Conclusion La pile est un élément essentiel Sur TOUS les processeurs Du plus petit (microcontrôleur spécialisé) Au plus gros (serveur de calculs) Gestion identique Empile, Dépile, Registre « pointeur de pile » Notion de cadre de pile (avec des variantes) Maîtriser la pile (et le tas) permet de Comprendre les « segmentation faults » Eviter les « core dump »


Télécharger ppt "La pile un élément essentiel Merci Laurent JEANPIERRE."

Présentations similaires


Annonces Google