Programmation modulaire
Nousavonsvu,lorsdel'initiationàlaprogrammation,lanotiondesous-programme(éventuel-
lementsousdesnomsdiversdefontion,proédure...)etenquoilaprogrammationmodulaireest
intéressante.Nousallonsvoirommentmettreenplaelessous-programmesenlangagemahine
dumiroproesseur8086/8088.
18.1 Notions générales
Voyonsquelssontlesproblèmesposésparunprogrammeurpourlamiseenplae d'unsous-
programmeenlangagemahine.
Repéraged'unsous-programme.- Un sous-programme est repéré par un nom dans le as d'un
langageévolué.Dansleasd'unlangagemahineilserarepéréparuneadressededébut.Ils'agit
engénéraldel'adressedesapremièreinstrutionmaispastoujours:ilpeutlui-mêmeontenirdes
sous-programmesqui viennent avantlui; le sous-programmeproprement dit peut-être préédé
de(délarationde)onstantes.
Argumentsd'unsous-programme.-Contrairementauasdeslangagesévolués,unsous-program-
me en langage mahine n'a pas d'arguments. Autrement dit tous les paramètres sont passés
omme variables globales,soit à l'aide desregistres, soit omme emplaement mémoire,soit à
l'aidedelapile quenousétudierons danslehapitresuivant.
Find'unsous-programme.- Il faut évidemment indiquer la dernièreinstrution d'un sous-pro-
gramme,sinontouteslesinstrutionsquisuiventetteinstrution(onsidéréesparnousommela
dernière)seronteetuéesparlemiroproesseur(enallantenpartiulierdanslesous-programme
suivant).Un sous-programmesetermineparuneinstrutionspéialeindiquantqu'ils'agitdela
dernièreinstrution.
Adressederetour.- Lorsqu'onaterminé unsous-programme, lemiroproesseurdoit savoiroù
retourner dans le programme prinipal, autrement dit quelle est l'adresse de retour. Pour
failiterlavieduprogrammeur,etteadresseestengénéralonservéeparlemiroproesseur,au
momentdel'appeldusous-programme,surune pile(etqu'importe eque'estpourl'instant),
puis réupérée, également parle miroproesseur defaçon transparente pour le programmeur,
aumomentduretour;leprogrammeurn'apasàs'en préouper.
Plaed'unsous-programme.- Onpeut plaer le ode d'un sous-programmeoù l'on veut. Si on
neommene pasparleprogramme prinipal, il fautlefaireprééder d'unsautinonditionnel,
equi permet depasserpar-dessusleodedusous-programme.
Appeld'unsous-programme.- Onpourrait appeler un sous-programmepar unsaut mais il est
plusastuieuxd'utiliseruneinstrutionspéiale(quis'oupeentreautredeplaerl'adressede
retoursurlapile),dontl'opérandeestl'adressedusous-programme.
18.2 Cas du miroproesseur 8086/8088
18.2.1 Appel du sous-programme
Langagesymbolique.- Unsous-programmepeutêtreappelégrâeàl'instrutionCALL(appelen
anglais)dontl'opérandeestl'adressedusous-programme:
CALL adresse
Langagemahine.-Uunsous-programmepeutsetrouverdanslemêmesegmentqueleprogramme
qui l'appelle : la valeur du registre IP est alors hangée mais il est inutile de hanger elle
du registre CS. Il peut aussi se trouver dans un autre segment : les valeurs des registres IP
et CS néessitentalors d'être hangées. L'appelpeuts'eetuer de façondirete (en spéiant
l'adresseparuneonstante)ouindirete(l'adressesetrouvedansunregistreouàunemplaement
mémoire):
Dansle as d'unappel intra-segmentairediret,on préise l'adressepar undéplae-
ment(entierrelatif)parrapportàlavaleurenoursdeIP :
| 1110 1000 | déplaement bas | déplaement haut |
L'appel a lieu pour un programme ommençant en [IP℄ + déplaement, où [IP℄ est
l'adressedel'instrution suisuitl'appel.
Dansleasd'unappelinter-segmentairediret,onpréiselavaleurdeIPetégalement
elledeCS:
| 1001 1010 | IP bas | IP haut | CS bas | CS haut |
Dansleasd'un appelintra-segmentaireindiret,onpréiselavaleurdeIP:
| 1111 1111 | mod 010 r/m | | |
Dans le as d'un appel inter-segmentaire indiret, on préise la valeur de IP et de CS,
ontenusdansunemplaementmémoire(un registren'estpassusant):
| 1111 1111 | mod 011 r/m | | |
ave
mod 6 = 11
.Danseas[IP℄et[CS℄sontremplaésparlesontenusdesasesmémoire (16bits)déniesparl'adresseeetiveetl'adresseeetive+2.18.2.2 Retour d'un sous-programme
Langagesymbolique.- Un sous-programme doit ontenir au moins une instrution RET (pour
RETurn ou RETour), indiquant la n du sous-programme (et don le retour au programme
prinipal)defaçoninonditionnelle:
RET
pourleretourd'unsous-programmeintra-segmentaireet :
RETF
(aveFpourFar,lointainenanglais)pourleretourd'unsous-programmeinter-segmentaire.
Langagemahine.-Ilexistedeuxinstrutionsderetour:
leretourourtest odésurunotetpar1100 0011,soitC3h;
18.2.3 Un exemple
Érivonsunprogrammeenlangagemahinequivaherherunentiernaturel
n
,omprisentre 0et255,àl'adresse3000:402etquiplaelavaleurdel'otetfaiblede2 n +n
àl'adresse3000:404.Lealuldeettefontioneetuégrâeàunsous-programmeéritenlangagemahine.
Nous avonsdéjà éritunprogramme enlangage mahine permettantde alulerl'exponen-
tiation
x n. Nous retrouverons ainsi souvent desparties deprogramme déjà érites. Autantles plaerdansdessous-programmeset lesréutiliser.
De façonàréutiliseraumieux notresous-programmed'exponentiation vupréédemment,le
programme prinipal plaera 2 à l'adresse 3000 :400, fera appel au sous-programme de alul
de l'exponentielle,quiplae le résultatàl'adresse &H0004,puisajouterale ontenu delaase
mémoire3000:402àeluideelle d'adresse3000:404.
Leprogrammes'éritdelafaçonsuivanteenlangagesymbolique:
MOV AX,3000
MOV DS,AX
MOV WORD PTR [0400℄,2
CALL EXP
MOV AX,[0402℄
ADD [0404℄,AX
RET
EXP: MOV CX,[0402℄
MOV BX,[0400℄
MOV AX,1
DEBUT: MUL BX
DEC CX
JNZ DEBUT
MOV [0404℄,AX
RET
L'appel,et donleretour,dusous-programmeduprogrammeen langagemahinepeutêtre
ourt.
Traduisons maintenant e programme érit en langage symbolique en langage mahine, en
reopiantpourlesous-programmeleprogrammeérit pourl'exponentiation:
B8 00 30
8E D8
C7 06 00 04 02 00
E8 08 00
A1 02 04
01 06 04 04
C3
8B 0E 02 04
8B 1E 00 04
B8 01 00
F7 E3
49
75 FB
A3 04 04
Codonseprogramme:
C:\COM>debug
-E CS:100 B8 00 30
-E CS:103 8E D8
-E CS:105 C7 06 00 04 02 00
-E CS:10C E8 08 00
-E CS:10E A1 02 04
-E CS:111 01 06 04 04
-E CS:115 C3
-E CS:116 8B 0E 02 04
-E CS:11A 8B 1E 00 04
-E CS:11E B8 01 00
-E CS:121 F7 E3
-E CS:123 49
-E CS:124 75 FB
-E CS:126 A3 04 04
-E CS:129 C3
-R BX
BX 0000
:
-R CX
CX 0000
:02A
-N EXPADD.COM
-W
Eriture de 0002A otets
-Q
Si onplae 3ommedonnée:
C:\COM>debug
-E 3000:402 03
-q
C:\COM> EXPADD.COM
après exéution du programme expadd.om, on vérie que l'on a bien
2 3 + 3 = 11
= Bh à l'emplaementmémoirehoisi:C:\COM>debug
-D 3000:400
3000:0400 02 00 03 00 0B 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
-q
18.3 Historique
Lesmodèlesdealul,dontlamahinedeTuring,utilisentlanotiondesous-programme
Comme nous l'avonsvu au hapitre 15, le premier langage symbolique (EDSAC, 1949) ne
prévoitpasd'instrutionspartiulièrepourmanipulerlessous-programmes.Unsous-programme
est utilisé dès le premier programme proposé, elui sur le alul des arrés. Le méanisme de
sous-programmeest alorsentièrementgéréparl'utilisateur.