Programmation en langage
d'asemblage
Initiation aux langages d'assemblage
Nous avonsétudié les fontionnalités d'un miroproesseur, illustréespar l'étude du i8086
programméenlangagemahine.Ilfautbien avouerqueeladevientunpeupéniblepourérire
unlongprogramme.
On utilise don un langage symbolique très prohe du langage mahine, appelé langage
d'assemblage.Lesprogrammesenlangaged'assemblages'ériventgrâeàunéditeurdetexte,
ommedansleasd'unlangageévoluételquelelangageC.Ondoitensuitetraduireleprogramme
telqu'ilest érit, dit programme soure,en unprogramme objet enlangage mahine, en
utilisantunassembleur.Onneparlepasdeompilateur ommedansleasdulangageC,ar
latradutionétantplussimple,lesprinipesdetradutionnesontdonpaslesmêmes.
26.1 Notion et mise en plae de l'assembleur
Nousavonsvujusqu'iilesréationsdumiroproesseurgrâeàsaprogrammationenlangage
mahine. C'est très intéressantmais trop rudimentairepour travaillersur un programme on-
séquent. Nous avons vu, d'autre part, omment éditer un texteet onservere texte dans un
hier(texte) grâe àunéditeur detexte. Nous avonségalementvu ommentprogrammerun
ordinateurmodernegrâeàunlangageévolué,telquelelangageC.
Nous allonsvoiriiune façonintermédiairede faireentrele langagemahine et unlangage
évolué. On dénit un langage d'assemblage, très prohe dulangage mahine, que l'on peut
onserverdansunhiertexte,ommeleprogrammesoured'unprogrammeenlangageévolué.
Onletraduitenlangagemahinegrâeàunassembleur.
26.1.1 Notion générale
Introdution.-Commepourunlangageévolué,telquelelangageC,pourérireenlangaged'as-
semblage,onommene parérireunprogramme,dit plusexatementprogrammesoure,
dansunlangaged'assemblagepartiulier.
Onutiliseensuiteunlogiielpartiulier,appeléunassembleur,pourtraduireeprogramme
soure en quelque hose de plus ompréhensible par l'ordinateur, appelé programme objet,
quiest unhier binaire('est-à-direqui nedonne riendeompréhensibleaveunéditeurde
texte).
Le programmesoure peut ontenirunsous-programmeou plusieurs,sansontenirun pro-
grammeomplet. On utilise don un autre logiiel, appelé lieur (linker en anglais), pour ras-
semblerlesdiversprogrammesobjetenunprogrammeexéutable,'est-à-direquesonappel
sur lalignedeommande(dans leasd'un interpréteurdeommandetextuel; pardoubleli
sursonine dansleasd'uninterpréteurdeommandegraphique)délenhera l'exéutionde
e qui estdérit dansle programme(soure).Lelieur aégalementpourtâhe deompléterles
adressesnonrésoluesàausedelamodularité.
Diversitédeslangagesd'assemblage.- De même qu'il existe de nombreux langages naturels, il
existedenombreuxlangagesd'assemblage.Ilenexisteaumoins unparmiroproesseur.
Diversitédesassembleurs.-L'assembleurdoittraduireunprogrammesoure,éritdansunlan-
gaged'assemblagedonné,enunprogrammeobjet.Ilyadonaumoinsunompilateurparlan-
gaged'assemblage.Leprogrammeobjetdépenddusystèmeinformatiquesurlequelonsetrouve,
essentiellementdumiroproesseurmais aussi,unpeu, dusystème d'exploitation.Iln'estdon
passusantdeherherunassembleur,ilfaut unassembleuradaptéàteloutelsystèmeinfor-
matique.Deplus,puisquelesassembleurssontsouventdesprogiiels,ilexistesouventplusieurs
assembleurs pourunsystème informatiquedonné, qui sefontonurrene(toutaumoins dans
26.1.2 Les assembleurs pour PC et MS-DOS
Nous allonsnous initier au langage d'assemblage àtraversle langage d'assemblage pourle
miroproesseurIntel 8086,etmêmeplusspéiquementpourunordinateurdit
hh
ompatible
PC
ii
munidusystèmed'exploitationMS-DOS.
Lesdiversassembleurs.-LasoiétéIBMademandéàMirosoftdeonevoirunassembleurpour
le premier IBMPC, tout simplementappelé ASM (pourASseMbler), très prohe dulangage
mahine.Elleommerialiseensuiteuneversionaveplusdediretives,appeléemaroassembleur
ouMASM. Mirosoftdistribuaensuiteet assembleur,dontl'aronymeest quelquefoisrevuen
MirosoftASseMbler.Cetassembleuresttoujoursvenduaveertainessuitesdedéveloppement.
Devantlesuèsdesonompilateurphare,leTurbo-Pasal,lasoiétéBorlandaonçuégale-
mentunassembleur,appelé toutnaturellementTurboAssembler,utilisantlamêmesyntaxeque
MASM,àquelquesvariantesprès,etplusrapide.Iln'estplusvendudepuislemilieudesannées
1990.
DevantlesuèsdeLinuxetledéveloppementdeslogiielslibres,unassembleurlibre,égale-
mentompatibleavelasyntaxedeMASM,appeléNASM(pourNetASseMbler)estdisponible.
Ilexisteune autresyntaxe,dite syntaxeATT, pourlesassembleurs.C'est elleutiliséedans
l'assembleurgas(pourGNUASsembler), eluiutiliséaveLinux.
Notrehoix.-NousutiliseronsiilasyntaxeMirosoftetl'undestroispremiersassembleursités.
26.1.3 Installation de MASM
Nousutiliseronslaversion5.1del'assembleurdeMirosoftpournosexemples.
Obtention.-Onpeutserendresurlesite:
http://www.phatode.net/
liquersur`Download/Compiler'et réupérerMASM5.1.
Miseenplae.-Onobtientunhiermasm510.zipdontonextraitleontenudansunrépertoire
MASM(sousWindows).OnplaeerépertoireetsonontenuàlarainedelaléUSBontenant
notreMS-DOS. OnhangelavariablePATHdanslehier`autoexe.bat':
PATH C:\DOS;C:\MASM\DISK1;C:\MASM\DISK4
Lemieux estderéerunrépertoireASM danslequelonplaeratousnosprogrammesérits
26.1.4 Un premier exemple de programme en langage d'assemblage
Introdution.- Érivonsunprogramme permettant d'aherlalettre `a'àl'éran.Nous allons
voirque nous suivonsà peu prèsles mêmes étapes quepour érireun programme en langage
évolué.
Premièreétape:érireleprogrammesoure.-Leprogrammesoures'éritgrâeàunéditeurde
texte,n'importelequel,parexempleEDITsousMS-DOS.Érivonsdonleprogrammesuivant:
; affihe.asm
;
; affihe la lettre 'a' a l'eran
;
CODESEG SEGMENT
ASSUME CS:CODESEG
DEBUT:
mov dl,'a' ; plae le ode asii de 'a' dans dl
mov ah,2h ; appel de la fontion ms-dos d'affihage
; d'un aratere
int 21h ; affihe le aratere se trouvant en dl
mov ax, 400h ; revient a ms-dos
int 21h
CODESEG ENDS
END DEBUT
sansessayerdeomprendrepourl'instant.
Deuxièmeétape: sauvegarderleprogramme.-Enregistronsleprogrammei-dessus,parexemple
souslenom ahe.asm.
L'extension
hh
asmii
esttraditionnellepourlesprogrammessoured'unlangaged'assemblage.Ceprogrammesourepeutêtreéritaven'importequeléditeurdetexte,parexemplel'édi-
teur de texte EDIT de MS-DOS (en utilisant le menu déroulant aessible par Alt-F), mais
égalementsousWindowsousous Linux et être plaé après oupdans lerépertoireASM de la
léUSB.
Troisièmeétape:l'assemblage.- OnfaitappelaulogiielMASM:
C:\ASM> masm affihe.asm
Mirosoft (R) Maro Assembler Version 5.10
Copyright (C) Mirosoft Corp 1981, 1988. All rights reserved.
Objet filename [affihe.OBJ℄:
Soure listing [NUL.LST℄:
Cross referene [NUL.CRF℄:
5096 + 397341 Bytes symbol spae free
0 Warning Errors
0 Severe Errors
C:\ASM>
Sitoutsepassebienunnouveauhier,dithierobjet,setrouvedanslemêmerépertoire,
aveunnomdépendantduompilateur,iiaffihe.obj.
Quatrièmeétape:lelieur.-Dansleasgénéralilfautlierentreeuxplusieursprogrammesobjet:
C:\ASM> link affihe.obj
Mirosoft (R) Overlay Linker Version 3.64
Copyright (C) Mirosoft Corp 1981-1988. All rights reserved.
Run File [affihe.EXE℄:
List File [NUL.MAP℄:
Libraries [.LIB℄:
LINK: Warning L4021: no stak segment
C:\ASM>
Sitoutsepassebienunnouveauhiersetrouvedanslerépertoire,denomiiaffihe.exe.
Cinquièmeétape: exéutionduprogramme.-Cenouveauhierestengénéralunexéutableet,
enlelançant(defaçonhabituelle,'est-à-direenérivantsonnomsurlalignedeommandepuis
enappuyantsurlatouhederetour),ondevraitvoirapparaître`a'àl'éran.C'estunlogiieldu
systèmed'exploitationqui permet etteexéution,ils'agitduhargeur(loader enanglais):
C:\ASM> affihe
a
C:\ASM>
26.2 Struture d'un programme soure en langage d'assem-
blage
Nousvenonsdevoirommentérireunprogrammesimpleenlangaged'assemblageet om-
ment obtenir un programme exéutable à partir de elui-i. Nous avons érit e premier pro-
gramme en langage d'assemblage sans néessairement en omprendre la syntaxe. Nous allons
revenirsureprogrammeet leommenter.
26.2.1 Instrutions et diretives d'assemblage
Regardonsànouveauleprogrammequenousavonsprisenexemple:
; affihe.asm
;
; affihe la lettre 'a' a l'eran
;
CODESEG SEGMENT
ASSUME CS:CODESEG
DEBUT:
mov dl,'a' ; plae le ode asii de 'a' dans dl
mov ah,2h ; appel de la fontion ms-dos d'affihage
; d'un aratere
int 21h ; affihe le aratere se trouvant en dl
mov ax, 400h ; revient a ms-dos
int 21h
CODESEG ENDS
END DEBUT
Beauoupdelignesduprogrammenoussontimmédiatementompréhensiblesauvudeeque
nousavonsapprisavelelangagesymboliqued'Intel.Ils'agitdeslignesmédianesquenousavons
érites en minusule; seuls les ommentaires, qui suivant les points virgule `;' sont nouveaux.
Ceslignesorrespondentàdesinstrutions.
Uneinstrutionestuneligneenlangaged'assemblagedontlatradutionenlangagemahine
estimmédiate.
Onomprendégalementlerledeslignesblanhesoudeslignesuniquementonstituéesd'un
ommentaire.Lesautreslignes,possédantdesindiationsnouvellespournous,sontdesdiretives
d'assemblage.
Une diretive d'assemblagen'estpaslasimple tradutionsous forme mnémotehnique de
ode mahine.Elleestlà pourindiquer àl'assembleuromment traiterertaineshoses.
26.2.2 Segments d'un programme
La diérene essentielleentre unprogramme en langage d'assemblageet unprogramme en
langagemahine,au-delàdesdiretivesd'assemblage,estertainementlamanipulationexpliite
dessegments
26.2.2.1 Lessegments
Notiondemémoiresegmentée.-Pouréviterlehevauhementdesdiérentesparties(donnéeset
ode), les onepteurs des systèmes d'exploitation multi-tâhes en sont venus à attribuer des
parties bien déterminées dela mémoire vive àhaune des fontions: programme, données et
pile.Onparlealorsdesegmentationde la mémoire.
Casdu8086.- Lemiroproesseur 8086n'est pasvraimentdestiné auxsystèmes d'exploitation
multi-tâhes; lasegmentation y aété introduite, omme nous l'avons vu, pour des raisons de
ompatibilitéavelemiroproesseurpréédentd'Intel, lei8080/85.
Tehniquement, pour unmiroproesseuri8086,unsegmentest une partie delamémoire
de64KiOommençantàuneadressephysiquedivisiblepar16(donuneadressequisetermine
par 0h).Une telle adresse divisible par 16est appelée undébut de paragraphe (en anglais
paragraphboundary).
Programmes.omet .exe.-Ilexiste deuxtypesdeprogrammespourlei8086:lesprogrammes
pouvant tourner également sur i8080/85, dont l'extension est traditionnellement `.om' (lire
point-om),etlesautres,dontl'extension esttraditionnellement`.exe'(lirepoint-exe).
Lesprogrammes.omdoiventtenirentièrementdansunsegment(puisquelamémoireadres-
sabled'uni8080estde64KiO).
Typesdesegments.-Ondistinguequatretypesdesegmentspourunprogramme`.exe':
lessegments de ode (en anglais ode segment) pourles instrutionsen langaged'as-
semblagetraduisiblesimmédiatementenlangagemahine;
lessegmentsdes données(enanglaisdata segment)pourlesdonnées(si);
lesegmentdepile(enanglaisstaksegment)pourleontenutemporaired'informations;
lessegments supplémentaires (enanglais extra segment) sont traditionnellement ré-
servésauxdonnéesinitialisées,leplussouventdeshaînesdearatères.
Tailleet adressed'unsegment.-Lessegmentslogiquespeuventêtreonfondusphysiquement:
ilsut qu'ilsaientlamêmeadresse.
Un segment est limité à 64 KiO. Le ode d'un programme, par exemple, peut ependant
néessiterplusde64KiO.Ilfautalorsdénirplusieurssegmentsdeodeet ondevrapasserde
l'unàl'autre enl'indiquantexpliitement.
Rappelssuradressephysiqueetadresselogique.-Nousavonsdéjàvuquel'adressephysiqued'un
élémentdemémoiredu8086(quiexige20bits)estdéterminée pardeuxnombresde16bits:le
ontenu d'unregistrede segmentetundéalage. Cesdeuxvaleursdéterminentl'adresselogique,
notéeS:DsiSest leregistredesegmentet Dledéalage.
Pourobtenirl'adressephysiqueàpartirdel'adresselogique,ilsut demultiplier leontenu
duregistre desegmentpar 16(ou 10h,il s'agitdon d'un simpledéalage àgauhe)et delui
ajouterledéalage.
Ilfautfaireattentionqu'ilexisteplusieursadresseslogiquesdiérentes orrespondantàune
26.2.2.2 Diretivesde segmentation(1) : dénitiondes segments
Syntaxe.-LesdiretivesSEGMENTet ENDSindiquentàl'assembleurledébut etlanduontenu
d'unsegment:
etiquette SEGMENT [options℄
; ontenu du segment
etiquette ENDS
Les étiquettesdu début et de ndu segment doiventêtre identiques, et êtreun identiateur
permisdulangaged'assemblage.
Options.-LadiretiveSEGMENTpeutêtresuiviedetroistypesd'options,l'alignement,l'assoiation
et lalasse, odéssuivantleformat:
nom SEGMENT align ombine 'lass'
Typed'alignement.- Le type d'alignement indique à quel type d'endroit le segmentdoit om-
mener.Ils'agitengénéraldePARApourindiquerqu'ildoitommenerendébutdeparagraphe,
'est-à-direàuneadressedivisiblepar16,ou10h.Ils'agitd'ailleursdutypepardéfaut.
Typed'assoiation.- Le type d'assoiation indique s'il faut assoier e segment ave d'autres
segmentslorsduliage.Lestypesd'assoiationsontSTACK,COMMON,PUBLIC,ATetNONE.
Ondénit,parexemple,lesegmentdepile delafaçonsuivante:
nom SEGMENT PARA STACK
defaçonàn'obtenirqu'uneseulepilepourleprogramme.
Typedelasse.-Letypedelasse,indiquéentreapostrophesvertiales,estutilisépourregrouper
lessegmentsassoiéslorsduliage.
Onpeut,parexemple,utiliser'ode'pourlesegmentdeode(reommandéparMirosoft),
'data'pourlesegmentdedonnéeset 'stak'pourlesegmentdepile.
Pourreprendrel'exemplepréédent,onérirasouvent:
nom SEGMENT PARA STACK 'stak'
26.2.2.3 Diretivesde segmentation (2): déterminationdes segments
Notion.-Lenomquenousavonsdonnéànotreseulsegmentnousdésignelairementsafontion,
ils'agitd'unsegmentdeode,maisein'estévidemmentpasompréhensibleparl'assembleur.
Ilfautdonune diretivepourindiquerlafontiondehaquesegment.
Deplusilpeutyavoirplusieurssegmentsd'unmêmetype.Ilfautdon,suivantl'endroitoù
onsetrouve,indiquerlairementdequelsegmentons'oupeàemoment-là.
Syntaxe.-LadiretiveASSUMEinitialiselesvaleursdesregistresCS,DS,SSetESenleurattribuant
lenomdusegmentorrespondantgrâeàl'opérateur`:',suivantlemodèlesuivant:
ASSUME SS:stakname, DS:datasegname, CS:odesegname
Onpeutaussiérire:
ASSUME SS:stakname, DS:datasegname, CS:odesegname, ES:NOTHING
pourpréiserqu'onn'utilise pas,dansleasprisenexemple,desegmentsupplémentaire.
Casdessegmentsdedonnéesetdepile.- La diretiveASSUMEest susante pourdéterminerles
segments de ode et les segments supplémentaires. Mais, puisque DS et SS n'aeptent pas la
valeurd'unregistre,ilfautajouter,parexemple,leslignessuivantes:
MOV AX,datasegname
MOV DS,AX
pourdéterminerlesegmentdedonnées.
Emplaementdessegments.- Quels sont les emplaements réels (ou absolus) des segments en
mémoirevive?Ceiestleproblèmeduhargeur,liéausystèmed'exploitation.Cesemplaements
peuventvarierd'unhargementduprogrammeàl'autre.
Bien entendu, on pourrait plaer les segments à la main mais e n'est pas e qui est fait
habituellement.
26.2.3 Présentation d'un programme d'assemblage
26.2.3.1 Commentaires
En langage d'assemblage tout e qui suit le aratère point-virgule `;' jusqu'à la n de la
ligneestunommentairedontl'assembleurnetientpasompte.Onauraitdonaussibienpu
érireleprogrammepréédentsouslaformesuivante :
CODESEG SEGMENT
ASSUME CS:CODESEG
DEBUT:
mov dl,'a'
mov ah,2h
int 21h
mov ax,400h
int 21h
CODESEG ENDS
END DEBUT
26.2.3.2 Indentations
Lesindentationset leslignesblanhesdansleprogrammenesontlàquepourlerendreplus
ompréhensiblepourunêtrehumain.Ellesnesontpasnéessairespourl'assembleur.Onaurait
puérireleprogrammepréédentsouslaformesuivante:
CODESEG SEGMENT
ASSUME CS:CODESEG
DEBUT:
mov dl,'a'
mov ah,2h
int 21h
mov ax,400h
int 21h
CODESEG ENDS
END DEBUT
26.2.3.3 Passageà la ligne
Contrairementàequisepassepourunlangageévolué,telquelelangageC,lamiseenforme
nepeutpasêtretoutàfaitquelonque.Lepassageàlaligne,parexemple,estobligatoireaprès
haque instrution.Nous avons vu quele point-virgule est ledébut d'un ommentaire,elui-i
26.2.3.4 Minusuleet majusule
L'assembleur MASMne fait pasladiérene entre la minusule et lamajusule orrespon-
dante.Nousaurionspuérirenotreprogramme,parexemple:
CODESEG SEGMENT
ASSUME CS:CODESEG
DEBUT:
MOV DL,'a'
MOV AH,2H
INT 21H
MOV AX,4C00H
INT 21H
CODESEG ENDS
END DEBUT
26.2.4 Programme et DOS
Un programmeéritenlangaged'assemblageinteragitavelesystèmed'exploitation.Ilfaut
enpartiulier luipréiserquel estlepointdedépart duodeet equ'ilfaut fairelorsque l'exé-
utionduprogrammeestterminée.
26.2.4.1 Point d'entréedu programme
Notion.- On ne veut pas néessairement ommener par la première ligne de ode. Nous en
verronsdesexemplesnaturelsplustard.Ilfautdonindiquerausystèmed'exploitation,etplus
exatementauhargeur,quelledoitêtrelapremièrelignedeodeàexéuter.
Syntaxe.-Unprogrammeenlangaged'assemblagesetermineparladiretiveENDdeformat:
END identifiateur
oùidentifiateurestl'une des étiquettesoudesnoms deproédure utilisés danslesegment
deode.
Programmesanspointd'entrée.-Lepointd'entréeestfaultatifpuisqueertainsprogrammesne
sontpasdestinésàêtreexéuter.Ils'agitdeportionsdeprogrammeàlierultérieurement.
26.2.4.2 Retour au Dos
Nousavonsvuquenotreprogrammesetermineparl'appelàlafontion4C00hdel'interrup-
tion21h:
MOV AX,4C00H
INT 21H
LegestionnairedeetteinterruptionindiqueommentrevenirauDOS.
26.2.5 Exemples de programmes utilisant plusieurs segments
Donnonsquelquesexemplesdeprogrammesutilisantplusierssegments.
26.2.5.1 Programmeave segmentde données
26.2.5.2 Programmeave segmentde pile
26.2.5.3 Programmeave segmentsupplémentaire
26.2.5.4 Programmeave plusieurssegmentsde ode
26.2.6 Struture d'un programme
Conformément à l'exemple que nous venons de voir et de ommenter, un programme est
omposé:
-d'instrutions,tradutionsimmédiatessousformemnémotehniquedesinstrutionsdulan-
gagemahine;
-deommentaires;
-dediretivesd'assemblages.
Lastrutured'unprogrammeenlangaged'assemblageMirosofti8086estlasuivante:
page 60, 132
TITLE essai.asm squelette de programme
;---
STSEG SEGMENT
DB 64 DUP (?)
STSEG ENDS
;---
DTSEG SEGMENT
; delaration des variables ii
DTSEG ENDS
;---
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
;
; ode proprement dit ii
;
mov ax,400h ;revient a ms-dos
int 21h
MAIN ENDP
CDSEG ENDS
26.2.7 Dénition simpliée des segments
Lafaçondontnousavonsdénilessegmentsdansnotreexempledeprogrammeestmaintenant
appeléeladénitionomplètedes segments.Eneet,d'autresdiretivesontétéintroduites
plus tard, e qui donne lieu à la dénition simpliée des segments, disponible depuis la
version5.0deMASMetlaversion1deTASM.
Exemple.-Leprogrammei-dessusserééritdelafaçonsuivanteaveladénitionsimpliéedes
segments:
; affihes.asm
; affihe la lettre 'a' a l'eran
.model small
.stak 100h
.data
DATA1 DB 52h
DATA2 DB ?
.ode
MAIN :
mov dl,'a' ;plae le ode asii de 'a' dans dl
mov ah,2h ;appel a la fontion ms-dos d'affihage
;d'un aratere
int 21h ;affihe le aratere qui se trouve en dl
mov ax,400h ;revient a ms-dos
int 21h
end MAIN
Modèledemémoire.-Onommeneparindiquerlemodèledemémoire,'est-à-direlenombre
desegmentsphysiquesdistintsutilisés.
Les options pour le modèle de mémoire sont SMALL, MEDIUM, COMPACT, LARGE et
HUGE:
SMALLMODEL:utilise64KiOdemémoirepourleodeet64KiOpourlesdonnées.
C'estlemodèledemémoireleplussouventutilisé.
MEDIUM MODEL: lesdonnéesdoiventtenirdans 64KiOdemémoiremaisle ode
peutouperplusde64KiO.
COMPACT MODEL :est l'opposé dumodèle MEDIUM. Le ode doittenir dans64
KiOdemémoiremaislesdonnéespeuventouperplusde64KiO.
LARGE MODEL:leodeetlesdonnéespeuventouperplusde64KiOmaisauun
ontenudevariable(yomprisdetableau)nepeutdépasser64KiO.
HUGE MODEL:leodeetlesdonnéespeuventouperplusde64KiO,yomprisle
ontenud'uneseulevariable.
Ilexisteunautremodèledemémoire,lemodèleTINY.Laapaitémémoiretotaleutilisée
pourleodeetlesdonnéesnepeutpasdépasser64Ko.Cemodèleestliéauxprogrammes`.om'.
Indiationdumodèle.-Lemodèleestindiquégrâeàladiretive.MODELavel'undesmodèles
pourparamètre.Dansnotreexemplenousavions:
.model small
CettediretiveengendreautomatiquementlesdiretivesASSUMEnéessaires.
Dénition dessegments.-Ladénitionsimpliéedessegmentsutilisetroisdiretivessimplespour
dénirhaundessegmentsCS,DSetSS,àsavoir.CODE",.DATA"et .STACK":
Pourlapile,ilsutd'indiquerlaapaitémémoiredeelle-ienKiO.Dansnotreexemple
nousavions:
.stak 100h
ou:
.stak 64
Ladélarationdesvariablessefaitsuivantdesrèglesquenous verronsplustardentre la
diretive:
.data
etladiretive:
.ode [nom℄
Leodeproprementdit suitettedernièrediretive.
Lesnomsdeessegmentssont,pardéfaut,STACK,_DATAet_TEXT.Onpeutremplaerlenom
pardéfautdusegmentdeode.
Lataille pardéfautdelapileestde1024otets.
Formed'unprogramme.- Un programmeaveladénition simpliéee dessegmentsseprésente
donsouslaformesuivante:
; ommentaires eventuels
.model small
.stak 100h
.data
; delaration des variables ii
.ode
MAIN :
;
ode proprement dit ii
;
mov ax,400h ;revient a ms-dos
int 21h
26.2.8 Dénition des segments
26.2.8.1 Dénitiondusegmentde pile
Ladénitiondusegmentdepileontientseulementuneligne:
DB 64 DUP (?)
Cette diretiveréserveii 64otets de mémoirepour lapile. Nous expliqueronsplus en détail
lesdiretives`DB', `DUP' et `(?)' aumoment dela délarationdes variables.Remarquonsdès
à présent que, sauf indiation ontraire, les nombres sont en base dix et non en base seize,
ontrairementàdebug.
26.2.8.2 Dénitiondusegmentdes données
Un peu de la même façon que pour la dénition du segment de pile, nous délarons ii
deux variables. Les étiquettes `DATA1' et `DATA2' orrespondent à leurs noms; e sont des
identiateurs. Commenous leverrons`DB' est le type,il s'agit ii d'otets(Dene Byte). La
première variable est initialisée à la valeur 52 en hexadéimal alors que la seonde n'est pas
initialisée.
26.2.8.3 Dénitiondusegmentde ode
Proédures.-Leodeestunesuitededénitiondeproédures,'est-à-diredesous-programmes.
Dansnotreexemple,ilyaune seuleproédure,laproédure`MAIN'.
Syntaxe.- Une proédure ommene par une étiquette (qui est un identiateur non utilisé
pour autre hose), suivie de la diretive `PROC' (pour PROCedure) et éventuellement d'op-
tions(omme iide `FAR') et setermine parla même étiquettesuivie de `ENDP' (pour END
Proedure):
proname PROC [options℄
.
.
.
proname ENDP
Pointd'entréeduprogramme.- L'assembleur doit savoiroù ommener, 'est-à-dire par quelle
proédure ommener (qui fait éventuellement appel à d'autres). Cei est indiqué par la der-
nièreligne duprogramme qui omprend ladiretive`END' suivi de l'étiquette dela proédure
prinipale.
Lesystèmed'exploitationDOS exigequelaproédureprinipaleait l'option`FAR'.
Options.- LesdeuxoptionsprinipalessontFAR(sileodedelaproéduren'estpassituédans
26.3 Les hiers utilitaires de l'assembleur
Nousavonsvuquel'assembleurfournitunhier.objetunhier.exe,lehierexéutable
étant le plus important pour nous. L'assembleur peut aussi fournir deux autres hiers : un
listing reprenant le programme soure, sa tradution en langage mahines et quelques autres
renseignementsetunhier de référenesroisées.
26.3.1 Listing
26.3.1.1 Obtention
Obtentiondulisting.-NousavonsvuqueMASMnousdemande lenom duhierdelisting. Si
onutilisel'optionpardéfaut,`NUL.LST',onn'obtientrien.Si onmetaffihe.lst,onobtient
unnouveauhier,portantenom.
Exemple.-Dansnotreas, leontenudeehierest:
Mirosoft (R)MaroAssembler Version5.10 2/3/13 16:02:26
Page 1-1
;affihe.asm
;
;affihela lettre 'a'al'eran
;
0000 CODESEG SEGMENT
ASSUME CS:CODESEG
0000 DEBUT:
0000 B2 61 movdl,'a' ;plae leode asiide 'a'dans dl
0002 B4 02 movah,2h ;appel dela fontionms-dos d'affihage
;d'un aratere
0004 CD 21 int21h ;affihe learatere se trouvantendl
0006 B8 4C00 movax,400h ;revient ams-dos
0009 CD 21 int21h
000B CODESEG ENDS
ENDDEBUT
Mirosoft (R)MaroAssembler Version5.10 2/3/13 16:02:26
Symbols-1
SegmentsandGroups:
Name Length Align Combine Class
CODESEG .... ... 000B PARA NONE
Symbols:
Name Type Value Attr
DEBUT ... ... LNEAR 0000 CODESEG
CPU ... ... TEXT 0101h
FILENAME ... ... TEXT affihe
VERSION.... ... TEXT 510
18 Soure Lines
18 Total Lines
7 Symbols
0Warning Errors
0Severe Errors
Commentaires.- 1
o
) Le listing est supposé être envoyé sur une imprimante (lister en anglais),
d'où sonnom et laprésene d'unertain nombrede aratères d'éhappementnon néessaire-
mentompréhensiblesparunéditeurdetextes: lestabulationset surtoutlepassageàlaligne
souslaformed'unCTRL-L.IiilyauntelpassageàlaligneavantledeuxièmeMirosoft,dont
nousn'avonspastenuompte.
2
o
)Chaquepageommenepardeuxlignesdelaforme:
Mirosoft (R) Maro Assembler Version 5.10 2/3/13 16:02:26
Page 1 - 1
indiquantlenomdel'assembleur,saversion,ainsiqueladateetl'heuredel'assemblagepourla
premièreligne,lenumérodepagepourlaseondeligne.
3
o
)Ilyavisiblementdeuxsortesdepages:lespremières(uneseuledansnotre
exemple)reprennentleodeavedesindiationssupplémentaires,lesseondes(pagesdénommées
Symbols)ommententlessymbolesutilisésenlangaged'assemblage.
4
o
) Les premières pages ont visiblement trois olonnes : la première olonne
indique le déalage del'adresse en mémoirevive dans lesegmentadéquat, la seonde olonne
indiquele ontenu de et emplaementen hexadéimal, latroisième olonneomprend le ode
soure.
5
o
)Nousavonsdéjàvuommenttraduirelesinstrutionsenodemahine.Ily
adonpeuàdiresurlesegmentdeode.
6
o
) Auune diretive ne produit de ode, ni même d'emplaement mémoire
nouveau.C'estnormalpuisquee sontdesmessagesàl'assembleur.
7
o
)Les pagesonernantlessymbolesdonnentdes renseignementssurlesseg-
ments,lesproéduresetlessymboles.
8
o
)Onrappellelenomdehaquesegment,iln'yenaqu'unseulii,salongueur,
lafaçondontildoitêtrealigné etsalasse.
Lessegmentsnesontpaslistésdansl'ordredeleurdénitionmaisdansl'ordrealphabétique.
Depluslesnomssontsystématiquementenmajusule.
9
o
)Suitlatabledesproédures.Celle-iestompréhensible:ondonnehaque
nomdeproédure (dansl'ordrealphabétique),sontype(iiL NEARpourproédure prohe),sa
valeur('est-à-direl'adresseparrapportaudébutdusegmentdeode),sonattribut,'est-à-dire
26.3.1.2 Diretivesde listing
Onpeututiliserdeuxdiretivespourformater lelisting.
Caratéristiquesdelapage.- Au début duprogramme, ladiretivePAGEpermet dedéterminer
lenombremaximumdelignessurune pageetlenombremaximumdearatèressuruneligne.
Sasyntaxeest :
PAGE [longueur℄[,largeur℄
ParexemplePAGE 60,132donne60lignesparpageet 132aratèresparligne.
PardéfautonaPAGE 50,80.
Si onveutforer lelistingàproduire unenouvellepageàunendroit(du soure)donné,on
utilisetout simplementladiretivePAGE(sans paramètres)àetendroit.
TITRE.-Si onutilise:
TITLE text [omment℄
equi suitTITLEseraérithaquedeuxièmelignedepagedulisting.
26.4 Forme d'un programme en langage d'assemblage
26.4.1 Identiateurs
Notion.-Nousavonsvulanotiond'identiateurlorsdel'étuded'unlangageévolué(lelangage
C,parexemple).Cesidentiateursnousserventpournommerlesvariables,lessous-programmes,
lesonstantes,...
Iln'y apasd'identiateurenlangagemahine (iln'y aquedesadresses)maison aintérêt
àenutiliserenlangaged'assemblage.
Remarque.-Rappelonsquelelangaged'assemblageestuneréationtotalementlibre.Sasyntaxe
dépenddondel'assembleurqui estutilisé. NoussuivonsiilesrèglesdeMirosoft,onepteur
deMASM,règleségalementsuiviesparTASMetNASM.
Alphabet .-L'alphabet dulangage d'asssemblageMirosoftdu i8086est onstituédesvingt-six
lettres de l'alphabet latin, en minusule ou majusule, des dix hires de `0' à `9'et des inq
aratères spéiaux suivants: le point d'interrogation `?', le point `.',le `', le blan souligné
`_' et le dollar`$'. L'assembleurne faitpas dediéreneentre une minusule et lamajusule
orrespondante.
Identiateur.-Lesidentiateurssontlesmotsdemoinsdetrente-et-unaratèressurl'alphabet
(247depuisMASM6.0)i-dessusrépondantauxrèglessuivantes:
-e nesontpasdesmotsrérvés;
-lepremieraratèren'estniunhire,niunpoint.
Motsréservés.-Lesmotsréservéssontlessuivants:
Noms de registres :
AH AL AX BH BL BP BX CH CL CS CX DH DI DL DS DX EAX EBP EBX ECX
EDI EIP ES ESI FS GS IP SI SP SS
Mnémonymes d'instrutions :
AAA AAD AAM AAS
ADC ADD AND ARPL
BOUND BSF BSR BTn
CALL CBW CDQ CLC
CLD CLI CLTS CMC
CMP CMPSn CMPXCHG CMPXCHG8B
CWDn DAA DAS DEC
DIV ENTER ESC HLT
IDIV IMUL IN INC
INSn INT INTO IRET
JA JAE JB JBE
JCXZ JE JECXZ JG
JGE JL JLE JMP
JNA JNAE JNB JNBE
JNE JNG JNGE JNL
JNZ JO JP JPE
JPO JS JZ LAHF
LAR LDS LEA LEAVE
LES LFS LGDT LGS
LIDT LLDT LMSW LOCK
LODSn LOOP LOOPE LOOPNEn
LOOPNZn LOOPZ LSL LSS
LTR MOV MOVSn MOVSX
MOVZX MUL NEG NIL
NOP NOT OR OUTn
POP POPA POPAD POPF
POPFD PUSH PUSHAD PUSHF
PUSHFD RCL RCR REN
REP REPE REPNE REPNZ
REPZ RET RETF ROL
ROR SAHF SAL SAR
SBB SCASn SETnn SGDT
SHL SHLD SHR SHRD
SIDT SLDT SMSW STC
STD STI STOSn STR
SUB TEST VERR VERRW
WAIT XADD XCHG XLAT
XOR
Diretives :
$
∗ + −
. / =
?[ ℄
ALIGN ASSUME BYTE COMM
COMMENT DB DD DF
DOSSEG DQ DS DT
DW DWORD ELSE END
ENDIF ENDM ENDP ENDS
EQU EVEN EXITM EXTRN
EXTERN FWORD GROUP IF
IF1 IF2 IFB IFDEF
IFDIF IFE IFIDN IFNB
IFNDEF INCLUDE INCLUDELIB IRP
IRPC LABEL LOCAL MACRO
NAME ORG PAGE PROC
PUBLIC PURGE QWORD RECORD
REPT REPTRD SEGMENT STRUC
SUBTTL TBYTE TITLE TWORD
UNION WORD
.186 .286 .286P .287
.386 .386P .387 .8086
.8087 .ALPHA .CODE .CONST
.CREF .DATA .DATA? .ERR
.ERRDIF .ERRE .ERRIDN .ERRNB
.ERRNDEF .ERRNZ .FARDATA .FARDATA?
.LALL .LFCOND .LIST .MODEL
.OUT .RADIX .SALL .SEQ
.SFCOND .STACK .TFCOND .TYPE
.XALL .XCREF .XLIST
Opérateurs :
AND BYTE COMMENT CON
DUP EQ FAR GE
GT HIGH LE LENGTH
LINE LOW LT MASK
MOD NE NEAR NOT
NOTHING OFFSET OR PTR
SEG SHL SHORT SHR
SIZE STACK THIS TYPE
WHILE WIDTH WORD XOR
Identifiateurs prédéfinis :
Data Model
26.4.2 Syntaxe d'une instrution de langage d'assemblage
Syntaxe.-Laformegénéraled'uneinstrutiondulangaged'assemblage(Mirosoft,rappelons-le)
estonstituéedesquatrehampssuivants:
[Étiquette :℄ Opération [Opérandes℄ [;Commentaire℄
oùlesrohets`['et`℄'indiquentquelehampenquestionn'apparaîtpastoujours.Àpartdans
unelignedepurommentaire,lehampopérationesttoujoursprésent.
Le nombre d'opérandes (zéro, un ou deux) dépend de l'opération. Lorsqu'il y a deux opé-
randes, eux-i sont séparéspar une virgule`,'. L'espae après la virgulen'est pas obligatoire
maisilaméliorequelquefoislalisibilité.
Ilyaunmaximumde132aratèresparligne(512depuisMASM6.0).
Exemples.-Érivonsquelquesinstrutions:
L1 : mp bx, x ;ompare bx tousleshampssontpresents
add ax,25 operation etdeux operandes
in bx operation etun operande
ret operation seule
;ommentaire ommentaireseul
Remarque.- L'étiquette, l'opération, les opérandes et les ommentaires peuvent ommener à
n'importe quelleolonne mais, pour des raisons de lisibilité, toutes lesétiquettes ommenent
en généralàla mêmeolonne. Ilenest de mêmede touteslesopérations,detouslespremiers
26.4.3 Les nombres entiers en langage d'assemblage
Basesutiliséesenlangaged'assemblage.- Nous avons vu que, dans le langage symbolique de
debug,onnepeututiliserquelabaseseize.Enlangaged'assemblage,ilesttraditionneld'utiliser
les entiers exprimés en base dix (numération déimale) ertesmais aussien base deux(numé-
rationbinaire,quiorrespondaulangagemahine)ouenbaseseize(numérationhexadéimale),
bienentenduparequeettedernièrebaseest liéeàlabasedeuxenpluslisiblepournous.
Érituredesentiers.-Poursavoirdansquellebaseestexpriméunentieronutiliselesonventions
suivantesenlangaged'assemblageMASM:
- unentierenbase dix est érit de lafaçonhabituelle, parexemple100 ou23; onpeutlui
ajouterlesuxe`d'pourinsister,parexemple100d;
-unentierenbasedeuxestéritenlefaisantsuivredusymbole`b'ou`B'(évidemmentpour
binaire,oubinary enanglais),parexemple100bou101B;
-unentierenbaseseizeestéritenutilisantleshiressuessifs`0',`1',`2',`3',`4',`5',`6',
`7',`8',`9',`a'ou`A'(pourdix),`b'ou`B'(pouronze),`'ou`C'(pourdouze),`d'ou`D'(pour
treize), `e' ou `E' (pour quatorze) et `f' ou `F' (pour quinze)suivi d'un `h' ou d'un `H' (pour
hexadéimal),parexemple100h,23hou1ah.
Remarque.- Ily aambiguïté entre leregistreah et l'entierhexadéimal ah. Pour leverelle-i,
onfait prééderl'entierduhire`0',en l'érivantdon 0ah.Plus généralementune onstante
entièreommençantparundeshires`A' à`F'peutêtreonfondueaveunidentiateur.On
onvientdondelafaireprééderduhire`0'.
26.4.4 Initialisation d'un registre ave un aratère
Syntaxe.-Onpeutinitialiserunregistreaveunaratère.Pourela,onutilisel'instrutionmov
maissoureestunaratèreASCII plaéentreapostrophes(apostrophesvertiales,lamêmeà
droiteet àgauhe).
Exemple.-L'instrution :
mov ax, 'b'
permetdeplaerlearatère`b'dansleregistreax.
Remarque.- En faite n'estpaslearatère `b'qui estplaé dansle registremais unentieren
binaire,sonode ASCII.L'assembleuresthargédeette tradution.
Quelssontlesaratèrespermis?.-Lejeudearatèresestdéniparleodehoisi.Enequi
26.4.5 Aès à la mémoire vive grâe aux variables
Notiondevariable.- Jusqu'àmaintenantnousavonsutilisélesregistres,'est-à-direlamémoire
dumiroproesseurlui-même,pouronserverdes données.Pourbeauoup d'appliations,nous
avonsbesoindeplusd'emplaementmémoire;onutilise alorslamémoirevive.
Nousavonsdéjàvuommentaéderàlamémoireviveenutilisantdesadressesabsoluesen
langagemahine.Cettefaçondefairen'estpastoujourssatisfaisante,arnousrisquonsd'aéder
à un emplaement mémoire réservé pour autre hose, d'où l'intérêt d'utiliser des variables
(dont l'emplaement mémoire exatest attribué par le système d'exploitation au moment du
hargementduprogrammeexéutable).
Lesvariablesenlangaged'assemblage.- Lesvariablessontdénies pardesdiretives.Lesrègles
varientdond'unassembleuràl'autre.Unefoisdeplusnousnousintéresseronsiiauxdiretives
Mirosoftpourladélarationdesvariablesenlangaged'assemblagepourlei8086,devenuesun
desstandardsdefait,suivi parMASM,TASMetNASM.
Emplaementdeladélarationd'unevariable.-Nousavonsdéjàvu,lorsdel'étudedessegments,
quelesvariablessedélarentdanslesegmentdesdonnées.
Nomd'unevariable.- Toute variable à laquelle on fera référene possède un nom, qui est un
identiateurnonutilisépourautrehose.Nousavonsdéjàvulesrèglesdeformationdesiden-
tiateurs.
Typesdesvariables.-Ilyainqtypessimplesdevariables,suivantlaplaeoupéeenmémoire:
-letypeotetDB (pourDeneByte)qui oupeunotet;
-letypemotDW(pourDeneWord)qui oupedeuxotets;
-letypemotdoubleDD (pourDeneDoubleword)quioupequatreotets;
-letypemotquadrupleDQ (pourDeneQuadword)quioupehuitotets;
-letypedixotetsDT(pourDeneTenbytes)quioupedixotets.
MASM6.0aaussiintroduitlestermesBYTE,WORD,DWORD,QWORDetTWORDrespetivementpour
esdiretives.
Délarationd'unevariable.-Lasyntaxedeladélarationd'unevariableestlasuivante:
NOM TYPE VALEUR Commentaire
oùNOMest lenomdela variable,TYPEl'undesinqtypesi-dessuset VALEURlavaleurinitiale
Initialisationdesvariableslorsdeladélaration.-Sionneveutpasinitialiserlavariablelorsde
ladélaration,ilsut demettrelesymbole`?'.Sinononpeutmettresoit unentierendéimal
(suiviéventuellementde`D'ou`d'),enbinaire(suivide`B'ou`b'),enotal(suivide'Q'ou'q')
ouenhexadéimal(suivi de`H'ou`h'), soitunmotplaé entre apostrophesvertialesouentre
guillemetsvertiaux.
Bienentendulavaleurdoitêtreompatible aveletype(donlatailledelamémoire).
Onaparexemple:
DATA1 DB ? ; variable non initialisee
DATA2 DB 23 ; deimal
DATA3 DB 35d ; deimal
DATA4 DB 100101b ; binaire
DATA5 DB 15h ; hexadeimal
DATA6 DB 0A8h ; hexadeimal
DATA7 DB 'a' ; aratere
DATA8 DW 961 ; deimal
DATA9 DW 'ah' ; arateres
DATA10 DD 2314 ; deimal
DATA11 DD "L'e" ; interet des apostrophes
Puisque leslettres`D'et `B'sontàlafois deshireshexadéimaux etdesindiationsde base
denumération,MASM6.0aintroduitleslettresT(pourTen)etY(pourbinarY)pourlesbases
dixet deux,respetivement.
Tableaux.-Onpeutaussidénirdesvariablesdetypetableau.
-1
o
)Lapremièreméthodeonsisteàinitialiserunevariabled'untypesimpleaveunontenu
plusgrandqueeluiquiestpermisapriori:
DATA1 DB '2438Bonjour'
éventuellementenutilisantdesvirgulessilesformatssontdiérents:
DATA2 DB 12, 23, 54h, 1010b, 'Bonjour'
Onesttoutefoislimité parlalongueurdelaligne.
- 2)Pourremplirletableau ave unertainnombrede foislamêmevaleurd'otet, onpeut
utiliserladiretiveDUP(pourDUPliate) :
DATA DB 7 DUP('a')
quidélareuntableaude7otets,haqueotetétantinitialiséparlalettre'a'.
Lafaçonlaplusproprededélareruntableau(d'otets)estévidemmentlasuivante:
TAB DB 500 DUP(?)
quiréservedelaplaepouruntableaude500otets,noninitialisés.
- 3
o
) Laréférene aupremier élémentd'un tableau, en faitelui denuméro 0,sefait grâe
aunomdeetableau.Parexemple:
mov al, DATA1
plaeralearatère`2'dansal.
Onutiliselesymbole`+'plusune onstantepourlesautresvaleurs.Parexemple:
mov al, DATA1+2
Adresseabsolued'unevariable.- En langage mahine, il faut spéier l'adresse absolue d'une
`variable',en fait ledéalage. Nousavonsremarqué que elapeut êtredangereux et qu'ilvaut
mieux laisser faire lesystème d'exploitation. C'est e qui sepasse en généralave un langage
d'assemblage.
Ilarriveependantquel'onveuilleuneadressepartiulière(asdelamanipulationdespéri-
phériques,parexemple).Onpeutalorsspéierl'adresseabsolueenutilisantladiretiveORG
(pourORiGin).Parexemple:
ORG 101h
DATA DB 'a'
plaera(leodeASCII de)lalettre`a'àl'adresse101h.
Connaissanedel'adresseabsolue.-Engénéralonneonnaîtpasl'adresseabsolued'unevariable.
Sionavraimentbesoindel'adresse(enfaitledéalagedupremierotet)d'unevariable,onpeut
utiliserladiretiveOFFSET. Parexemple:
mov si, offset DATA1
plael'adresse(d'oset)delavariableDATA1dans leregistreSI.
26.4.6 Les onstantes en langage d'assemblage
Notiondeonstanteenlangaged'assemblage.- En langage évolué une onstante est une va-
riable,qui oupeun emplaementde lamémoirevive,dont onnepeutpas hangerlavaleur.
Cein'estpasleaspourunlangaged'assemblage.
Dans un langage d'assemblage une onstanteest unidentiateur auquel on attribue une
valeur.Lorsdel'assemblage,touteourrenedeetidentiateurestremplaéeparettevaleur.
Uneonstanten'oupedonpasd'emplaementmémoirelorsdel'exéution.
Emplaementdeladélarationdesonstantes.- Comme il s'agit d'unediretive, la délaration
d'uneonstante peutsetrouvern'importeoù,àl'intérieur dusegmentdesdonnées,oudansun
autresegmentouàl'extérieurdetoutsegmentmaiselledoitprééderl'utilisationdelaonstante.
Délaration.-OnutiliseladiretiveEQU(pourEQUate).Parexemple:
TVA EQU 20
Ceisigniequel'assembleurremplaerahaqueourrenede`TVA' par20.
Lavaleurpeutêtreuneexpression(onstante) :
TOTALVENTES DW 0
...
TV EQU TOTALVENTES
Casdehaînesdearatères.- MASM6.0 a introduit ladiretiveTEXTEQU pour leas des
haînesdearatères:
nom TEXTEQU
<
texte>
26.4.7 Les strutures de ontrle
Nousavonsvulesstruturesdeontrledisponiblessurlemiroproesseuri8086enétudiant
sonlangagemahine.Ils'agit iidevoirommentlesutiliserdans unlangaged'assemblage,en
partiulierenremplaçantuneadresseabsolueparuneétiquette.
26.4.7.1 Saut inonditionnel
Nousavonsvulanotiondesautinonditionnellorsdel'étudedulangagemahine.Nousavons
remarqué alorsladiulté queonstitue lealul de l'adresse. Nousallonsvoirqueremplaer
uneadresseabsolueparuneétiquettenousfailitegrandementlavie.
Syntaxe.-Laformed'unsautinonditionnelest :
- - - -
etiquette :
- - - -
jmp etiquette
- - - -
oùetiquetteestuneétiquette,'est-à-direunidentiateurnondéjàutilisépourautrehose.
Intérêtdesétiquettes.- Une étiquette permet de repérer l'instrution à laquelle on veut aller,
puisquenous nepouvonsplusmanipulerlesadressesabsolues.
Exemple.- Érivonsunprogramme en langage d'assemblage qui itère unprogramme vu préé-
demment,àsavoirqui permet desaisirunelettreetaheettelettre(elle apparaîtdondeux
fois) et reommene indéniment. On ne pourra interrompre e programme que de l'une des
façonsindiquées i-dessus.
Onpeututiliserparexemple:
; saut.asm
; saisit une lettre au lavier, l'affihe, passe a la
; ligne suivante et reommene jusqu'a CTRL-C
.model small
.stak 100h
.ode
start :
; affihe '?'
mov dl, '?'
mov ah, 2h
int 21h
; saisit le aratere
mov ah, 1h
int 21h
; affihe le aratere
mov dl, al
mov ah, 2h
int 21h
; passe a la ligne
mov ah, 2h
int 21h
mov dl, 10
mov ah, 2h
int 21h
; reommene
jmp start
; revient a ms-dos (mais sans interet ii)
mov ax, 400h
int 21h
end start
26.4.7.2 Sauts onditionnels
Nousavonsdéjàvuequ'estunsautonditionnel,lesdiverssauts onditionnelset lesmné-
monymesassoiésàeux-ilorsdel'étudedulangagemahine.Nousallonsvoiriiommentles
mettreenplaeenlangaged'assemblage.
Miseenplae enlangaged'assemblage.-Laseule diéreneiiest quel'onutilise uneétiquette
aulieud'uneadresseabsolue,equiévited'avoiràalulerelle-i.
Exempledeboulepour.-Érivonsunprogrammequiahelesaratèresdeodeasiiompris
entre33et255.
; asii.asm
; affihe les arateres asii de 33 a 255
.model small
.stak 100h
.ode
start :
mov bl, 255
mov l, 32
debut :
in l
mov dl, l
mov ah, 2h
int 21h
mp bl, l
jnz debut
; revient a ms-dos
mov ax, 400h
int 21h
end start
Exempledetest.- Érivonsun programme permettant desaisir unaratère puis ahant `A'
s'ils'agitd'un`a'.
; a.asm
; saisit un aratere et affihe 'A' si 'est un 'a'
.model small
.stak 100h
.ode
start :
; affihe '?'
mov dl, '?'
mov ah, 2h
int 21h
; saisit le aratere
mov ah, 1h
int 21h
; ompare ave 'a'
mp al, 'a'
; va a la fin si e n'est pas un 'a'
jne fin
; affihe 'A' sinon
mov dl, 'A'
mov ah, 2h
int 21h
fin :
;revient a ms-dos
mov ax, 400h
int 21h
end start
Exempled'alternative.-Érivonsunprogrammequipermetdesaisirunaratère,ahe`Y's'il
s'agitd'un`b'etahe`N'sinon.
; b.asm
; saisit un aratere, affihe 'Y' si 'est un 'b'
; et 'N' sinon
.model small
.stak 100h
.ode
start :
; affihe '?'
mov dl, '?'
mov ah, 2h
int 21h
; saisit le aratere
mov ah, 1h
int 21h
; ompare ave 'b'
mp al, 'b'
; va a SINON si e n'est pas un 'b'
jne SINON
; affihe 'Y' sinon
mov dl, 'Y'
mov ah, 2h
int 21h
; va a la fin
jmp fin
; affihe 'N' sinon
SINON :
mov dl, 'N'
mov ah, 2h
int 21h
fin :
; revient a ms-dos
mov ax, 400h
int 21h
Exempledeboulenonontrlée.- Érivons un programme permettant de saisir un aratère,
ahantunespae,ahantuneseondefois earatère(la premièrefoisétantdue àl'ého),
allantàlaligneetreommençantjusqu'àequelearatèresaisisoit `#'.
; tantque.asm
; saisit un aratere, l'affihe jusqu'a '#'
.model small
.stak 100h
.ode
START :
; affihe '?'
mov dl, '?'
mov ah, 2h
int 21h
; saisit le aratere
mov ah, 1h
int 21h
; ompare ave '#'
mp al, '#'
; va a FIN si 'est un '#'
je FIN
; sauvegarde du aratere
mov bl, al
; affihe un espae
mov dl, ' '
mov ah, 2h
int 21h
; affihe le aratere
mov dl, bl
mov ah, 2h
int 21h
; va a la ligne
mov dl, 13
mov ah, 2h
int 21h
mov dl, 10
mov ah, 2h
int 21h
; revient au debut
jmp START
FIN :
; revient a ms-dos
mov ax, 400h
int 21h
26.5 Les sous-programmes en langage d'assemblage
Nous avonsvu lanotionde sous-programmelorsdel'étude d'un langageévolué,lelangage
C.Nousavonsvuommentmettre enplaeuntelsous-programmeenlangagemahine.
Un miroproesseurutilisantlanotionde segment,telquei8086,ompliqueunpeulamise
enplaepuisqu'ilfautdistinguerlessous-programmessetrouvantdanslemêmesegmentdeode
deeuxqui setrouventdansunautresegment.
26.5.1 Sous-programme intra-segmentaire
26.5.1.1 Calque du langage mahine
Introdution.-Voyonsommentmettreenplaeenplaeunsous-programmesituédanslemême
segment,equi n'estdonpossiblequepourdepetitssous-programmes.
Nomd'unsous-programme.-Un sous-programmeporteunnom,qui est unidentiateur(non
utilisépourautre hose,ommed'habitude).
Passagedesparamètres.- Contrairement aux sous-programmes des langages évolués, un sous-
programme en langage d'assemblage n'a pas d'arguments. Autrement dit tousles paramètres
sontpassés ommevariableglobale,enutilisantlesregistres,lapile oudesemplaementsde la
mémoirevive.
Dénition dusous-programme.-Unsous-programmeestdéniparl'étiquetteforméedesonnom
et de deux points `:', suivi d'une portion de ode, suivi de la diretive ret (pour return ou
retour).
Ladénitionseplaesoitaprèsleprogrammeprinipal(sinonlaportiondeprogrammeserait
exéutéee une fois), 'est-à-direentre le retourà MS-DOS et la ndu programme, soit il faut
plaerunsautinonditionnelavantlesous-programme.
Appeld'unsous-programme.- Pour appeler un sous-programme, 'est-à-dire faire exéuter la
portion de programme qui en onstitue le orps,il sut d'utiliser l'instrution all suivi du
nomdusous-programme.
Unexemple.-Érivonsànouveauleprogrammeonsistantàsaisirunaratèreetàl'aherà
l'éranmaisenutilisant,ettefois-i,deuxsous-programmes:unsous-programmegetdesaisie
d'unaratèreetunsous-programmeputd'afhaged'unaratère.
; all1.asm
; saisit une lettre au lavier et l'affihe a l'eran
.model small
.stak 100h
.ode
; programme prinipal
start :
all get ;appel de la fontion de saisie
mov dl,al ;opie le ode asii de e aratere dans dl
all put ;appel de la fontion d'affihage
mov ax,400h ;revient a ms-dos
int 21h
; sous-programmes
put :
mov ah,2h
int 21h
ret
get :
mov ah,1h
int 21h
ret
end start
26.5.1.2 Diretivesde sous-programmes
Syntaxe.-Lasyntaxequenousavonsdonnéei-dessussuitdetrès prèsequi sefaitenlangage
mahine. Ilvautmieuxutiliserlesdiretivessuivantes:
NOM PROC NEAR
; le ode
NOM ENDP
le paramètre NEARétant optionnel, puisqu'il s'agit du paramètre pardéfaut. On utilise le pa-
ramètre FAR pour un sous-programme inter-segmentaire. Le programme prinipal est toujours
inter-segmentairepourlesystème d'exploitationMS-DOS.
Exemple.Réérivonsleprogrammepréédentenutilisantesdiretives:
; all2.asm
; saisit une lettre au lavier et l'affihe a l'eran \\
.model small
.stak 100h
.ode
; programme prinipal
start PROC FAR
all get ;appel de la fontion de saisie
mov dl,al ;opie le ode asii de e
;aratere dans dl
all put ;appel de la fontion d'affihage
mov ax,400h ;revient a ms-dos
int 21h
start ENDP
; sous-programmes
put PROC
mov ah,2h
int 21h
ret
put ENDP
get PROC
mov ah,1h
int 21h
ret
get ENDP
26.5.2 Sous-programme inter-segmentaire
Lorsque l'instrution allet le sous-programme qu'elle appelle setrouvent dans le même
segment,onparled'appelprohe (enanglaisnear all).Lorsquel'instrution allet lesous-
programme qu'onappellese trouvent dansdes segmentsdiérents,on parled'appel lointain
(enanglaisfar all).
Lorsdel'appeld'unsous-programmeinter-segmentaire,ilfautsauvegarderlesregistresCSet
IPpuis,àlandusous-programme,réupérerlesaniennesvaleursdeesdeuxregistres.
26.5.2.1 Premièresyntaxe
Miseenplae.- Ladénitiondusous-programmesefaitdelamêmefaçonquepourlapremière
syntaxed'un sous-programmeprohe,à elaprès qu'ilsetermine parl'instrution RETF(pour
RETurnFar)aulieudel'instrutionRET.
Lorsdel'appelde esous-programme,il faudraindiquerexpliitementquel'on faitappel à
unsous-programmelointainparl'instrution:
all far ptr sub
silenomdusous-programmeest,parexemple,sub.
Exemple.-
Remarque.- Comment le sous-programmeest-il plaé dans un autre segment? Grâeà PROC
FAR?avedebug?
àterminer
26.5.2.2 Deuxièmesyntaxe
NOMPROCFAR
NOMENDP
àterminer
26.5.3 Utilisation de la pile pour onserver les registres
Introdution.- L'utilisation des sous-programmes pose deux problèmes en e qui onerne les
registres.Onutilisedesregistrespourpasserlesparamètres,equiréduitlenombrederegistres
pourstokerlesautresinformations. Deplusonmodie, dansleorpsdusous-programme,les
valeursdesregistres;elapeutavoirune inuene subtilesur leprogramme sansque l'ons'en
aperçoivefailement,surtoutsionn'apaséritsoi-mêmelesous-programme.
Parexemple,danslaportion deprogrammesuivante :
; exemple a eviter
mov dx,11
mov al,65
all put
add dx,2
lavaleurduregistredxaétéhangéeparlesous-programmeputalorsquel'ons'attendertai-
nementàequ'ilontiennelavaleur11,mêmeaprèsexéutiondusous-programme.
Sauvegardedesregistres.-Onadonintérêt,danstoutsous-programme,àsauvegardertousles
registres,sauf euxqui ontiendrontles résultats,puis àlesrestituer àla n.Pourela onles
plaesurlapileaudébutdusous-programmeet onlesréupèreàlan.
Remarquonsquel'onpeutsansproblèmesauvegarderlesregistresquiontiennentlesdonnées,
puisquelesvaleursplaéesdanslapiledemeurentaussidanslesregistres.
Lesous-programmeput,parexemple,seraorretementéritdelafaçonsuivante:
put: ; affihe le aratere de al
push ax ; sauvegarde les registres
push bx
push x
push dx
mov dl,al ; sous-programme proprement dit
mov ah,2h
int 21h
pop dx ; restaure les registres
pop x
pop bx
pop ax
ret
Remarques.-1
o
)Ilfautréupérerlesvaleursdesregistresdansl'ordreinversedeeluidanslequel
ellesontétésauvegardées.
-2
o
)Ilestimportantdedésempilertouslesélémentsmissurlapiledansleorpsdu
sous-programme.Sinon,àlandusous-programme,l'adressederetourneserapasorrete,e
26.6 Les haînes de aratères
Une haîne de aratères(enanglais string)est unelistede aratèrestraitéeommeun
tout.
26.6.1 Délaration des haînes de aratères
Nous avons déjà vu que, dans le langage d'assemblage Mirosoft, les variables haînes de
aratères sont délarées omme des tableaux de aratères, en utilisant la diretive db. Par
exempleab peutêtredélarédel'unedesfaçonssuivantes:
mot1 db 97, 98, 99 ; odes ASCII individuels
mot2 db 'a', 'b', '' ; arateres individuels
mot3 db 'ab' ; onstante haine de arateres
mot4 db "ab" ; pas de differene entre ' et "
Onpeutaussidélarerunetellevariable sansl'initialiser:
mot db 5 dup (?)
26.6.2 Ahage d'une haîne de aratère
Introdution.- Nous avonsdéjà vu une première façond'aher une haîne de aratères, qui
onsisteàl'aheraratèrepararatère.EnfaitilexisteuneinterruptionduDOSpermettant
d'aherunehaînedearatères,àonditionqueelle-isoitsousunformatdonné,'est-à-dire
qu'ellesetermineparlearatère`$'.
En eetil fautbien undélimiteur pourindiquerquand ilfaut s'arrêter.Lehoixde elui-i
estunpeuarbitraire:onhoisitunaratèrepeuutilisé.
Lafontion9h.-Pouraherunehaînedearatèresenutilisantlafontion9hdel'interruption
21h,ilfautquelahaînedearatèressetermineparlearatère`$',qui lui-mêmeneserapas
ahé. Il faut plaer l'adresse du premier aratère dans le registredx et faire appel à ette
fontion.
Exemple.-Érivonsunprogrammepermettantd'aherBonjour etd'alleràlaligne.
; bonjour.asm
.model small
.stak 100h
.data
message db 'Bonjour', 13, 10, '$'
.ode
start:
mov ax,data
mov ds,ax
mov dx,offset message ; opie l'adresse de message dans dx
mov ah,9h ; fontion d'affihage de mot
int 21h ; appel de l'interruption ms-dos
mov ax, 400h
int 21h
end start
Remarques.- 1
o
)Ilne fautsurtoutpasoublier learatère qui terminelahaîne dearatères.
Si onl'oublie,touslesaratèresdelamémoireserontahésjusqu'àe quel'onrenontreun
signedollar,àsupposerqu'ilyenaitun.
o
26.6.3 Entrée-sortie des haînes de aratères
Nous avonsvu deux façonsd'aherune haîne de aratèresmais auunepour saisirune
tellehaîne.Nousallonsvoirdeuxsous-programmespermettantdesaisiretd'aherunehaîne
dearatères.
Nous suivronsla onventiondulangage Cpourterminer une haîne dearatères, àsavoir
parlearatère nul`0', pluttquelaonventionde MS-DOS.Celle-i apour intérêtdenepas
utiliserunaratère ahableommeterminateur.
26.6.3.1 Saisied'une haîne de aratères
Prinipe.- Utilisons un sous-programme gets. On plae l'adresse du tampon de la haîne de
aratèresàsaisirdansleregistreaxetonappelleesous-programme.Cetteadresseestelledu
premieraratère.Onutiliseleregistrebxommeindex. Onommeneparinitialiserbxparla
valeurdeax.Onsaisit unaratère quel'onplaeàl'adresseindiquée parbxet oninrémente
bx.Onreommenejusqu'àequ'onrenontreCR;onplaealors`0'aulieudeCRetons'arrête.
Leprogramme.-Lesous-programmeestdonnéi-dessousdansunexempledetest quidemande
unprénom,puisqui aheBonjour suivide eprénom.Nousajoutons,uniquementpouret
exemple,deuxlignesdeodeausous-programmegetsdefaçonàequelahaînedearatères
saisie setermineégalementparun dollar,defaçon àpouvoirutiliserla fontiond'ahagede
MS-DOS.
; gets.asm test de gets
.model small
.stak 256
.data
prenom db 30 dup (?)
prompt1 db 'Quel est votre prenom ? ','$'
prompt2 db 13, 10, 'Bonjour ', '$'
.ode
start:
mov ax,data
mov ds,ax
mov ax,offset prompt1 ; affihe le prompteur
all puts
mov ax,offset prenom ; saisie du prenom
all gets
mov ax,offset prompt2 ; affihe bonjour
all puts
mov ax,offset prenom ; affihe le prenom
all puts
mov ax, 400h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sous-programmes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
gets: ; lit une haine de arateres au lavier
; terminee par CR, et la
; sauvegarde a l'adresse indiquee par ax
push bx
push x
push dx
mov bx, ax
gets_nouveau :
all get ; lit un aratere dans al
mp al, 13 ; est-e CR ?
je gets_fin ; si oui aller a la fin
; si non le plaer
mov byte ptr [bx℄, al
in bx
jmp gets_nouveau
gets_fin :
mov byte ptr [bx℄,0 ; termine la haine ave 0
in bx
mov byte ptr [bx℄,'$' ; pour utiliser ii le puts du dos
pop dx ; restaure les registres
pop x
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
puts:
push ax
push bx
push x
push dx
mov dx,ax
mov ah,9h
int 21h
pop dx
pop x
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get:
push bx
push x
push dx
mov ah,1h
int 21h
pop dx
pop x
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26.6.3.2 Ahage d'une haîne de aratères
Prinipe.- Utilisons unsous-programme puts. On plae l'adresse de la haîne de aratères à
aherdansle registreaxet onappelleesous-programme.Cetteadresseest elledupremier
aratère de lahaîne.On utilise le registrebx ommeindex, ommedans le sous-programme
préédent. Onommene parinitialiser bxpar lavaleur de ax.On ahe le aratère plaé à
l'adresse indiquée par bx et on inrémente bx. On ontinue jusqu'à e qu'on trouve la valeur
nulle.
Leprogramme.-Lesous-programmeestdonnéi-dessousdansunprogrammedetesteetuant
lamêmehosequeleprogrammedetesti-dessus.Remarquonsqu'iinousavonsenlevélesdeux
lignesdeodenonindispensables danslesous-programmegets.
; puts.asm test de puts
.model small
.stak 256
.data
prenom db 30 dup (?)
prompt1 db 'Quel est votre prenom ? ', 0
prompt2 db 13, 10, 'Bonjour ', 0
.ode
start:
mov ax,data
mov ds,ax
mov ax,offset prompt1 ; affihe le prompteur
all puts
mov ax,offset prenom ; saisie du prenom
all gets
mov ax,offset prompt2 ; affihe bonjour
all puts
mov ax,offset prenom ; affihe le prenom
all puts
mov ax, 400h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; sous-programmes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
puts: ; affihe une haine de arateres terminee
; par 0 dont l'adresse est dans ax
push ax ; sauvegarde les registres
push bx
push x
push dx
mov bx,ax ; initialise bx ave l'adresse
puts_nouveau:
mov al,byte ptr [bx℄ ; onsidere un aratere de la haine
mp al,0 ; est-e la fin ?
je puts_fin ; si oui aller a la fin
all put ; sinon affiher le aratere
in bx
puts_fin:
pop dx ; restaure les registres
pop x
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
gets: ; lit une haine de arateres au lavier
; terminee par CR, et la
; sauvegarde a l'adresse indiquee par ax
push ax ; sauvegarde les registres
push bx
push x
push dx
mov bx, ax
gets_nouveau :
all get ; lit un aratere dans al
mp al,13 ; est-e CR ?
je gets_fin ; si oui aller a la fin
; si non le plaer
mov byte ptr [bx℄,al
in bx
jmp gets_nouveau
gets_fin :
mov byte ptr [bx℄,0 ; termine la haine ave 0
pop dx ; restaure les registres
pop x
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
put: ; affihe le aratere situe en al
push ax
push bx
push x
push dx
mov dl, al
mov ah, 2h
int 21h
pop dx
pop x
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get:
push bx
push x
push dx
int 21h
pop dx
pop x
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end start
26.7 Entrées-sorties des entiers
Ilexistedesinstrutionsd'entrée-sortiedesentiersdanstousleslangagesdeprogrammation
évolués. Nous n'en avons pas vu pour le langage mahine du i80x86. Il n'en existe pas; e
langage,ommelaplupart deslangagesmodernes,est orientémotetnonorienté nombre.
Poursaisirouaherunentier,nousdevonseetuerl'opérationorrespondantesurunmot
puistraduireemotenunentier.
26.7.1 Ahage d'un entier
Prinipe.-Érivonsunsous-programmeputnpermettantd'aheràl'éranunentierplaédans
leregistreax.
On eetue ladivision eulidienne del'entier par10 : le reste est le hire de droite et on
reommene ave le quotient s'il est non nul. Puisque nous obtenons les hires dans l'ordre
inverse de elui del'ahage, nous ommençons par les sauvegardersur la pile. Pour pouvoir
déterminer le premier hire lorsque nous lirons la pile, on ommene par plaer une valeur
sentinellesurelle-i,parexemplelearatère nul (ànepasonfondreavelehire0).
Leprogramme.-Érivonsunprogrammeomplet permettantd'aherl'entier16.
; affihen.asm
; affihe un entier
.model small
.stak 256
CR equ 13d
LF equ 10d
.data
prompt db 'a = ', 0
.ode
debut :
mov ax,data
mov ds,ax
mov dx,offset prompt
all puts
mov ax, 16
all putn
mov ax,400h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; definition des sous-programmes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
put:
; voir plus haut, non reopie ii
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
puts:
; idem
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
putn:
push bx
push x
push dx
mov dx,0
push dx ; plae 0 sur la pile omme sentinelle
mov x,10 ; initialise x a 10 pour la division
mp ax,0
jge hiffres
; si le nombre est negatif
neg ax ; ax = - ax
push ax ; sauvegarde de ax
mov al,'-'
all put ; affihe le signe -
pop ax ; on reupere ax
mp ax,0
jne hiffres
mov al,'0'
all put ; affihe '0'
jmp fin_putn
hiffres:
div x ; dx = ax % x, ax = ax/x
add dx,'0' ; onvertit le hiffre en aratere
push dx ; sauvegarde le hiffre sur la pile
mov dx,0 ; dx = 0
mp ax,0 ; termine ?
jne hiffres
; tous les hiffres sont maintenant sur la
; pile
; on va les affiher dans l'ordre invers
affihe:
pop ax ; on reupere un hiffre
mp ax,0 ; est-la valeur sentinelle ?
je fin_putn ; si oui on a fini
all put ; sinon affiher le hiffre
jmp affihe
fin_putn:
pop dx ; on restaure les registres
pop x
pop bx
pop ax
ret
26.7.2 Saisie d'un entier
Prinipe.-Érivonsunsous-programmegetnpermettantdesaisirunentieret deleplaerdans
le registre ax. On saisit un mot aratère par aratère grâe au sous-programme get. Si le
premieraratèreestlesigne`-'alorsl'entierestnégatif.Lesaratèressuivantsdoiventêtredes
hires. Onutiliselaméthode de Hörnerpourobtenir(la valeurabsolue de)l'entier:
n
estinitialiséà0puis,àhaquefoisqu'onlit unhire
a
,onan = 10 ∗ n + a
.Ons'arrêtelorsqu'onsaisitunpassageàlaligne.
Leprogramme.-Érivonsunprogrammeompletpermettantdesaisirdeuxentiersetd'afher
leursomme.
; sum.asm
; saisit deux entiers au lavier et affihe leur somme
.model small
.stak 256
CR equ 13d
LF equ 10d
.data
prompt1 db 'a = ', 0
prompt2 db CR, LF, 'b = ', 0
result db CR, LF, 'a + b = ', 0
a dw ?
b dw ?
.ode
debut:
mov ax,data
mov ds,ax
mov ax,offset prompt1
all puts ; affihe le premier prompteur
all getn ; lit le premier nombre
mov a,ax ; le plae dans a
mov ax,offset prompt2
all puts ; affihe le seond prompteur
all getn ; lit le seond nombre
mov b,ax ; le plae dans b
mov ax,offset result
all puts ; affihe le resultat
mov ax,a ; ax = a
add ax,b ; ax = ax + b
all putn
mov ax,400h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; definition des sous-programmes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
put:
; non reopie ii
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
puts:
; idem
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
putn:
; idem
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
getn:
push bx ; sauvegarde les registres sauf ax
push x
push dx
mov dx,1 ; initialise le signe a +
mov bx,0 ; initialise le hiffre a 0
mov x,0 ; initialise le nombre a 0
all get ; lit le premier aratere
mp al,'-' ; est-e le signe - ?
jne signe
mov dx,-1 ; si oui noter le signe
all get ; lire le premier hiffre
signe :
push dx ; sauvegarder le signe
nouveau:
mp al,13 ; est-on a la fin
je fin_read ; si oui aller a la fin
; sinon
sub al,'0' ; onvertir en hiffre
mov bl,al
mov ax,10
mul x ; ax = x*10
mov x,ax
add x,bx ; x = x*10 + hiffre
all get ; lit un nouveau hiffre
jmp nouveau
fin_read:
mov ax,x ; le nombre est plae dans ax
pop dx ; le signe dans dx
mp dx,1 ; le signe est-il + ?
je fin_getn
neg ax ; sinon ax = - ax
fin_getn:
pop dx
pop x
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26.8 La programmation modulaire
La programmation modulaireen langaged'assemblageadeux origines :la premièreest
que l'onne veut pasréériresansarrêtlesmêmes sous-programmes,même s'il sut pourela
d'un opier-oller;laseondeest que l'on aintérêtàséparerungros programmesen plusieurs
hiers. Onveutdon onevoir unhierde sous-programmes, ayanten généralune ertaine
unité;ilestassemblépourobtenirunhierobjet.Onpeutalorslierplusieurstelshierspour
obtenirunhierexéutable.Onparledemodulepourhaundeeshiersindépendants.
26.8.1 Le problème de l'interfae
Notiond'interfae.-Unmoduleutiliseunertainnombred'identiateurs,pourlesvariables,les
étiquettes,lesnomsdesous-programes,et.
Un desgrandsprinipesdelamodularitéest queesidentiateurs,pardéfaut,nesontpas
onnusdel'extérieur,'est-à-diredesautresmodules.Eneethaquemoduleestengénéralonçu
parunepersonne,ouune équipe,indépendante,quipeutvouloirutiliserlemêmeidentiateur
qu'uneautre,maisaveunsensdiérent.
Lorsqu'on veut qu'un identiateur soit onnu de l'extérieur du module, 'est-à-dire par
d'autresmodules,ilfaut l'indiquerexpliitementàtraversequ'onappellel'interfae.
Enlangaged'assemblage,l'interfaçageseréalisegrâeauxdiretivespublietextern,omme
nousallonslevoir.
Ladiretivepubli.-Onutiliseette diretivepourqu'unidentiateurreprésentantuneons-
tante,unevariableoulenomd'unsous-programmesoitaessiblepard'autresmodulesqueelui
danslequelilestdéni.Pourlesonstantes,ilnepeuts'agirquedeonstantesdetypeentier.
Ilsutdeplaer:
PUBLIC nom
ou,pourplusieursidentiateurs:
PUBLIC nom1, nom2, nom3
quelquepartdanslehiersouredumodule.
Ladiretiveextern.-Ilnesutpasquelemodulepermettantd'utiliserundesesidentiateurs
à l'extérieur le permette, en le délarant publi. Il faut également que le module qui veut
l'utiliserindiqueexpliitementqu'ilveutl'utiliser:eneetsinon,lorsqu'onassembleralemodule
utilisateur,eladélenherauneerreurpuisqu'unidentiateurseraitutilisésansêtredélaré.
Deplusilfautindiquerlanature,autrementditletype,deetidentiateur.
Pourela,onutilise ladiretive:
EXTRN nom:type
danslesegmentadéquat,àsavoirlesdélarationsdesous-programmedanslesegmentdeode,les
délarationsdevariabledanslesegmentdesdonnéesetlesdélarationsdeonstantesn'importe