Revenir au plan du site


Instructions de sauvegarde et restoration des registres dans la pile


Lorsqu'on appelle une sous-routine, on peut avoir besoin de sauvegarder certains registres. Cette sauvegarde peut se faire indifféremment avant l'appel ou après l'appel même si la logique académique veut que ce soit l'appelé qui protège les registres qu'il va modifier.

Avec l'instruction PUSH, on va empiler un registre dans la mémoire (pointée par l'adresse du registre SP ou stack pointer). On peut empiler autant que l'on veut, enfin tant qu'on a de la mémoire bien sûr! Et pour récupérer ces données? On utilise alors l'instruction POP! Si vous voulez retrouver vos petits, il faut bien sûr dépiler les données dans l'ordre inverse d'empilation. C'est une pile de type LIFO (Last In First Out) ou en français, dernier rentré, premier sorti!

PUSH
PUSH AF ; décrémente SP de 2 et sauvegarde AF dans la pile pointée par SP
PUSH BC ; décrémente SP de 2 et sauvegarde BC dans la pile pointée par SP
PUSH DE ; décrémente SP de 2 et sauvegarde DE dans la pile pointée par SP
PUSH HL ; décrémente SP de 2 et sauvegarde HL dans la pile pointée par SP
PUSH IX ; décrémente SP de 2 et sauvegarde IX dans la pile pointée par SP
PUSH IY ; décrémente SP de 2 et sauvegarde IY dans la pile pointée par SP

POP
Récupérer une données 16 bits depuis la pile

POP AF ; récupère AF dans la pile pointée par SP et incrémente SP de 2
POP BC ; récupère BC dans la pile pointée par SP et incrémente SP de 2
POP DE ; récupère DE dans la pile pointée par SP et incrémente SP de 2
POP HL ; récupère HL dans la pile pointée par SP et incrémente SP de 2
POP IX ; récupère IX dans la pile pointée par SP et incrémente SP de 2
POP IY ; récupère IY dans la pile pointée par SP et incrémente SP de 2

Il n'est pas possible d'écrire ou de lire le registre de pile dans la pile. Mais on peut le faire de façon indirecte

LD (spsav+1),SP ; écrire la valeur de SP dans le microcode de l'instruction suivante
savsp LD HL,#1234 ; la valeur #1234 aura été remplacée par la valeur de SP
PUSH HL ; donc PUSH SP

POP HL ; récupère une valeur de la pile
LD SP,HL ; et la copier dans SP, donc POP SP

Il existe des instructions pour le registre PC mais on leur a donné d'autres noms
CALL $+3 ; équivalent à un PUSH PC pour enregistrer dans la pile l'adresse courante
RET ; équivalent à un POP PC

Pour aller plus loin
Le Z80 ayant un bus de donnée 8 bits, il ne peut réaliser l'écriture ou la lecture mémoire 16 bits qu'en deux fois. Lors du PUSH, on descend dans la mémoire c'est donc logiquement l'octet de poids faible qui est écrit en premier, suivi de l'octet de poids fort. À l'opposé, lors d'une lecture mémoire 16 bits avec le POP, c'est l'octet de poids fort qui est lu en premier, suivi de l'octet de poids faible. Ceci peut avoir une incidence sur le matériel qui décode des valeurs 16 bits.