programme et utilise la pile (registre poiteur de pile SP) pour sauvegarder l'adresse de retour.
Sur les microcontroleurs AVR il y a 3 variantes de l'instruction CALL (RCALL, CALL,
ICALL) mais cela ne change en rien ce mécanisme.
L'exemple initial a été compilé, les lignes de ...... représentent des instructions inutiles pour la
compréhension du mécanisme d'appel.
La fonction foo débute à l'adresse 0x00000071 en mémoire programme (Flash)
10: void main (void){
.........
12: foo();
+0069: 940E0071 CALL 0x0071 Call subroutine
13: a=2;
+006B: E082 LDI R24,0x02 Load immediate
+006C: 93800101 STS 0x0101,R24 Store direct to data space
..........................................
@0071: foo
16: void foo(){
.......................................
18: b=3;
+0075: E083 LDI R24,0x03 Load immediate
+0076: 93800100 STS 0x0100,R24 Store direct to data space
.........................
+007A: 9508 RET
Principe d'un appel/retour de fonction (voir schéma) : mémorisation de l'adresse de retour dans la
pile (STACK)
–PC = 0x00000069 : le microcontrôleur arrive a l'exécution de CALL 0x00000071 (appel de la
fonction foo().
–Avant d'avoir entièrement décodé cette instruction, PC = 0x0000006B (en l'absence d'appel
de fonction l'instruction suivante exécutée aurait du être LDI R24,0x02, située à l'adresse
0x00000071)
–Le microcontrôleur exécute l'instruction CALL:
–Il mémorise dans la pile (le pointeur de pile est décrémenté ) l'adresse de LDI R24,0x02
(0x0000 006B) pour pouvoir exécuter cette instruction une fois foo() finie
–Il charge PC avec l'adresse de début de foo 0x0000 0071
–PC = 0x0000 0071, le microcontrôleur exécute les instructions de foo() jusqu'à RET
(instruction assembleur de retour de fonction).
– Le sommet de la pile contient l'adresse de retour (0x0000 006B, adresse de l'instruction qui
doit être exécutée à la fin de l'appel de fonctionnement
–Le microcontrôleur charge PC avec l'adresse contenue en haut de la pile (0x0000 006B)
–PC =0x0000 006B, l'exécution reprend normalement (LDI R24,0x03)
II2/Systèmes embarqués à microprocesseurs 2