• Aucun résultat trouvé

Passage des paramètres à un sous-programme

3. Utilisations de la pile 1 Stockage temporaire

3.3. Passage des paramètres à un sous-programme

Un sous-programme, comme on sait, est un suite d'instructions chargée de réaliser un traitement donnée. Dans beaucoup de cas, ce traitement s'effectue sur la base d'un certain nombre de paramètres que le sous-programme doit recevoir. En langage C, par exemple, les paramètres sont définis dans la déclaration de la fonction :

int Somme (int x, int y)

En assembleur, les sous-programmes n'ont pas de déclaration et c'est au programmeur que revient le choix du mode de passage des paramètres au sous-programme.

Généralement, trois modes sont utilisées : le passage des paramètres dans les registres, dans des variables (cases mémoires) ou dans la pile.

3.3.1. Passage des paramètres dans les registres

C'est la manière la plus simple et la plus rapide. Cependant, elle est limité par le nombre des registres libres au moment de l'appel.

Exemple

Le sous-programme Somme reçoit deux paramètres dans AX et BX et retourne le résultat (qui est une simple addition de AX et BX) dans CX.

Somme: MOV CX,AX

ADD CX,BX

RET

Avant d'appeler ce sous-programme, il faut charger les opérandes dans AX et BX. Après l'appel, on peut utiliser le résultat rendu dans CX :

MOV AX,5h ;Premier opérande dans AX MOV BX,10h ;Second opérande dans BX CALL Somme ;Appel du sous-programme

SHL CX,1 ;Utilisation du résultat retourné dans CX ...

3.3.2. Passage des paramètres dans des cases mémoire

Cette méthode est moins rapide mais peut être utilisée en cas de manque de registres. Elle n'est pas toujours efficace surtout en présence d'un grand nombre de sous-programmes et d'appels mutuels où l'on peut confondre les paramètres d'un sous-programme avec ceux de l'autre. On peut certainement prévoir pour chaque sous-programme des variables indépendantes mais ceci risque d'être pénalisant au niveau de l'espace mémoire.

Exemple

Réécrivons le sous-programme Somme vu précédemment avec ce mode de passage de paramètres (le résultat est toujours retourné dans CX):

Somme: MOV CX,[1000h] ;Premier paramètre ADD CX,[1008h] ;Second paramètre RET

L'appel au sous-programme sera précédé par le chargement des paramètres : MOV [1000h],5h ;Premier opérande dans la case [1000h] MOV [1008h],10h ;Second opérande dans la case [1008h] CALL Somme ;Appel du sous-programme

SHL CX,1 ;Utilisation du résultat retourné dans CX ...

3.3.3. Passage des paramètres dans la pile

limité ici que par la taille de la pile. Un grand avantage de cette méthode est qu'un sous- programme peut appeler un autre sans perdre ses propres paramètres, il peut même s'auto- appeler (sous-programme récursif) sans altérer les paramètres reçus pour chaque appel (ceux-ci restent, évidemment, sauvegardés dans la pile).

Exemple

Avant d'écrire la version de notre sous-programme Somme en utilisant la pile comme moyen de passage de paramètre, nous allons analyser l'appel effectué au programme principal :

MOV AX,5h

PUSH AX ;Premier opérande empilé

MOV AX,10h

PUSH AX ;Second opérande empilé CALL Somme ;Appel du sous-programme 1250h SHL CX,1 ;résultat dans CX

Les deux paramètres sont empilés avant l'instruction CALL. Celle-ci à son tour empile l'adresse de retour qu'on supposera 1250h. L'état de la pile tout à fait au début du sous-programme est le suivant : SS:SP → 50h 12h L'adresse de retour 10h 00h Paramètre 2 05h 00h Paramètre 1

Le pointeur de pile ne devant pas être modifié, on utilise le registre BP pour accéder aux paramètres stockés dans la pile du fait qu'il est associé, lui aussi, au registre de segment SS. Faisons pointer BP sur le sommet de la pile :

MOV BP,SP

En utilisant BP comme référence, l'adresse des différents éléments de la pile sera : BP → SP → 50h 12h L'adresse de retour BP+2 → 10h 00h Paramètre 2 BP+4 → 05h 00h Paramètre 1

D'où, finalement, le sous-programme Somme : Somme: MOV BP,SP

MOV CX,[BP+2] ;Premier paramètre ADD CX,[BP+4] ;Second paramètre RET

Après le retour, la pile contient encore les deux paramètres : SS:SP → 10h

00h Paramètre 2

05h

Puisqu'ils deviennent inutiles, il faut les retirer de la pile juste après le retour du sous-programme en faisant avancer SP de 4 cases :

CALL Somme ;Appel du sous-programme

ADD SP,4 ;Elimination des paramètres de la pile SHL CX,1 ;exploitation du résultat retourné dans CX Remarque

Dans cet exemple, c'est le programme principal qui retire les paramètres de la pile après l'appel (ADD SP,4). Cette convention est adopté en langage C.

En Pascal, c'est le sous-programme qui retire les paramètres de la pile par une instruction de retour particulière : RET n, celle-ci retourne au programme appelant tout en faisant avancer SP de n cases ce qui permet d'éliminer les paramètres. La version Pascal de notre exemple sera donc :

MOV AX,5h

PUSH AX ;Premier opérande empilé

MOV AX,10h

PUSH AX ;Second opérande empilé CALL Somme ;Appel du sous-programme

SHL CX,1 ;les paramètres sont déjà éliminé par RET 4 ! ....

Somme: MOV BP,SP

MOV CX,[BP+2] ;Premier paramètre ADD CX,[BP+4] ;Second paramètre

C H A P I T R E

5

Les interruptions

1.

Introduction

Soit le système à microprocesseur suivant :

Le microprocesseur analyse en permanence les signaux d'entrée : Si (vol = 1) alors appeler la police

Si (ascenseur = 1) alors appeler la compagnie d'ascenseurs (panne d'ascenseur) Si (incendie = 1) alors appeler les pompiers

Programme

Tant que (vol=0) et (incendie=0) et (ascenseur=0) faire { } Au cas où :

Vol=1 : appel de la police

Asc=1 : appel de la compagnie d'ascenseurs Feu=1 : appel des pompiers

Recommencer Inconvénient

Si l'ascenseur se bloque et juste après une incendie se déclare, le microprocesseur sera occupé par l'appel de la compagnie d'ascenseurs alors qu'il est plus urgent d'appeler les pompiers.

En conclusion, il faut que la procédure de la panne d'ascenseur ou celle du vol soit interrompue dès l'apparition d'une incendie pour traiter la procédure du feu.

Solution

On peut glisser entre chaque deux instructions un test du signal d'incendie. Mais cette solution ralentit l'exécution du programme et prend de la place mémoire.

Une autre solution consiste à prévenir matériellement le microprocesseur pour traiter la procédure de l'incendie. Vol Ascenseur Incendie Système à µP Centrale d'alarme

En effet, le 8086 possède 3 entrées appelées entrées d'interruption dont le rôle est d'aviser le microprocesseur matériellement des événements extérieurs.

8086

INTR

NMI RESET

2.

Types d'interruptions

Documents relatifs