• Aucun résultat trouvé

Chapitre 8 Sous programmes

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 8 Sous programmes"

Copied!
39
0
0

Texte intégral

(1)

Chapitre 8 Sous programmes

Jean Privat

Université du Québec à Montréal

INF2170 — Organisation des ordinateurs et assembleur Automne 2013

(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

(3)

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

(4)

Sous-programme

Alias

Procédure Fonction Routine Méthode

Principe

Factoriser du code

Mais pas n’importe comment

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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

(11)

Exercice

Triforce

Écrire un programme qui triforce en colonne

∗∗∗

∗∗∗∗∗

∗∗∗

∗∗∗∗∗

∗∗∗

∗∗∗∗∗

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

Exercice : division entière

Entrée

A = dividende X = diviseur

Sortie

A = reste X = quotient

(18)

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

(19)

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

(20)

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

(21)

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)

(22)

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

(23)

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

(24)

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

(25)

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)

(26)

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 »

(27)

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é

(28)

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

(29)

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

(30)

Paramètres en Pep/8

Equate aussi

Localiser sur la pile

Attention à l’adresse de retour Invoqueur

Utilise directement les indices

(31)

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

(32)

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

(33)

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)

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

Références

Documents relatifs

5. Sur la première pile uniquement, en utilisant le vocabulaire introduit, indiquer ce qui arrive aux électrons au niveau de chacune des électrodes en précisant celle

4/ Après plusieurs heures de fonctionnement, on constate que la plaque de cuivre s’amincit, tandis que la couleur bleue de la solution de sulfate de cuivre est plus soutenue.. a/

Vers 1800, Volta invente la pile en superposant des pièces constitués de 2 métaux différents séparés par un électrolyte (solution salée).. Rq : On peut s’amuser à varier

En novembre 1801, Volta présente sa pile devant l'Institut de France. En plaçant ses mains aux deux extrémités de la pile de disques, Volta ressent une

 L'échauffement du mélange montre que cette transformation chimique libère de l'énergie thermique ( sous forme de chaleur)

On s’intéresse dans tout ce problème à une suite infinie de lancers d’une pièce équilibrée autour duquel deux joueurs J et J 0 s’affrontent. Le joueur J l’emporte si

Emplacement de la pile.- Pour ˆetre sˆ ur que le programme et la pile n’interf`erent pas, le microprocesseur i8086 a ´et´e con¸cu de telle fa¸con que le code et les

Alors H est