Info Indus
J.-O.KLEIN
IUT CACHAN
Rév 6
14-09-04
La pile et fonctions
FICHE ii n°3
Un exemple de programme
t
ypedef unsigned short U16;
U16 ma_fonction(U16 c, U16 d);
int main(void) {
U16 a,b,c;
a = 10;
b = 13;
c = ma_fonction (a,b);
return c;
}
U16 ma_fonction(U16 c, U16 d){
return d+c;
}
Traduction en assembleur
main :
LDAB #10
CLRA
PSHD
LDAB #13
JSR ma_fonction
C05F LEAS 2,SP ; SP+2->SP
RTS
ma_fonction:
ADDD 2,SP
RTS
Commentaires
Le premier argument (a=10) est est empilé
(PSHD) par lʼintermédiaire du registre D pour être
transmis à ma_fonction. Le deuxième argument
(b=13) est transmis directement par le registre D.
Lors de lʼappel de sous-programme (JSR) lʼadresse
de retour (ici C05F sera empilée). Après lʼappel de
la fonction, la pile est remise en état (LEAS 2,SP)
avant le retour dans la routine sartup (RTS).
Le premier paramètre est récupéré dans la
pile, le second est déjà dans le registre D, qui sert
aussi de valeur de retour.
SP=15F8
2,SP
15F9 5F
15FA 00
15FB 0A
15FC C0
15FD 37
15FE 00
1602 00
15F8 Adresse de retour dans
la fonction main = C05F
Sommet
de la pile
Adresse de retour dans
la fonction startup = C037
Argument n°1 (=10)
C0
Allure de la pile au moment de lʼexécution de lʼinstruction ADDD 2,SP dans ma_fonction
Avant dʼêtre une partie de la mémoire dʼun
ordinateur, une pile (angl. stack) est dʼabord un
objet abstrait. Cʼest une structure de données à
accès séquentielle dans laquelle la dernière donnée
écrite est la première relue. On parle de structure
de donnée LIFO (Last In First Out) ou de pile par
opposition aux structures de données FIFO (First In
First Out) ou fi les dʼattente ou tampons. Lʼimage de
la pile rappelle la pile dʼassiette. On y prend toujours
lʼassiette du dessus (sommet de la pile, angl. top
of stack) qui est aussi la dernière posée. Dans un
ordinateur, la pile sert de mémoire temporaire. Tous
les CPU (à lʼexception notable de la famille PIC de
Microchip) comportent un registre pointeur de pile
(SP Stack Pointer) , qui pointe en permanence en
mémoire sur le sommet de la pile, (cʼest à dire sur
le dernier élément posé sur la pile). Les éléments
déposés sur la pile sont liés aux fonctions (et aux
interruptions mais nous nʼen parlerons pas encore).
Il sʼagit des adresses de retour, des arguments
dʼappel et des variables locales aux fonctions.
Adresse de retour
Une fonction C et une routine assembleur
sont des sous-programmes. Il sʼagit de fractions
de codes exécutables prêtes à être utilisées par
dʼautres fonctions, grâce à un appel de fonction C
et par une instruction JSR (Jump To Subroutine) en
assembleur. Lʼinstruction JSR doit bien évidemment
modifi er la valeur du registre PC de façon à ce
que la prochaine instruction à exécuter soit la
première du sous-programme, mais elle doit surtout
sauvegarder quelque part lʼadresse de retour à
laquelle le programme devra se poursuivre dès la
fi n du sous-programme. Lʼadresse de retour est donc
sauvegardée (empilée) automatiquement dans la
pile par lʼinstruction JSR. Inversement, lʼinstruction
RTS (Retour de sous-programme) va récupérer
(dépiler) lʼadresse de retour pour la placer dans
le registre PC et reprendre la suite du programme
principal.
Arguments dʼappel
Une fonction C est un sous-programme auquel
il est possible de transmettre des valeurs appelées
arguments dʼappel. A lʼintérieur de la procédure,
les arguments deviennent des paramètres formels.
La fonction appelée doit faire correspondre ses
paramètres avec les arguments qui lui ont été
transmis. Pour cela, le compilateur utilise les
registres autant que possible et la pile quand les
registres ne suffi sent plus. Les arguments sont
empilés avant lʼappel de la fonction(instruction JSR)
dans la fonction appelante. Les paramètres sont
récupéré par la fonction appelée, par lʼintermédiaire
du pointeur de pile (SP).
Données temporaires
En langage C, les variables locales sont
automatiques par défaut (cʼest-à-dire lorsquʼelles
ne sont pas précédé du mot-clé «static» lors de leur
déclaration). Contrairement aux variables statiques,
elles sont créées (et logiquement réinitialisées) à
chaque appel de leur fonction. Ces variables peuvent
utiliser les registres ou la pile lorsque lʼespace dans
les registres ne suffi t plus. Il en va de même lorsque
lʼévaluation dʼune expression complexe nécessite de
mémoriser un résultat intermédiaire.
Quelques instructions HC12
JSR addr : Jump To Subroutine
SP-2 →SP; PC → Mem[SP]; addr→PC
RTS : Return From Subroutine
Mem[SP] →PC; SP+2 →SP
PSHD : Push D
SP-2 →SP; D→ Mem[SP];
LEAS addr : Load Effective Address to SP
& Mem[addr] → SP
donc : LEAS 2,SP ⇔ & Mem[2+SP] → SP ⇔ SP+2→SP
Pile