2. Bibliographie pour aujourd'hui
Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey
D. Ullman, Compilers: Principles, Techniques,
and Tools (2nd Edition)
– Chapitre 7
• 7.1
• 7.2
5. La Pile
• Registres
– sp (8086)
– esp (386)
– rsp (AMD64)
• Instructions
– push
– pop
6. Expressions avec a pile
• poussez le premier opérande vers la pile
• poussez le second opérande vers la pile
• exécuter la instruction
– obtenir une valeur de la pile
– obtenir une valeur de la pile
– exécuter l'opération avec les deux valeurs
– pousser le résultat à la pile
9. Appel de fonction
• Paramètres
• Variables locales
• Valeur de retour
• Apple effective
• Retour ou?
• Appelant
– Le program
– Fonction
• Appelé
– La fonction
10. Paramètres
• Types
– Valeur
– Reference
– Résultat
– Valeur et résultat
• Moyen de envoyer
– Pousser dans a pile
– Passer dans les registres
– Passer dans une structure des donnes
11. Cadre de plie
• Moyenne de
organisation de a pile
• Enregistre
– Paramètres
– Adresse de retour
– Adresse de cadre de pile
précédente
– Variables locales
– Espace pour allocation
locale
12. Stack Pointer et Frame (Base) Pointer
Stack Pointer (sp)
• Position out a prochaine
valeur va être pousse
• push
– sp = sp - dimension_mot
• pop
– sp = sp + dimension_mot
Frame ou Base Pointer (bp/fp)
• Valeur de sp au moment de
entrer dans a fonction
• Entre dans a fonction
– fp = sp
• Utilise pour les paramètres
et les variables locale
13. Appel de fonction (appelant)
1. Enregistrer les registres
2. Envoyer les paramètres
– pile
– registres
3. Saut vers la fonction et
enregistrer la adresse
du retour
14. Appel de fonction (appelé)
1. Enregistre le fp
2. Faire espace pour les
variable locales
3. Exécuter a fonction
4. Enregistrer la valeur de
retour
5. Mis a valeur initiale de
fp
6. Saut vers le appelant
15. Appel de fonction (appelant/appelé)
1. Effacer les paramètres
de a pile
2. Mis la valeur initiale de
registres
3. Prendre la valeur de
retour
16. Standard de appel
Architectu
re
Nom Paramètres
dans registres
Paramèt
res dans
la pile
Clean up Retour
IA-32 cdecl RTL Appelant EAX, EDX / pile
stdcall RTL Appelé
(Hybride)
EAX, EDX / pile
fastcall ECX, DEX RTL Appelé EAX, EDX / pile
x86-64 Microsoft RCX, RDX, R8,
R9
RTL Appelant RAX
System V,
AMD64 ABI
RDI, RSI, RDX,
RCX, R8, R9
RTL Appelant RAX
ARM 32 r0, r1, r2, r3 RTL Appelé r0
ARM 64 x0, x1, x2, x3,
x4,x5, x6, x7
Appelé x0, x1, x2, x3,
x4,x5, x6, x7
17. Exemple IA32 exp (p1, p2, p3);
Appelant
… push registres
push p3
push p2
push p1
call exp
sub esp, -12
… pop registres
Appelé
push ebp
mov ebp, esp
sub esp, dimension_variables
; prend p1
mov eax, ebp - 8
…
add esp, dimension_variables
pop ebp
mov eax, result
ret
18. Exemple x86-64 exp (p1, p2, p3);
Appelant
… push registres
mov rdi, p1
mov rsi, p2
mov rdx, p3
call exp
… pop registres
Appelé
push ebp
mov ebp, esp
sub esp, dimension_variables
; prend p1
mov eax, rd1
…
add esp, dimension_variables
pop ebp
mov eax, result
ret
19. Sujets
• Langage de assemblage pour une machine
avec une pile
• La Pile
• Cadre de pile
• Appel de fonctions