1 CHAPITRE 10 Les sousprogrammes 2 Sousprogramme Suite

  • Slides: 22
Download presentation
1 CHAPITRE 10 Les sous-programmes

1 CHAPITRE 10 Les sous-programmes

2 Sous-programme • Suite d’instructions appelée de manière répétitive • Par un programme •

2 Sous-programme • Suite d’instructions appelée de manière répétitive • Par un programme • Par plusieurs programmes distincts • Une seule façon de faire l’appel • Sauvegarde de la valeur courante du PC • Effectuer un branchement à l’adresse du sous-programme • Une seule façon de faire le retour • Effectuer un branchement à l’ancienne valeur du PC, à une constante près.

3 Sous-programme • Un sous-programme se compose généralement de: • Récupération des paramètres (inverse

3 Sous-programme • Un sous-programme se compose généralement de: • Récupération des paramètres (inverse du passage de paramètres) • Sauvegarde de l’environnement de l’appelant • Traitement • Retour des résultats, s’il y a lieu • Rétablissement de l’environnement de l’appelant • Retour vers l’appelant (inverse de l’appel)

4 Passage de paramètres • Sur le SPARC • On utilise l’instruction save pour

4 Passage de paramètres • Sur le SPARC • On utilise l’instruction save pour sauvegarder l’environnement • On peut utiliser six registres O pour le passage de paramètres. • Que faire si on doit passer plus de six paramètres? • Que faire si l’architecture n’offre pas de fenêtres de registres?

5 Passage de paramètres • Il existe différentes façons d’effectuer le passage des paramètres

5 Passage de paramètres • Il existe différentes façons d’effectuer le passage des paramètres • Utilisation d’une fenêtre de registre (comme le SPARC) • Utilisation directe des registres • Utilisation de l’adresse de retour ou du registre de lien • Utilisation d’une table • Utilisation d’une pile

6 Fenêtre de registres • Peut être utilisé lorsque l’architecture supporte le concept de

6 Fenêtre de registres • Peut être utilisé lorsque l’architecture supporte le concept de fenêtre de registres Pgm: mov 10, %o 0 mov 25, %o 1 call Somme mov 32, %o 2 mov %o 0, %l 6 … Somme: save %sp, -208, %sp add %i 0, %i 1, %i 0 add %i 0, %i 2, %i 0 ret restore

7 Registres • Similaire à la technique précédente • Ne fonctionne pas si le

7 Registres • Similaire à la technique précédente • Ne fonctionne pas si le nombre de paramètres est plus grand que le nombre de registres. Pgm: mov 10, %l 0 mov 25, %l 1 call Somme mov 32, %l 2 mov %l 0, %l 6 … Somme: add %l 0, %l 1, %l 0 add %l 0, %l 2, %l 0 retl nop

8 Adresse de retour •

8 Adresse de retour •

9 Adresse de retour Pgm: call Somme nop. word 10 . word 25 .

9 Adresse de retour Pgm: call Somme nop. word 10 . word 25 . word 32 mov %l 0, %l 6 … Somme: ldsw [%o 7+8], %l 0 ldsw [%o 7+12], %l 1 ldsw [%o 7+16], %l 2 add %o 7, 12, %o 7 add %l 0, %l 1, %l 0 add %l 0, %l 2, %l 0 retl nop %o 7 + 8

10 Table • On met les paramètres dans une table en mémoire • On

10 Table • On met les paramètres dans une table en mémoire • On passe l’adresse de la table comme paramètre du sous- programme • On peut donc indexé à partir de cette adresse pour obtenir chacun des paramètres • Comme avec la méthode précédente, on peut passer un nombre arbitraire de paramètres.

11 Table Pgm: setx Table, %l 7, %l 0 call Somme nop mov %l

11 Table Pgm: setx Table, %l 7, %l 0 call Somme nop mov %l 0, %l 6 … Somme: ldsw [%l 0], %l 1 ldsw [%l 0+4], %l 2 ldsw [%l 0+8], %l 3 add %l 1, %l 2, %l 0 add %l 0, %l 3, %l 0 retl nop Table: . section ". rodata" . align 4 . word 10, 25, 32

12 Pile • On met les paramètres au sommet d’une pile • C’est le

12 Pile • On met les paramètres au sommet d’une pile • C’est le programme appelant qui s’occupe d’empiler • Le programme appelant et le sous-programme ont accès à un registre qui contient l’adresse du sommet de la pile. • Le sous-programme dépile les paramètres • Empile le résultat sur la pile • En SPARC, le registre %sp contient l’adresse du sommet de la pile • C’est une pile biaisée (2047) et il faut ajouter 128 (on va voir plus tard)

13 Pile Pgm: mov 10, %l 0 dec 8, %sp stx %l 0, [%sp+2047+128]

13 Pile Pgm: mov 10, %l 0 dec 8, %sp stx %l 0, [%sp+2047+128] mov 25, %l 0 dec 8, %sp stx %l 0, [%sp+2047+128] mov %sp-24 32 32, %l 0 %sp-16 25 dec 8, %sp-8 stx %l 0, [%sp+2047+128] 10 call Somme nop ldx … [%sp+2047+128], %l 6 %sp

14 Pile Somme: ldx [%sp+2047+128], %l 3 inc 8, %sp ldx [%sp+2047+128], %l 2

14 Pile Somme: ldx [%sp+2047+128], %l 3 inc 8, %sp ldx [%sp+2047+128], %l 2 inc 8, %sp ldx [%sp+2047+128], %l 1 inc 8, %sp add %sp 32 %l 1, %l 2, %l 0 %sp+8 25 add %l 0, %l 3, %l 0 %sp+16 dec 8, %sp 10 stx %l 0, [%sp+2047+128] %sp+24 67 retl nop

15 Récursivité • Il faut habituellement sauvegarder l’environnement de l’appelant lors de l’exécution d’un

15 Récursivité • Il faut habituellement sauvegarder l’environnement de l’appelant lors de l’exécution d’un sous-programme • On utilise généralement une pile • C’est d’autant plus vrai pour les sous-programmes récursifs • Si l’architecture ne fournit qu’une seule fenêtre de registres • Il faut sauvegarder tous les registres que le sous-programme modifie • L’endroit le plus adapté est la pile • Sur le SPARC, le changement de fenêtre de registres règle le problème

16 Récursivité Factoriel: dec 8, %sp stx %o 7, [%sp+2047+128] dec 8, %sp stx

16 Récursivité Factoriel: dec 8, %sp stx %o 7, [%sp+2047+128] dec 8, %sp stx %o 1, [%sp+2047+128] dec 8, %sp stx %l 0, [%sp+2047+128] dec 8, %sp stx %l 1, [%sp+2047+128] brz, a %o 1, fact 05 mov 1, %o 0 mov %o 1, %l 0 sub %o 1, 1, %o 1 call Factoriel nop %sp-32 %l 1 %sp-24 %l 0 %sp-16 %o 1 %sp-8 %o 7 %sp

17 Récursivité brz, a %o 0, fact 05 nop mulx %l 0, %o 0,

17 Récursivité brz, a %o 0, fact 05 nop mulx %l 0, %o 0, %l 1 srlx %l 1, 32, %l 0 brnz, a %l 0, fact 05 clr %sp-32 %l 1 %o 0 %sp-24 %l 0 mov %l 1, %o 0 %sp-16 %o 1 ldx [%sp+2047+128], %l 1 %sp-8 %o 7 inc 8, %sp ldx [%sp+2047+128], %l 0 inc 8, %sp ldx [%sp+2047+128], %o 1 inc 8, %sp ldx [%sp+2047+128], %o 7 inc 8, %sp fact 05: retl nop %sp

18 La pile sous Solaris • Espace d’adressage d’un processus Système 0 x. FFFFFFFF

18 La pile sous Solaris • Espace d’adressage d’un processus Système 0 x. FFFFFFFF Pile %sp+0 x 7 FF Librairies partagées Biais %sp Système Tas (heap) Données Instructions Système 2047 section. data, . rodata, . bss section. text 0 x 00000000

19 La pile sous Solaris • Le contenu de la pile varie selon l’utilisation

19 La pile sous Solaris • Le contenu de la pile varie selon l’utilisation que le programmeur veut en faire • Si le programmeur utilise l’instruction save • Le système d’exploitation utilise aussi la pile • Si un sous-programme en assembleur est appelé par un programme en langage évolué (par exemple C) • Le code généré par le compilateur modifie le contenu de la pile • Il faut donc respecter certaines règles d’utilisation

20 La pile sous Solaris • Pour résoudre le manque de fenêtres de registres,

20 La pile sous Solaris • Pour résoudre le manque de fenêtres de registres, le programme et les sous-programmes s’allouent un espace sur la pile • Appelé « bloc » • C’est le système d’exploitation qui s’occupe de sauvegarder dans un bloc l’image de tous les registres de la fenêtre utilisée

21 La pile sous Solaris • Allocation d’un bloc %sp %fp %sp save %sp,

21 La pile sous Solaris • Allocation d’un bloc %sp %fp %sp save %sp, -nn, %sp save %sp, -mm, %sp restore

22 La pile sous Solaris • Composition d’un bloc %fp %sp Données locales -m

22 La pile sous Solaris • Composition d’un bloc %fp %sp Données locales -m octets Données dynamiques -n octets Espace de travail -p octets Paramètres additionnels -q octets Registres %o 0 à %o 5 -48 octets Registres %i 0 à %i 7 %l 0 à %l 7 -128 octets • • • Tout programme a accès aux données de son bloc • Grâce au registre %sp, avec des déplacements positifs • Grâce au registre %fp, avec des déplacements négatifs Tout programme a accès aux données du bloc de l’appelant • Grâce au registre %fp avec des déplacements positifs Tout bloc doit être aligné sur une frontière de double mot Le 128 ajouté à la valeur du %sp dans les exemples précédents