Chapitre 8 Sous programmes
Jean Privat
Université du Québec à Montréal
INF2170 — Organisation des ordinateurs et assembleur Automne 2013
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Sous-programme
Alias
Procédure Fonction Routine Méthode
Principe
Factoriser du code
Mais pas n’importe comment
Composition d’un sous-programme
Interface publique : permet l’imputabilité Signature
Documentation Contrats
API/ABI
Corps
Du code
Peut faire appel à d’autres sous-programmes Peut faire appel à lui même
Passage d’information
Invoquant et invoqué
Peuvent communiquer des informations
Moyens
Paramètres Valeur de retour
Variables globales (mal)
Modification de l’état global (mal) Attention
Documenter toute modification de l’état global
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
En assembleur
Tous en mémoire
Le programme principal Les données
Les sous-programmes
Rappel : Tout n’est que des bits Exécuter un sous programme
On « joue » avec le fonctionnement de l’UCT
Sous-programmes du pauvre
Goto voir là-bas si j’y suis
Décomposer un programme en gros morceaux Chaîner les morceaux avec des BR
Exemple : TP1
Avantage des morceaux On peut mieux isoler
On peut mieux documenter On peut mieux réutiliser Problème
Le retour à l’invoquant n’est pas automatique
Sous-programmes évoluées
Instruction CALL BR avec mémoire
1) Empile le compteur ordinal 2) Branche sur le code
Instruction RET0 Retour du CALL
Dépile et branche sur le sommet de pile
Exercice
Triforce
Écrire un programme qui triforce en colonne
∗
∗∗∗
∗∗∗∗∗
∗
∗∗∗
∗∗∗∗∗
∗
∗∗∗
∗∗∗∗∗
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
La pile
En mémoire aussi
PP indique le sommet de pile (pointeur de pile) Traditionnellement, la pile croît vers le bas
Effet de CALL et RET0
Automatiquement utilisent PP et accèdent à la mémoire
CALL adresse : PP -= 2 ; mem[PP] = CO ; CO = adresse
RET0 : CO = mem[PP] ; PP += 2
RETn : PP += n ; CO = mem[PP] ; PP += 2
La pile
Débordement de pile Stack overflow
Exercice : comment faire déborder la pile ? Débordement dans l’autre sens
C’est idiot mais ça arrive
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Passage simple d’information
Pas de paramètre ou de valeur de retour gratuit Utiliser les registres
Utiliser des variables globales
Attention
La règle des trois D :
Documenter, documenter et documenter Ne pas toucher au reste
Laisser les autres variables globales tranquilles Sauvegarder et restaurer les registres à la main
Exercice : division entière
Entrée
A = dividende X = diviseur
Sortie
A = reste X = quotient
Exercice : chaîne de caractères
Saisie d’une chaîne Idée écrire STRI
Pièges
Quand s’arrêter ? Où stocker ?
Comment ne pas déborder ? Exercice
Le faire
Chaînes de caractères
Saisies de plusieurs chaînes
En général, on ne lit pas une seule chaîne
Piège
Comment ne pas gaspiller la place
Exercice
Écrire un programme qui lit plusieurs lignes puis les affiche dans l’ordre inverse
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Utilisation de la pile
Idée : stocker plus que des adresses de retour Stocker des variables locales
Stocker des paramètres
Stocker des valeurs de retour
Pourquoi
Permettre la réentrance
Permettre les fonctions récursives Simplifier l’ABI (convention d’appel)
Convention d’appel
Convention de l’ABI
Où paramètres et retour sont rangés ? Dans quel ordre ?
Qui nettoie ? Qui sauvegarde ? Langage-OS-plateforme
Conventions courantes Convention C
Convention Pascal Conventions fast-call
Contrôle et adressage de la pile
Le contrôle est limité
SUBSP : décrémente le pointeur de pile (empile) ADDSP : incrémente le pointeur de pile (dépile) MOVSPA : récupérer le pointeur de pile dans A
Adressage dans la pile (s = stack) opérande = mem[PP + spécificateur]
Exemple : LDA 0,s
Empiler/dépiler c’est Déplacer PP
Charger/sauver sur la pile
Exercice
Que fait le code suivant ?
CALL l a
CHARO ’ ! ’ , i STOP
l a : LDA i c i , i
STA 0 , s
RET0 STOP
i c i : CHARO ’∗’ , i STOP
. END
Invoquant et invoqué
L’invoquant
Empile les arguments et résultats CALL (empile l’adresse de retour) Dépile les arguments et résultats
L’invoqué
Empile les variables locales
Utilise les paramètres et variables dans la pile Dépile les variables locales
RETn (dépile l’adresse de retour)
Sous-programme et pile
Principe de documentation
En assembleur, il n’y a pas de signature ni de types Un sous-programme doit être clair sur :
Quel est le format des paramètres et résultats Comment passer les paramètres et récupérer les résultat
Cf. Règle des trois « D »
Sous-programme et pile
Approche compilateur (à la C)
Étant donné une signature C et une architecture, on peut savoir comment est fait le passage des
paramètres au niveau machine (ABI)
Approche humaine
KISS (Keep it simple, stupid) :
Toute complexité non-nécessaire devrait être évitée Registre = simple
Variable globale = simple mais mal
Variable locale dans la pile = assez simple et bien Paramètre ou retour dans la pile = plus compliqué
Variable locale en Pep/8
Equate
Localiser les variables locales de façon relative Utiliser des .EQUATE
Debogueur
Indiquer le type sur les symboles .EQUATE Indiquer les symboles sur les SUBSP, ADDSP et RETn
Variables locales en Pep/8
Exemple
f u n : SUBSP 4 , i ; r é s e r v e #f u n V a r 1 #f u n V a r 2 STA f u n V a r 1 , s ; f u n V a r 1 = A
STX f u n V a r 2 , s ; f u n V a r 2 = X
; . . .
ADDSP 4 , i ; l i b è r e #f u n V a r 1 #f u n V a r 2 RET0
f u n V a r 1 : . EQUATE 2 ; v a r i a b l e l o c a l e #2d f u n V a r 2 : . EQUATE 0 ; v a r i a b l e l o c a l e #2d
Paramètres en Pep/8
Equate aussi
Localiser sur la pile
Attention à l’adresse de retour Invoqueur
Utilise directement les indices
Exercices
Variable locale
Récrire la division en utilisant une variable locale
Paramètres
Récrire la division en passant également les arguments et résultats dans la pile
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Récursivité et réentrance
Définitions
Récursivité : Un sous-programme s’appelle lui-même (directement ou non)
Réentrance : Un sous-programme peut être exécuté alors qu’il est déjà en cours d’exécution (sur la pile)
Problème
On ne peut partager les variables globales
Exercice
Écrire la fonction de Fibonacci
fib(0) = 0 ; fib(1) = 1 ; fib(n) = fib(n-1) + fib(n-2)
Plan
1 Principe des sous-programmes
2 Sous programmes en assembleur
3 La pile
4 Passage simple d’information
5 Passage complexe d’information
6 Récursivité et réentrance
7 Pile et adressage
Adressages dans la pile
Adressages de base i : immédiat d : direct n : indirect x : indexé
Adressages dans la pile s : direct dans la pile sf : indirect dans la pile sx : indexé dans la pile
sxf : indirect puis indexé dans la pile
Direct dans la pile
Définition LDA d,s
opérande = mem[PP + spécificateur]
Utilisation
Paramètre ou résultat passé par copie dans la pile Variable locale simple
Mots ou octets
Indirect dans la pile (deferred)
Définition LDA d,sf
opérande = mem[mem[PP + spécificateur]]
Utilisation
Paramètre ou résultat passé par référence Variable locale de type pointeur
Mots ou octets
Exercice
Écrire un sous-programme qui incrémente un mot passé par référence dans la pile
Indexé dans la pile
Définition LDA d,sx
opérande = mem[PP + spécificateur + X]
Utilisation
Paramètre ou résultat de type tableau passé par copie Variable locale de type tableau
Exercice : écrire un sous-programme qui Alloue et un tableau de 4 entiers dans la pile Initialise le tableau à partir de input
Indirect puis indexé dans la pile
Définition LDA d,sxf
opérande = mem[mem[PP + spécificateur] + X]
Utilisation
Paramètre ou résultat de type tableau passé par référence
Variable locale de type pointeur vers tableau
Exercice
Écrire un sous-programme qui calcule la somme du tableau précédent passé par référence