2
MI01 – A05
7
Sous
Sous-
-programmes
programmes
Pour être utile, un sous-programme doit pouvoir
travailler sur des informations variables en
fonction du contexte
La nature et le nombre de ces informations
doivent être bien définis
Ce sont les arguments d’entrée et de sortie du
sous-programme.
MI01 – A05
8
Sous
Sous-
-programmes
programmes
Un sous-programme est défini par :
–
Un identificateur (adresse physique ou symbolique)
qui constitue son point d’entrée.
C’est l’adresse mémoire sa première instruction.
–
Un descriptif de ses fonctionnalités
–
Ses arguments d’entrée
Signification
Localisation (registres, adresse mémoire ou pile)
–
Ses arguments de sortie
Signification
Localisation (registres, adresse mémoire ou pile)
MI01 – A05
9
Sous
Sous-
-programmes
programmes
Exemple :
–
Nom : MAXIMUM (ou adresse physique 6000)
–
Fonction : calcule le maximum d’une suite de valeurs
rangée dans une table de mots de 32 bits.
–
Arguments d’entrée : adresse et longueur de la table
ESI : adresse de la table
ECX : longueur de la table
–
Arguments de sortie : valeur du maximum
EAX : valeur du maximum
MI01 – A05
10
Sous
Sous-
-programmes
programmes
MAXIMUM PROC NEAR
XOR EAX, EAX ; EAX ←0
CLD ; Auto incrémenter ESI
BOUCLE: CMPSD ; EAX – [ESI] ; ESI ←ESI + 4
JBE SUITE ; EAX ≤[ESI] ?
MOV EAX, [ESI – 4] ; Oui : EAX ←[ESI – 4]
SUITE: DEC ECX ; ECX ←ECX – 1. ECX = 0 ?
JNZ BOUCLE ; Non : aller en BOUCLE.
RET
MAXIMUM ENDP
MI01 – A05
11
Sous
Sous-
-programmes
programmes
Un sous-programme peut résider :
–
Dans le même segment de code que le programme
d’appel
→Il est dit proche (near)
–
Dans un segment de code différent
→Il est dit lointain (far)
Un sous programme proche ne peut être appelé
que depuis un programme d’appel situé dans le
même segment de code.
Un sous programme lointain peut être appelé
par n’importe quel programme d’appel, quelque
soit le segment dans lequel il réside.
MI01 – A05
12
Sous
Sous-
-programmes
programmes
MAXIMUM PROC FAR
…
RETF
MAXIMUM ENDP
MAXIMUM PROC NEAR
…
RETN
MAXIMUM ENDP
• Un sous-programme lointain doit se terminer par RETF
(Return Far)
• Un sous-programme proche doit se terminer par RETN
(Return Near)
• En fait, on utilise RET dans les deux cas : l’assembleur se
charge de le remplacer par l’instruction appropriée en
fonction de la déclaration du sous-programme.