IA32 – Utilisation des sous- programmes MI01 Série d`instructions

1
MI01 – A05
1
IA32
IA32
Utilisation des sous
Utilisation des sous-
-
programmes
programmes
St
Sté
éphane Bonnet
phane Bonnet
Poste : 47 93
Poste : 47 93
e
e-
-Mail :
Mail : stephane.bonnet
stephane.bonnet@
@utc.fr
utc.fr
MI01
MI01
MI01 – A05
2
Sous
Sous-
-programmes
programmes
Série d’instructions formulées une
seule fois dans le programme
Peuvent être exécutés un nombre
variable de fois sans avoir à les
répéter dans le code
Entraîne une « Factorisation » de
groupes d’instructions
Économise la place mémoire et le
travail du programmeur !
MI01 – A05
3
Sous
Sous-
-programmes
programmes
L’utilisation de sous-programmes permet
de :
Structurer un programme
Éviter la répétition d’instructions identiques
Réduire le nombre d’instructions du
programme
Réutiliser de séquences d’instructions sous la
forme de bibliothèques de sous programmes
MI01 – A05
4
Sous
Sous-
-programmes
programmes
Appelés par un
programme
d’appel
A la fin du sous-
programme, il
faut revenir à
l’instruction qui
suit l’appel dans
le programme
d’appel.
5000
5002
5006
6000
6002
PUSH EDX
CALL 6000
INC EAX
MOV EAX, 12
RET
Programme
d’appel
Sous
programme
Retour
Appel
MI01 – A05
5
Sous
Sous-
-programmes
programmes
On peut imbriquer
les appels : faire
appel dans un
sous-programme à
un autre sous-
programme.
5000
5002
5006
6000
6002
65A0
PUSH EDX
CALL 6000
INC EAX
MOV EAX,12
CALL 65A0
RET
XOR EAX,EAX
RET
MI01 – A05
6
Sous
Sous-
-programmes
programmes
Un sous programme peut être :
Réentrant :
Il peut être interrompu et appelé par le
programme qui l’a interrompu
Récursif :
Il peut s’appeler lui-même. Il doit alors aussi
être réentrant.
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.
3
MI01 – A05
13
Sous
Sous-
-programmes
programmes
Dans le programme d’appel on aurait pour un appel
lointain :
MOV ESI, OFFSET TABLE
MOV ECX, 12
CALL FAR MAXIMUM
MOV EBX, EAX
Pour un appel court :
MOV ESI, OFFSET TABLE
MOV ECX, 12
CALL NEAR MAXIMUM
MOV EBX, EAX
Comme dans le cas de RET, l’assembleur est capable de
déterminer automatiquement s’il s’agit d’un sous-
programme proche ou lointain. On peut donc écrire
simplement :
CALL MAXIMUM
Arguments
d’entrée
Arguments
de sortie
MI01 – A05
14
Appels de sous
Appels de sous-
-programmes
programmes
MI01 – A05
15
Appel de sous
Appel de sous-
-programmes
programmes
L’appel à un sous-programme se fait par
l’instruction CALL <adresse>
Pour pouvoir revenir au programme d’appel, il
faut conserver l’adresse de l’instruction qui suit le
CALL. C’est l’adresse de retour.
Quand le processeur a lu et décodé l’instruction
CALL, le pointeur de programme (EIP) a été
auto-incrémenté. Il pointe sur l’instruction suivant
le CALL. L’adresse de retour est donc contenue
dans EIP/IP au moment de l’exécution du CALL.
MI01 – A05
16
Appel de sous
Appel de sous-
-programmes
programmes
Lors de l’exécution du CALL, le contenu de EIP
est remplacé par l’adresse de la première
instruction du sous-programme.
Il faut sauvegarder cette adresse de retour. Le
processeur, avant d’exécuter le CALL, va donc
sauvegarder le contenu de EIP dans la pile.
MI01 – A05
17
Appel de sous
Appel de sous-
-programmes
programmes
Avant recherche et décodage du CALL
EIP FFFC ????
FFFA
FFF8
????
????
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
ESP
????
????
????
6000
5001 E8
CALL 6000
6001
6002
6003
5002
5003
00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
MI01 – A05
18
Appel de sous
Appel de sous-
-programmes
programmes
Après recherche (fetch) du CALL
EIP FFFC ????
FFFA
FFF8
????
????
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
????
????
????
EIP
ESP
6000
5001 E8
CALL 6000
6001
6002
6003
5002
5003
00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
4
MI01 – A05
19
5003
Appel de sous
Appel de sous-
-programmes
programmes
Sauvegarde de l’adresse de retour
FFFC ????
FFFA
FFF8
0000
5005
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
????
????
????
EIP
ESP
ESP
6000
5001 E8
CALL 6000
6001
6002
6003
5002 00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
MI01 – A05
20
Appel de sous
Appel de sous-
-programmes
programmes
Exécution du CALL
FFFC ????
FFFA
FFF8
0000
5005
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
????
????
????
EIP
ESP
EIP 6000
5001 E8
CALL 6000
6001
6002
6003
5002
5003
00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
MI01 – A05
21
Appel de sous
Appel de sous-
-programmes
programmes
On a alors la situation suivante :
L’adresse de retour a été sauvegardée
sur la pile
Le pointeur d’instruction pointe sur la
première instruction du sous-
programme.
MI01 – A05
22
Appel de sous
Appel de sous-
-programmes
programmes
On peut avoir d’autres situations sur la pile
en fonction du type d’appel (near ou far) et
du mode de taille d’adresse du processeur
Si on a un appel lointain (far), le processeur
sauvegarde en plus le contenu du registre CS
sur la pile.
Si le mode taille d’adresse est 16 bits, alors
c’est le registre IP (et non EIP) qui est
sauvegardé.
MI01 – A05
23
Appel de sous
Appel de sous-
-programmes
programmes
Pile après un appel FAR 32 bits
FFFC ????
FFFA
FFF8
CS
FFFE
EIP(MSW)
FFF6
FFF4
0000
Segment de pile (SS)
EIP(LSW)
????
????
ESP
????
Adresse de
retour
MSW : Most Significant Word
(16 bits de poids fort)
LSW : Least Significant Word
(16 bits de poids faible)
MI01 – A05
24
Retour de sous
Retour de sous-
-programmes
programmes
Le retour de sous-programme se fait au moyen
de l’instruction RET.
Lorsqu’il lit et décode l’instruction RET, le
processeur s’attend à ce que le pointeur de pile
ESP pointe sur l’adresse de retour.
L’exécution du RET consiste donc à dépiler
l’adresse de retour et à la transférer dans le
pointeur d’instruction (EIP/IP).
RET effectue l’opération inverse de CALL.
5
MI01 – A05
25
Retour de sous
Retour de sous-
-programmes
programmes
Avant le RET
FFFC ????
FFFA
FFF8
0000
5005
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
????
????
????
ESP
EIP
6000
5001 E8
CALL 6000
6001
6002
6003
5002
5003
00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
MI01 – A05
26
Retour de sous
Retour de sous-
-programmes
programmes
Après le RET
FFFC ????
FFFA
FFF8
0000
5005
FFFE
????
FFF6
Segment de code (CS)
FFF4
0000
Segment de pile (SS)
????
????
????
ESP
EIP
EIP
ESP
6000
5001 E8
CALL 6000
6001
6002
6003
5002
5003
00
60
5000
00
Instr.
A3 RETN
00
Suite…
5004
5005
Instr.
Instr.
MI01 – A05
27
Retour de sous
Retour de sous-
-programmes
programmes
On a alors la situation suivante :
Le pointeur de pile contient la même valeur
qu’avant l’exécution du CALL
Le pointeur d’instruction pointe sur l’instruction
qui suit le CALL.
Avant l’exécution du RET, il faut s’assurer
que le pointeur de pile ESP pointe bien sur
l’adresse de retour, quelque soient les
opérations qu’on aurait pu faire sur la pile
dans le sous-programme.
MI01 – A05
28
Remarques
Remarques
La pile n’a pas une taille infinie : on ne peut donc
pas imbriquer infiniment les sous-programmes,
puisque l’adresse de retour est stockée à chaque
fois.
En particulier, lors de l’utilisation de sous-
programme récursifs, il faut prendre garde à ne
pas provoquer de débordement de pile (stack
overflow).
MI01 – A05
29
Passage d
Passage d
arguments
arguments
MI01 – A05
30
Passage d
Passage d
arguments
arguments
Plusieurs solutions pour é
changer des
données entre le programme d’appel
et le sous-programme :
Par zones de mémoire partagées
Par des registres
Par la pile
1 / 11 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !