Un sous- programme est un programme fait pour être exécuté à partir d'un autre programme. Il doit donc posséder une adresse physique ou symbolique (identificateur). Il peut posséder un ou plusieurs arguments d'entrée ou de sortie.
Un sous programme possède différentes caractéristiques:
- relogeable, c'est-à-dire que son adresse de base peut se placer n'importe où en mémoire (zone autorisée bien sûr),
- re-entrant, s'il peut être interrompu et relancé par le programme qui l'a appelé,
- récursif quand il peut faire appelle à lui-même.
Le 68000 a sa disposition deux instructions lui permettant de gérer les sous-programmes: JSR et RTS. Comment le microprocesseur s'y prend-t-il pour exécuter un sous-programme et revenir au programme qui l'a appelé?
Il faut rappeler que le registre PC, registre Compteur Programme contient lors de l'exécution d'un programme, l'adresse de la prochaine instruction à exécuter. Juste avant l'exécution du JSR, le PC contient donc l'adresse qui le suit. Cette adresse est sauvegardée sur la pile puis l'exécution du programme continue à l'adresse spécifiée dans l'instruction JSR (le PC contient alors l'adresse indiquée par le JSR).
Lorsque le sous-programme prend fin, c'est- dire lorsque l'instruction RTS est exécutée, la dernière valeur pointée par la pile (celle avant l'exécution du JSR) est transférée dans le registre PC. La pile est donc modifiée. Il faut donc nécessairement que la pile pointe sur cette adresse de retour, d'où la nécessite de dépiler toutes les valeurs empilées avant l'exécution de l'instruction RTS.
Les informations entre le programme principal et le sous-programme sont échangées au travers d'arguments qui sont passés de différentes manières: par registres, par des adresses mémoires, par la pile.
L'exemple qui suit illustre l'appel d'un sous-programme à partir d'un programme principal, le passage de paramètre se faisant au travers du registre D0.
Adresse physique | Instructions | Commentaires |
VAR EQU $2000
|
Adresse mémoire contenant la variable Adresse mémoire de stockage du résultat Adresse de début du sous-prog Adresse de début du prog principal en HEX
|
|
$1000 |
MOVE.B VARIABLE,D0 |
Transfert du contenu de VAR dans D0 |
$1004 |
JSR SOUS_PROG |
Appel du sous-programme |
$1008 |
MOVE D0,CODE_ASCII |
Transfert du contenu de D0 à l'adresse symbolique CODE_ASCII |
$100C |
STOP #$2700 |
Arrêt du programme |
ORG SOUS_PROG
|
Adresse de début du sous prog | |
$2002 |
CMP.B #$0A,D0 |
Comparaison de la valeur de D0 à $0A (D0-$0A) |
$2006 |
BCS SAUT |
On fait un branchement à SAUT si la carry passe à 1 (si D0<$0A) |
$2000 |
ADDI.B #$07,D0 |
Addition de $07 à D0 (D0=D0+$07) |
$200E |
SAUT ADDI.B #$30,D0 |
Addition de $30 à D0 (D0=D0+$30) |
$2012 |
RTS |
Retour au programme principal |
|
END SOUS_PROG | End of assembly |
1. Avant l'exécution de l'instruction JSR:
PC=$001008 A7=$00A00000
2. Après l' exécution de l' instruction JSR: il y a sauvegarde de l 'adresse de retour $001008 sur la pile
PC=$002002 A7=A7-7=$009FFFFC $009FFFFC=$001008
3. Avant l' exécution de l' instruction RTS:
PC=$002012 A7=$009FFFFC
4. Après l' exécution de l' instruction RTS: il y a transfert de la dernière valeur pointée par la pile dans le compteur programme PC
PC=$001008 A7=A7+4=$00A00000