UE MAREP Cours 8 : La pile d’exécution (Fonctions imbriquées et fonctions récursives) Patricia Renault UPMC 2005/2006.

Slides:



Advertisements
Présentations similaires
Chapitre annexe. Récursivité
Advertisements

Les fonctions A quoi ça sert ?
Les procédures et interruptions en Assembleur (Tasm)
Calculs de complexité d'algorithmes
Interface Matériel/logiciel
La pile un élément essentiel
Interface Matériel/logiciel
Les structures de données
Paramètres et pointeurs
FLSI602 Génie Informatique et Réseaux
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Système d’exploitation : Assembleur
Points importants de la semaine Les commentaires. Les variables. Les instructions conditionnelles. Les instructions itératives (les boucles).
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale.
Les algorithmes: complexité et notation asymptotique
La récursivité Une procédure est dite récursive si, et seulement si, elle fait appel à elle-même, soit directement soit indirectement Djamal Rebaïne Djamal.
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
Système d’exploitation : Assembleur
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Récursivité Définition récursive d’un problème. Critère d’arrêt et convergence. Performance des algorithmes récursifs. Résolution d’un problème à l’aide.
Principes de programmation (suite)
Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.
Environnements d'exécution
Architecture et technologie des ordinateurs II
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
8PRO100 Éléments de programmation Les types composés.
Algorithmique et structures de données en C
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
INF1101 Algorithmes et structures de données
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
Stocker plusieurs valeurs de même type dans une variable
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
LES PILES ET FILES.
Programmation Système et Réseau
ETNA – 1ème année Guillaume Belmas –
Novembre 2014J.Callot L.Piedfort1 TP1 Enoncé. novembre 2014J.Callot L.Piedfort2 Objectifs Générer un environnement de travail avec Code Warrior Prendre.
Les types composés Les enregistrements.
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Variables et environnement utilisateur W. Barhoumi.
Cours LCS N°4 Présenté par Mr: LALLALI
Les algorithmes recursifs
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
TP1 Enoncé 12/08/2013 JC/LP/MD.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
UE MAREP Cours 12 : Révisions
UE MAREP Cours 9 : Tableaux
Patricia Renault UPMC 2005/2006
Patricia Renault UPMC 2005/2006
UE MAREP Cours 5 : Structures de contrôle représentées en assembleur
Patricia Renault UPMC 2005/2006
8PRO107 Éléments de programmation Les adresses et les pointeurs.
PRO-1027 Programmation Scientifique en C
Les instructions de contrôle
La récursivité.

Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département d’informatique et de génie logiciel Édition Septembre 2009.
CHAPITRE 10 Les sous-programmes 1. Sous-programme Suite d’instructions appelée de manière répétitive Par un programme Par plusieurs programmes distincts.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
Informatique 2A Langage C 3 ème séance.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Quelle est la valeur de S après exécution des instructions suivantes :
Transcription de la présentation:

UE MAREP Cours 8 : La pile d’exécution (Fonctions imbriquées et fonctions récursives) Patricia Renault UPMC 2005/2006

2/27 Plan Somme des cases d’adresse paire d’un tableau Appels de fonctions imbriqués Fonctions récursives

3/27 Plan Somme des cases d’adresse paire d’un tableau Programme Transformation en fonction Que devient cette fonction si on n’a que 5 registres ? Que devient cette fonction sans passage par adresse du tableau ? Appels de fonctions imbriqués Fonctions récursives

4/27 Programme simple int tab[10]={5,4,3,2,1,6,4,2,0,8} ; int main(){ int i,cumul=0; int taille=10; for(i=0 ;i<taille ;i=i+2) { cumul = cumul +tab[i] ; } printf("%d\n",cumul);/*affichage de l'entier cumul*/ return 0; }

5/27 Programme simple.data tab :.word 5, 4, 3, 2, 1, 6, 4, 2, 0, 8.stack 256.text __start : ori $8, $0, 10# taille lui $5,tab>>16 ori $5, $5, tab & de tab[0] # corps xor $7, $7, $7# cumul = 0 xor $6, $6, $6# i = 0

6/27 Programme simple boucle : slt $9, $6, $8 # 1 si i<taille beq $9, $0, finadd lw $10, ($5)# tab[i] add $7, $7, $10# cumul = cumul + tab[i] addi $5, $5, 8 de tab[i+2] addi $6, $6, 2 i = i + 2 j boucle finadd : ori $4, $7, 0# affichage ori $2, $0, 1 syscall ori $2, $0, 10# fin syscall

7/27 Transformation en fonction int somme_cases_paires(int tab[], int taille) { int i,cumul=0; for(i=0; i<taille; i=i+2){ cumul = cumul +tab[i] ; } return cumul; }

8/27 Transformation en fonction somme_cases_paires : # 6 reg+$31+2 var loc addiu $29, $29, -36 sw $31, 32($29) sw $5, 28($29) sw $6, 24($29) sw $7, 20($29) sw $8, 16($29) sw $9, 12($29) sw $10, 8($29) lw $5, lw $8, 40($29)#taille # corps (cf. prog) finadd : ori $2,$7,0 # epilogue lw $31, 32($29) lw $5, 28($29) lw $6, 24($29) lw $7, 20($29) lw $8, 16($29) lw $9, 12($29) lw $10, 8($29) addiu $29, $29, -36 jr $31

9/27 Transformation en fonction i($29) cumul4($29) $108($29) $912($29) $816($29) $720($29) $624($29) ($31)32($29) ($29)tab36($29) 4($29)taille40($29) 8($29)//////////////

10/27 Avec 5 registres ? ($7 en moins) somme_cases_paires : # 5 reg+$31+2 var loc # prologue … xor $6, $6, $6 sw $6,($29) # i sw $6,4($29)# cumul boucle : slt $9, $6, $8 beq $9, $0, finadd lw $10, ($5) sw $6,($29)#i lw $6, 4($29)#cumul add $6, $6, $10 addi $5, $5, 8 sw $6, 4($29)#cumul lw $6, ($29)#i addi $6, $6, 2 j boucle finadd : lw $6, 4($29)#cumul ori $2, $6, 0 # épilogue …

11/27 Avec 5 registres ? ($7 en moins) Les espaces mémoires réservés dans la pile pour les variables locales ne sont utilisés que lorsque le nombre de variable locale est supérieur au nombre de registre disponible. Ces espaces réservés dans la pile permettent d’utiliser un même registre pour plusieurs variables locales (en sauvegardant et restaurant la valeur d’une variable locale dans la pile).

12/27 Passage par valeur du tableau ? Mise en œuvre La fonction appelante recopie le tableau dans la pile La fonction appelée utilise la copie du tableau de la pile Inconvénient Compliqué à coder Temps d’exécution très long Conclusion Un tableau est TOUJOURS passé par ADRESSE lors de l’appel de fonction

13/27 Plan Somme des cases d’adresse paire d’un tableau Appels de fonctions imbriqués Ajout d’une fonction supplémentaire pour effectuer la somme des cases d’adresse paire d’un tableau Fonctions récursives

14/27 Ajout d’une fonction supplémentaire int somme_cases_paires(int tab[],int taille){ int i,cumul=0; for(i=0; i<taille; i=i+2){ cumul = add_nb(cumul, tab[i]) ; } return cumul; } int add_nb(int a, int b){ return(a + b); }

15/27 Ajout d’une fonction supplémentaire somme_cases_paires : # prologue # corps avant cumul=… addiu $29, $29, -8 sw $10, 4($29) sw $7,($29) jal add_nb addiu $29, $29, 8 ori $7, $2, 0 # corps après cumul=… add_nb : # 2reg + $31 addiu $29, $29, -12 sw $31, 8($29) sw $4, 4($29) sw $5, ($29) lw $4, 12($29) # a lw $5, 16($29)# b add $2, $4, $5 #a+b lw $31, 8($29) lw $4, 4($29) lw $5, ($29) addiu $29, $29, 12 jr $31

16/27 Ajout d’une fonction supplémentaire cumul tab[i] i($29) cumul4($29) $108($29) $912($29) $816($29) $720($29) $624($29) ($29)tab 4($29)taille 8($29)////////////// $5($29) Dans main Dans somme_cases_paires après prologue Dans add_nb après prologue

17/27 Plan Rappels Appels de fonctions imbriqués Fonctions récursives Définition Exemples Suite récurrente : Fibonacci Factorielle Coefficient du binôme Algorithme

18/27 Définition Une fonction qui se rappelle elle-même 1 ou plusieurs cas d’arrêt un appel à la même fonction avec au moins un paramètre convergeant vers le(s) cas d’arrêt Le nombre de fois qu’une fonction s’appelle dépend des paramètres lors du lancement de la récursion.

19/27 Exemple : Fibonacci Suite de Fibonacci U n = U n-1 + U n-2  n>2 U 1 = 1 U 2 = 1 Exemple fib(4) = fib(3) + fib(2) fib(3) = fib(2) + fib(1) = = 2 D’où fib(4) = 3

20/27 Exemple : Factorielle

21/27 Exemple : Coefficient du binôme

22/27 Exemple : Coefficient du binôme

23/27 Algorithme Suite récurrente U n =2U n-1 +3 U 1 =5 int suite_recur(int n) { if (n-1 == 1) return 5; else return (2*suite_recur(n-1)+3); }

24/27 Algorithme.data n :.word 4 x :.word.stack 128.text __start : lui $3, n >> 16 ori $3, $3, n & 0xFFFF lw $4, ($3) # 4 dans $4

25/27 Algorithme addiu $29, $29, -4 # empilement de 4 sw $4, ($29) jal suite_recur# appel de suite_recur addiu $29, $29, 4 lui $3, x >> 16 ori $3, $3, x & 0xFFFF sw $2, ($3)# sauvegarde de u4 dans x ori $2, $0, 10# fin syscall

26/27 Algorithme suite_recur : addiu $29, $29, -8 # 1 reg+$31+0 var locale sw $31, 4($29) sw $3, 0($29) lw $3, 8($29)# $3 contient n addiu $3, $3, -1 bne $3, $0, branche_recur ori $2, $0, 5# cas terminal j fin_fonction

27/27 Algorithme branche_recur :# $3 contient n-1 addiu $29, $29, -4 sw $3, ($29) jal suite_recur addiu $29, $29, 4 sll $2, $2, 1# $2 contient 2* Un-1 addiu $2, $2, 3 # $2 contient 2*Un fin_fonction : lw $3, 0($29) lw $31, 4($29) addiu $29, $29, 8 jr $31