Vous êtes sur la page 1sur 4

Pile et branchements aux sous-programmes

Définition : La pile est une zone dans la mémoire RAM qui sert à sauvegarder le contexte du
CPU lors d’un branchement à un sous-programme. Un sous-programme (subroutine) est
utilisé pour réaliser une tache dont on a besoin fréquemment, l’utilisation d’un sous-
programme présente les avantages suivants :

• Le programme sera plus structuré et donc plus lisible


• On gagne en espace mémoire (flash)

Le contexte du CPU est constitué par :

• Données temporaires
• Variables locales
• Adresses de retour lors des interruptions ou des appels d s-programmes.

Pendant les interruptions ou les appels des sous-programmes l’adresse de retour (contenu du
registre PC) est stockée (empilée) dans la pile. La taille de la pile est limitée par la taille totale
de la SRAM et de l’usage de cette dernière.

L’accès à la pile se fait par l’intermédiaire du registre SP (stack pointer : pointeur de pile). Ce
registre appartient à l’espace I/O et il est implémenté à l’aide de deux registres SPL,SPH.

Le pointeur de pile SP est initialisé à la dernière adresse de la RAM (High-End-Ram)

L’accès à la pile peut se faire de deux manières :

• Implicite (automatique) : l’AVR utilise automatiquement le pointeur SP pour


sauvegarder et restituer l’adresse de retour lors des interruptions ou des appels de s-
programmes. C’est le cas lors de l’exécution des instructions : CALL, ICALL,
RCALL, RET, RETI
• Explicite : c’est le programmeur qui décide d’accéder à la pile pour stocker (pousser :
PUSH) des données ou les restituer (retirer : POP), c’est le cas lors de l’exécution des
instructions : PUSH et POP

Instruction Pointeur de pile Description


PUSH Décrémenté par 1 Donnés poussée dans la pile
CALL Décrémenté par 2 Adresse de retour poussée
ICALL dans la pile lors des
RCALL interruptions ou appels S-PRGR
POP Incrémenté par 1 Donnée retirée de la pile
RET Incrémenté par 2 Adresse de retour retirée de la
RETI pile lors des interruptions ou
appels S-PRGR

- 21 -
Pile et branchements aux sous-programmes

Exemples :

• PUSH R0 ; pousser R0 dans la pile

PUSH Rd ; 0 ≤ 𝑑 ≤ 31 pousser Rd dans la pile


1001 001d dddd 1111

Opération :

Pile  Rd , SP  SP-1

• POP R1 ; retirer R1 de la pile

POP Rd ; 0 ≤ 𝑟 ≤ 31 retirer Rd de la pile


1001 000d dddd 1111
Opération :

Rd  pile , SPSP+1

• CALL SPR ; appel du sous-programme SPR

CALL K 1001 010k kkkk 111k

kkkk kkkk kkkk kkkk

Opération :

Pile PC+2 , SPSP-2 , PC K ;

• RCALL SPR ; appel du sou programme SPR

RCALL K 1101 kkkk kkkk kkkk

Opération :

Pile PC+1 ; SPSP-2 ; PCPC+1+K

- 22 -
Pile et branchements aux sous-programmes

Exemples d’illustration : .ORG $0000


Exemple1 : LDI R16,5
Soit le programme suivant : RCALL SPR
Le programme : DEC R16

• charge 5 dans R16 HERE : JMP HERE


• se branche au sous peogramme SPR dans lequel il :
charge R17 par 3 SPR : LDI R17,3
Décrémente R17 jusqu’à ce qu’il soit nul BL : DEC R17
Retourne au programme principal à l’instruction sui suit
immédiatement le RCALL (c à d DEC R16) BRNE BL
• Décrémente R16
RET

Lors du branchement à SPR :

• L’adresse de la prochaine instruction (PC=2) est stockée dans la pile en utilisant le


pointeur de pile SP.
• Le pointeur de pile est décrémenté par 2
• Le registre PC est chargé par la valeur 6 (cette valeur est obtenue en ajoutant un saut (4)
à la valeur de PC avant le saut (2)

L’AVR continue l’exécution normalement à l’intérieur du sous-programme SPR jusqu’à la


rencontre de l’instruction RET, à ce moment :

• L’adresse de l’instruction de retour (2) est récupérée (restituée) de la pile et chargée


dans le registre PC
• Le pointeur de pile est incrémenté de 2
• L’AVR poursuit l’exécution dans le programme principal.

Etiquette Adresse (PC) Code assembleur de Code $ de


l’instruction l’instruction
0 LDI R16,5 E005
1 RCALL SPR D003
2 DEC R16 950A
HERE 3 JMP HERE 940C
4 0003
5 LDI R17,3 E013
SPR 6 DEC R17 951A
BL 7 BRNE BL F7F1
8 RET 9508

- 23 -
Pile et branchements aux sous-programmes

Exemple2 : .ORG $0000

Soit le programme suivant : LDI R16,5

L’instruction RCALL a été remplacée par CALL CALL SPR

Le fonctionnement de ce programme est identique à celui DEC R16


du programme précédent.
HERE : JMP HERE
C’est le code machine qui change légèrement
SPR : LDI R17,3

BL : DEC R17

BRNE BL

RET

Etiquette Adresse (PC) Code assembleur de Code $ de


l’instruction l’instruction
0 LDI R16,5 E005
1 CALL SPR 940E
2 0006
3 DEC R16 950A
HERE 4 JMP HERE 940C
5 0003
SPR 6 LDI R17,3 E013
7 DEC R17 951A
BL 8 BRNE BL F7F1
9 RET 9508

Ici lors du branchement à SPR l’instruction CALL ne contient pas un saut qu’il faut ajouter à
la valeur du PC mais plutôt l’adresse elle même du SPR qui sera mise directement dans le
registre PC.

- 24 -

Vous aimerez peut-être aussi