• Aucun résultat trouvé

Seièe aie gaai e

N/A
N/A
Protected

Academic year: 2022

Partager "Seièe aie gaai e "

Copied!
64
0
0

Texte intégral

(1)

Programmation en langage

d'asemblage

(2)
(3)

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.

(4)

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

(5)

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

(6)

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

asm

ii

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.

(7)

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>

(8)

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.

(9)

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

(10)

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'

(11)

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.

(12)

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

(13)

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

(14)

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.

(15)

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

(16)

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

(17)

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'.

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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.

(23)

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

(24)

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

(25)

.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)

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

(27)

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

(28)

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

(29)

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

>

(30)

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

(31)

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

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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.

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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 (?)

(42)

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

(43)

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

(44)

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(45)

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

(46)

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

(47)

int 21h

pop dx

pop x

pop bx

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

end start

(48)

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:

(49)

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

(50)

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

est

initialiséà0puis,àhaquefoisqu'onlit unhire

a

,ona

n = 10 ∗ n + a

.Ons'arrêtelorsqu'on

saisitunpassageà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:

(51)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(52)

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

Références

Documents relatifs

Langage mahine.- L'instrution en langage symbolique n'est là que pour nous aider à s'en

de mémoire vive et, d'autre part, le transfert d'une valeur d'un registre vers un élément.. de mémoire vive, ou

(pour Integer DIVision), où le dividende de 16 bits (resp. 32 bits) est plaé dans l'aumulateur. AX (resp. AX et DX, e dernier ontenant le mot de poids fort) et le diviseur de 8

Langage mahine.- Uun sous-programme peut se trouver dans le même segment que le programme. qui l'appelle : la valeur du registre IP est alors hangée mais il est inutile de

Pour une valeur se trouvant à l'adresse (de mémoire vive) désignée par le ontenu d'uno. registre (de seize bits, puisque 'est la taille du déplaement), on indique le nom de

La taille d'un registre est par défaut de 16 (ou 8) bits en mode réel.. Si le

mode protégé : elle doit être égale à la valeur du segment de ode du mode réel (adresse hoisie.. Puisque nous sommes en mode réel, l'adresse physique est égale au ontenu du

Et enn les 12 derniers bits spéient le déalage dans la page, omme pour la pagination.