• Aucun résultat trouvé

Chaie 22 e haîe de aa èe a 

N/A
N/A
Protected

Academic year: 2022

Partager "Chaie 22 e haîe de aa èe a "

Copied!
30
0
0

Texte intégral

(1)

Les haînes de aratères

La plupartdesordinateurs modernesne sontplusorientés alulsmais orientés mots.Ilest

donimportantdesavoirommenttraitereux-i.

Onpeuttoujoursoderlesmotset simulerlesopérationssureux-i. Mais, devantl'impor-

tanede lamanipulation des motsparordinateurs de nosjours, lesonepteursdes miropro-

esseurss'adaptentet réentdesprimitivespourelle-i.

(2)

22.1 Dénition des haînes de aratères

Nousavonsdéjàvu e qu'est,mathématiquement, unmot:il s'agitd'unesuitenie surun

alphabet, ensemble ni non vide quelonque. En informatique on préfère parlerde haînes de

aratères(stringenanglais)pourinsistersurlefaitqu'onpeut,enpartiulier,ompterl'espae

ommeunaratère.

22.1.1 Représentation des aratères

Unehaînedearatèresétantunesuitedearatères,ilfautd'abords'interrogersurlafaçon

dereprésenterlesaratères.

Le miroproesseurne onnaît pas lanotionde aratères. Il neonnaît que les odes des

aratères,quipeuventêtreonsidérésommedesentiers.

Combienfaut-il d'entierspourreprésenterlesaratères?Ilyavingt-sixlettresenfrançais,

maissansdistinguerlesminusulesdesmajusules,etsansteniromptedessignesdiaritiques:

`é'n'estpaslamêmehoseque`e'ou`è'.Deplusonabesoindeshires,dessignesdepontuation

et de quelques signes spéiaux. Nous avons vu que l'on utilise de nos jours Uniode ave la

possibilitéde65536aratèresmais,àl'époquedelaoneptiondespremiersmiroproesseurs,

onseontentaitde256aratères.

Pour le 8086/8088, unaratère est odé sur un otet. Qu'importe le ode utilisé. C'est à

l'utilisateur(danslapratiqueauonepteurdusystèmed'exploitation)dedéterminerelui-i.

22.1.2 Représentation des haînes de aratères

Dénition.-Unehaîne de aratèresest unesuited'otetsd'adresses onséutives.

Unehaînedearatèresest entièrementdéterminéeparsonadresseet salongueur.

Adressed'unehaînedearatères.-Soitlasuited'otets

w = o 1 o 2 ...o n

.Sil'adresse,enmémoire

entrale, du premier otet

o 1

est

p

alors elle du seond otet

o 2

est

p + 1

, elle du troisième otet

o 3

est

p + 2

,...,elledu

n

-ièmeotet

o n

est

p + n − 1

.Ilsut dondeonnaîtrel'adresse dupremierotet,

p

,quiest appeléel'adresse de lahaîne de aratères.

Onremarqueraquelesotetssontnumérotésnaturellementdegauheàdroite,ontrairement

auxbitsd'unotetoud'unmot,qui sonteuxnumérotésdedroiteàgauhe.

Longueurd'unehaînedearatères.- Ladéterminationd'unehaînedearatèresenmémoire

entralesefaitparsonadressemaisaussiparsalongueur

n

,equipermetdedéterminerlan

deelle-i.

Exemple.- LahaînedearatèresBonjour"delongueur

7

àl'adresse1024serareprésentéede lafaçonsuivanteenmémoire:

1024 `B'

1025 `o'

1026 `n'

1027 `j'

1028 `o'

1029 `u'

(3)

22.1.3 Jeu de aratères utilisé

Lesaratèressontdesotets,ilssontdonlimitésà256.Maisquelssontesaratères?Le

miroproesseurneseprononepas:ilssontrepéréspardesnumérosde0à255,ilappartiendra

ensuiteauonepteurdusystèmed'exploitationdelesinterpréter,enpartiuliergrâeàlaROM

aratère.

Dansleasdel'IBM-PC,ils'agitdel'alphabetASCIIétendudedeuxfaçons:lesaratères

deode0à31sontremplaéspardesaratères(ditssemi-graphiques)propresàIBMetily

alehoixd'unASCII nationalpourlesaratèresde128à255.

(4)

22.2 Adressage indiret par registre et tableaux

Nousavonsvulanotiondetableaudansleoursd'initiationàlaprogrammationetlesservies

qu'ellerendauprogrammeur.Cettenotion,trèsutiledans leslangagesévolués,n'existepasen

tantquetelleenlangagemahine.Voyonsiilanotiond'adressageindiret,pluspartiulièrement

l'adressage indiret par registre, et omment elui-i permet de mettre en plae failement les

tableauxd'otets,autrementditleshaînesdearatères.

22.2.1 Notion

Notiond'adressageindiret.-Jusqu'àmaintenantnousavonsmanipulédesonstantes(adressage

immédiat),desvaleurssetrouvantdansunregistre(adressageregistre)etdesvaleurssetrouvant

àunemplaementdonnédelamémoirevive(adressage diret).

Uneautrefaçondefaireestdedésignerunemplaementmémoire(dedeuxotets)quiontient

nonpaslavaleurdésiréemaisl'adresse(enmémoirevive,'estlaraisonpourlaquelleonabesoin

dedeuxotets)ontenantlavaleurdésirée.Onparlealorsd'adressageindiret.

Syntaxedel'adressageindiretparregistreenlangagesymbolique.- Comme nous l'avons déjà

vu, en langage symbolique,pourdésigner une onstante on érit elle-i en hexadéimal, pour

unevaleursetrouvantdansunregistreonéritlenom duregistre,pourunevaleursetrouvant

àunemplaementdelamémoireentraleonindiquel'adresse(uneonstantehexadéimale),ou

plusexatementsondéplaement,deetemplaemententrerohets.

Pour une valeur se trouvant à l'adresse (de mémoire vive) désignée par le ontenu d'un

registre(deseize bits,puisque 'estlataille dudéplaement),onindiquele nom dee registre

entrerohets,parexemple[BX℄.Onparlealorsd'adressageindiret par registre.

Registresonernés.- On ne peut pas utiliser n'importe quel registrepour l'adressage indiret

parregistre.Lesseulsregistresutilisablespourle8086/8088sontBX,BP,DIetSI.

Les registrespermisneproviennentpasd'une restritionlogiquemaisd'unequestiond'éo-

nomiedeâblagedumiroproesseur:ongagnesurlenombredetransistorsennedonnantpas

touteslesfontionnalitésàhaqueregistremaisenlesspéialisantquelquepeu.

Indiationdelatailledel'adressageindiretenlangagesymbolique.- L'adressage indiret peut

sefairepourdesotetsmaisaussipourdesmots(deuxotets).

Lorsqueelan'estpaslaironutiliselespréxessuivantsdansleasdulangagesymbolique

(ils'agitdeodesd'opérationdiérentspourlelangagemahine):

byte ptrpourunotet;

(5)

Parexemple:

MOV AL,[BX℄

estvisiblementune instrutiondeopied'unotetmais:

MOV [BX℄,10

estambigu.Ondoitdonpréiser,parexemple:

MOV BYTE PTR [BX℄,10

Exemple.- Ave le mot `Bonjour' érit àl'adresse indiquée i-dessus, laportion de programme

suivant:

MOV BX,1024

MOV CL,[BX℄

CMP BYTE PTR [BX℄,0

plaera`B'dansleregistreCLet lepointeurZFneserapasnul puisque[BX℄neontientpasle

aratèrenullorsdeladernièreligne.

Adressephysique.- Lors de l'adressage indiret on indique l'adresse logique et, en fait, que le

déalagedeelle-i.Commed'habitude,siein'estpassusant,l'adresselogiqueomplète, et

donl'adresse physique, est obtenue enutilisant l'adressede segment indiquée dansle registre

DSpourlesregistresBXetSI,dansleregistreESpourDI.

Langagemahine.- Nous avons en fait déjà vu, sans néessairement en omprendre toutes les

subtibilités,ommentonodeeienlangagemahine. Pourunotet:

| mod reg r/m |

onutilisemod = 00,leregistredépendantdelavaleurder/m:

r/m AE

100 [SI℄

101 [DI℄

111 [BX℄

(6)

22.2.2 Un exemple

Problème.- Érivons un programme qui ommene par plaer `Bonjour' à partir de l'adresse

3000 : 402

,suivi delavaleursentinelle`0', puisqui omptele nombre dearatèresdee mot, 'est-à-direlenombredearatèresdepuisledébutjusqu'à`0'noninlus,qui plaelalongueur

dansleregistreDXpuislareporteàl'emplaementmémoire

3000 : 400

. Langagesymbolique.-Leprogrammes'érit:

MOV AX,3000

MOV DS,AX

MOV BYTE PTR [402℄,42

MOV BYTE PTR [403℄,6F

MOV BYTE PTR [404℄,6E

MOV BYTE PTR [405℄,6A

MOV BYTE PTR [406℄,6F

MOV BYTE PTR [407℄,75

MOV BYTE PTR [408℄,72

MOV BYTE PTR [409℄,0

MOV DX,0

MOV BX,402

debut: MOV AL,[BX℄

CMP AL,0

JE fin

INC BX

INC DX

JMP debut

fin: MOV [400℄,DX

RET

Langagemahine.-Latradutiondeeprogrammeenlangagemahinedonne:

B8 00 30

8E D8

C6 06 02 04 42

C6 06 03 04 6F

C6 06 04 04 6E

C6 06 05 04 6A

C6 06 06 04 6F

C6 06 07 04 75

C6 06 08 04 72

C6 06 09 04 00

BA 00 00

BB 02 04

8A 07

3C 00

74 04

43

42

EB F5

89 16 00 04

(7)

Codonseprogramme:

C:\COM>debug

-E CS:100 B8 00 30

-E CS:103 8E D8

-E CS:105 C6 06 02 04 42

-E CS:10A C6 06 03 04 6F

-E CS:10F C6 06 04 04 6E

-E CS:114 C6 06 05 04 6A

-E CS:119 C6 06 06 04 6F

-E CS:11E C6 06 07 04 75

-E CS:123 C6 06 08 04 72

-E CS:128 C6 06 09 04 00

-E CS:12D BA 00 00

-E CS:130 BB 02 04

-E CS:133 8A 07

-E CS:135 3C 00

-E CS:137 74 04

-E CS:139 43

-E CS:13A 42

-E CS:13B EB 75

-E CS:13D 89 16 00 04

-E CS:141 C3

-R BX

BX 0000

:

-R CX

CX 0000

:42

-N COUNT.COM

-W

Eriture de 00042 otets

-Q

Aprèsexéutionduprogrammeount.om,onvériequel'ontrouvebienunelongueurde7

àl'emplaementmémoirehoisi:

C:\COM>debug

-D 3000:400

3000:0400 07 00 42 6F 6E 6A 6F 75-72 00 00 00 00 00 00 00 ..Bonjour...

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

(8)

22.3 Primitives de manipulation des mots

22.3.1 Copie

L'unedes manipulationsles plusourantesonernantleshaînesde aratèresest laopie

d'unetellehaîned'unemplaementàunautredelamémoirevive.Onpeutévidemmentréaliser

une telle opie ave lesinstrutions que nous onnaissons déjà. On peut égalementutiliser les

deux nouvellesinstrutions MOVS et REP pour ela,e qui aura pour onséquenededonner

unodeplusompat.

Exerie.-Érireunprogrammeenlangagemahinepermettantdeopierlahaînedearatères

d'adresseontenue dansAX etde longueurontenue dansCXàl'adresse ontenuedans BX.

22.3.1.1 Copie d'un élément

On saitopierunélément(otet oumot)d'unemplaementàunautre. Ilexiste ependant

uneinstrutionspéialiséepourefaire,quiestsurtoututileenonjontionaveuneinstrution

derépétitionspéialiséequenousverronsensuite.

Syntaxe.-L'instrution movs(pourMOVe aString) sedélinesouslesdeux formes,enlangage

symbolique:

MOVSB

et :

MOVSW

pourlaopied'unotetoud'unmot.

Paramètres.-Ilsemblemanquer desinformationsdansl'instrutions i-dessus.En fait,elles-i

sontapportéesparlesregistresDS,SI,ES et DI: leouplederegistres

DS : SI

(ave SIpour

SoureIndex)doitontenirl'adressedel'élémentàopier;leouplederegistres

ES : DI

(ave

DIpourDestination Index)doitontenirl'adresseàlaquelle ilfautopierl'élément.

Langagemahine.-Cesinstrutionssontodéessurunotetpar:

| 1010 010w |

avew = 0pourlapremièreetw = 1pourlaseonde,soitA4het A5hrespetivement.

Après le transfert, SI et DIsontinrémentés si DF est nul ou dérémentés si DF vautun.

Cein'apasvraimentd'importanepourl'instant,maisenauralorsqu'onutiliseral'instrution

(9)

Exemple.-Érivonsunprogrammemahinequiplae`A'àl'emplaementmémoire3000:400et

quiopie ettevaleuràl'emplaement3000:401.

Leprogrammeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV BYTE PTR [400℄,41

MOV AX,400

MOV SI,AX

MOV AX,401

MOV DI,AX

MOVSB

POP ES

POP DS

RET

sans oublier maintenant (e que nous n'avons pas fait jusqu'à maintenant) de sauvegarderla

valeurdeDS(et, dansunemoindremesure,deES)surlapilepuisque elle-iesthangéedans

leprogramme,puisdelaréupéreràlan.

Latradutiondeeprogrammeenlangagemahine donne:

1E

06

B8 00 30

8E D8

8E C0

C6 06 00 00 41

B8 00 04

89 C6

B8 01 04

89 C7

A4

07

1F

(10)

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 C6 06 00 04 41

-E CS:10E B8 00 04

-E CS:111 89 C6

-E CS:113 B8 01 04

-E CS:116 89 C7

-E CS:118 A4

-E CS:119 07

-E CS:11A 1F

-E CS:11B C3

-R BX

BX 0000

:

-R CX

CX 0000

:1C

-N MOVSB.COM

-W

Eriture de 0001C otets

-Q

Aprèsexéutionduprogrammemovsb.om,onvériequelaopie abieneulieu :

C:\COM>debug

-D 3000:400

3000:0400 41 41 42 6F 6E 6A 6F 75-72 00 00 00 00 00 00 00 AABonjour...

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

(11)

22.3.1.2 Copierépétée

Langagesymbolique.- Le préxeREP (pourREPete) permet de répéter unertain nombrede

fois l'instrution qui suit, e nombre de fois étant ontenu dans le registreCX (pour l'anglais

CounteXtendedregister).

Elle peut être employée en onjontion ave ertaines opérationsonernantles haînes de

aratères (MOVS, CMPS, SCAS, STOS) et don, en partiulier, ave des deux instrutions

déniespréédemmentpourobtenir:

REP MOVSB

et:

REP MOVSW

Langagemahine.-Cepréxeestodésurunotetpar:

| 1111 001z |

la valeur de z n'ayant de sens que pour CMPS et SCAS, e qui ne nous intéresse pas pour

l'instant,soitF2houF3h.

Exemple.- Érivonsunprogramme enlangage mahine quipermetted'érire `Bonjour'àl'em-

plaement mémoire3000:400,y omprisson terminateur 0,puisde opierle ontenu deette

haînedearatèresàl'adresse3000:408.

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV BYTE PTR [400℄,42

MOV BYTE PTR [401℄,6F

MOV BYTE PTR [402℄,6E

MOV BYTE PTR [403℄,6A

MOV BYTE PTR [404℄,6F

MOV BYTE PTR [405℄,75

MOV BYTE PTR [406℄,72

MOV BYTE PTR [407℄,0

MOV AX,400

MOV SI,AX

MOV AX,408

MOV DI,AX

MOV CX,8

REP MOVSB

POP ES

POP DS

(12)

Latradutiondeeprogrammeenlangagemahine donne:

1E

06

B8 00 30

8E D8

8E C0

C6 06 00 04 42

C6 06 01 04 6F

C6 06 02 04 6E

C6 06 03 04 6A

C6 06 04 04 6F

C6 06 05 04 75

C6 06 06 04 72

C6 06 07 04 00

B8 00 04

89 C6

B8 08 04

89 C7

F3 A4

07

1F

C3

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 C6 06 00 04 42

-E CS:10E C6 06 01 04 6F

-E CS:113 C6 06 02 04 6E

-E CS:118 C6 06 03 04 6A

-E CS:11D C6 06 04 04 6F

-E CS:122 C6 06 05 04 75

-E CS:127 C6 06 06 04 72

-E CS:12C C6 06 07 04 00

-E CS:131 B8 00 04

-E CS:134 89 C6

-E CS:136 B8 08 04

-E CS:139 8C C7

-E CS:13B B9 08 00

-E CS:13E F3

-E CS:13F A4

-E CS:140 07

-E CS:141 1F

-E CS:142 C3

-R BX

BX 0000

(13)

-R CX

CX 0000

:43

-N MOVSB.COM

-W

Eriture de 00043 otets

-Q

Aprèsexéutionduprogrammemovsb.om,onvériequel'ontrouvebienlaopiedelahaîne

dearatèresàl'emplaementmémoirehoisi:

C:\COM>debug

-D 3000:400

3000:0400 42 6F 6E 6A 6F 75 72 00-42 6F 6E 6A 6F 75 72 00 Bonjour.Bonjour.

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

(14)

22.3.2 Remplissage

On asouventàremplirune partiede lamémoireave lemême otet,parexempleavedes

`0'oudesespaes(dansleasdel'eaementdel'éran,parexemple).Lesonepteursdu8086

ontdonimplémenté unetelle primitive,souslenomdeSTOSpourSTOreaString.

22.3.2.1 Stokage d'un élément

Syntaxe.-En langagesymbolique,lesdeuxinstrutions:

STOSB

et :

STOSW

(pourSTOreaString)permettentdestokerl'otetontenudansleregistreAL,respetivement

lemotontenudansleregistreAX, àl'adresseES:DI.

Langagemahine.-Cesinstrutionssontodéessurunotetpar:

| 1010 101w |

avew = 0pourlapremièreetw = 1pourlaseonde,soitAAhetABh respetivement.

Aprèsletransfert,SIestinrémentéde1pourAL,de2pourAX,sil'indiateurdediretion

DFestnul;sinonilyadérémentationsiDFvautun.Cein'apasvraimentd'importanepour

l'instant,maisenauralorsqu'onutiliseral'instrutionenonjontionavelepréxeREP.

Exemple.-Érivonsunprogrammemahinequi plae`A'àl'emplaementmémoire3000:400.

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV AX,400

MOV DI,AX

MOV AL, 41

STOSB

POP ES

POP DS

(15)

Latradutiondeesous-programmeenlangagemahinedonne:

1F

06

B8 00 30

8E D8

8E C0

B8 00 04

89 C7

B0 41

AA

07

1F

C3

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 B8 00 04

-E CS:10C 89 C7

-E CS:10E B0 41

-E CS:110 AA

-E CS:111 07

-E CS:112 1F

-E CS:113 C3

-R BX

BX 0000

:

-R CX

CX 0000

:14

-N STOSB.COM

-W

Eriture de 00014 otets

-Q

Aprèsexéutionduprogrammestosb.om,onvériequel'onabienplaé`A'àl'emplaement

mémoirehoisi:

C:\COM>debug

-D 3000:400

3000:0400 41 6F 6E 6A 6F 75 72 00-42 6F 6E 6A 6F 75 72 00 Aonjour.Bonjour.

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

(16)

22.3.2.2 Remplissage d'une zone

Syntaxe.-Lesdeuxinstrutions:

REP STOSB

et :

REP STOSW

permettent de remplir la zone d'adresse ES:DI et de longueur elle ontenue dans le registre

CX(delongueurdoubledansleas d'unmot)ave, respetivement,l'otet setrouvantdansle

registreALoulemotdansleregistreAX.

Exemple.- Érivonsunprogrammemahine quiplae `A' dansleshuitpremièresasesàpartir

del'emplaementmémoire3000:400.

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV AX,400

MOV DI,AX

MOV AL,41

MOV CX,08

REP STOSB

POP ES

POP DS

RET

Latradutiondeesous-programmeenlangagemahinedonne:

1E

06

B8 00 30

8E D8

8E C0

B8 00 04

89 C7

B0 41

B9 08 00

F3

AA

07

1F

(17)

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 B8 00 04

-E CS:10C 89 C7

-E CS:10E B0 41

-E CS:110 B9 08 00

-E CS:113 F3

-E CS:114 AA

-E CS:115 07

-E CS:116 1F

-E CS:117 C3

-R BX

BX 0000

:

-R CX

CX 0000

:18

-N RSTOSB.COM

-W

Eriture de 00018 otets

-Q

Aprèsexéution duprogramme rstosb.om,onvériequel'onabien plaé`A' auxempla-

ementsmémoirehoisis:

C:\COM>debug

-D 3000:400

3000:0400 41 41 41 41 41 41 41 41-42 6F 6E 6A 6F 75 72 00 AAAAAAAABonjour.

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

(18)

22.3.3 Chargement

Nousavonsvuommentopierleontenudel'aumulateurversunemplaementmémoire,et

mêmeunezoned'emplaementsmémoire.Onpeutvouloirleontraire:opierd'unemplaement

mémoireversl'aumulateur.

Onpeutévidemmentfaireeiavel'instrutionMOV.Uneinstrutionnouvelleaétéintroduite

par les onepteurs du 8086 qui permet en plus d'inrémenter (ou dérémenter) la valeur du

registreSI.Ils'agitdeLODSpourl'anglaisLOaDaString.

22.3.3.1 Chargementd'un élément

Langagesymbolique.-Onutiliselesdeuxformes:

LODSB

et :

LODSW

pourharger,respetivement,l'otetoulemotd'adresseDS:SIdans leregistreAL,respetive-

mentAX.

Langagemahine.-Cesinstrutionssontodéessurunotetpar:

| 1010 110w |

avew = 0pourlapremièreetw = 1pourlaseonde.

Après le transfert, SI est inrémenté de 1 pour

w = 0

, de 2 pour

w = 1

, si l'indiateur de diretion DF est nul; sinon il y a dérémentation si DF vaut un. Cei n'a pas vraiment

d'importane pour l'instant, mais en aura lorsqu'on utilisera l'instrution en onjontion ave

LOOP.

Exemple.- Érivons unprogramme mahine qui plae `A' à l'emplaement mémoire3000:400

puisréupèreearatère,l'inrémente (donletransformeen`B')etleplaeen3000:401.

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,DX

MOV BYTE PTR [400℄,41

MOV AX,400

MOV SI,AX

MOV AX,401

MOV DI,AX

LODSB

INC AL

STOSB

POP ES

POP DS

(19)

Latradutiondeesous-programmeenlangagemahinedonne:

1E

06

B8 00 30

8E D8

8E C0

C6 06 00 04 41

B8 00 04

89 C6

B8 01 04

89 C7

AC

FE C0

AA

07

1F

C3

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 C6 06 00 04 41

-E CS:10E B8 00 04

-E CS:111 89 C6

-E CS:113 B8 01 04

-E CS:116 89 C7

-E CS:118 AC

-E CS:119 FE C0

-E CS:11B AA

-E CS:11C 07

-E CS:11D 1F

-E CS:11E C3

-R BX

BX 0000

:

-R CX

CX 0000

:1F

-N LODSB.COM

-W

Eriture de 0001F otets

(20)

Après exéution duprogramme lodsb.om, on vérie que l'on a bien plaé `A' et `B' aux

emplaementsmémoirehoisis:

C:\COM>debug

-D 3000:400

3000:0400 41 42 00 00 00 00 00 00-00 00 00 00 00 00 00 00 AB...

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

(21)

22.3.3.2 Chargementd'une zoneave transformation

Contexte.- On n'utilise pas es instrutions ave le préxe REP, puisqu'on surhargerait l'a-

umulateur. On les utilise, en liaison ave STOS pour une opie ave hangement durant le

transfert(ommenousl'avonsvusurl'exemplepréédent).Danseaslenombrederépétitions

estontrléparl'unedesinstrutionsdeboule suivantes.

Langagesymbolique.-1

o

)L'instrution:

LOOP déalage

dérémenteleontenuduregistreCXetprovoqueunsautrelatifourtsileontenudeCXn'est

pasnul,déalageétantomprisentre-128et 127.

-2

o

)L'instrution:

LOOPE déalage

ou:

LOOPZ déalage

dérémenteleontenuduregistreCXetprovoqueunsautrelatifourtsil'indiateurZFvaut1

etsileontenudeCXn'estpasnul,autrementditonsortdelaboulesi(CX) =0ousiZF=

0.

Cetteinstrutionpermet,parexemple,dereherherlepremiertermenonnuldansunesuite

de

n

otets.

-3

o

)L'instrution:

LOOPNE déalage

ou:

LOOPNZ déalage

dérémenteleontenuduregistreCXetprovoqueunsautrelatifourtsil'indiateurZFvaut0

etsileontenudeCXn'estpasnul,autrementditonsortdelaboulesi(CX)=0ousiZF=1.

Cetteinstrutionpermet,parexemple,dereherherlepremierterme nuldansunesuitede

n

otets.

Langagemahine.-1

o

)LOOPest odéesurdeuxotetspar:

| 1110 0010 | déalage |

soitE2hsuividudéalage.

-2

o

)LOOPE/LOOPZestodéesurdeux otetspar:

| 1110 0001 | déalage |

soitE1hsuividudéalage.

-3

o

)LOOPNE/LOOPNZest odéesurdeuxotetspar:

| 1110 0000 | déalage |

soitE0hsuividudéalage.

Exemple.-DansleasduodeASCII,lesminusules`a',...,`z'ontlesmêmesnumérosqueles

majusules`A',...,`Z' orrespondantesave20hdeplus.

Plaçons unehaînedearatères ériteexlusivementenmajusule,forméequede`A' pour

simplier,àl'adresse3000:400delongueur8puistransférons-laàl'adresse dedéalage408en

(22)

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV AX,400

MOV DI,AX

MOV CX,8

MOV AL,41

REP STOSB

MOV AX,400

MOV SI,AX

MOV AX,408

MOV DI,AX

MOV CX,8

DEBUT: LODSB

ADD AL,20

STOSB

LOOP DEBUT

POP ES

POP DS

RET

Latradutiondeesous-programmeenlangagemahinedonne:

1E

06

B8 00 30

8E D8

8E C0

B8 00 04

89 C7

B8 00 04

89 C7

B9 08 00

B0 41

F3

AA

B8 00 04

89 C6

B8 08 04

89 C7

B9 08 00

AC

04 20

AA

E2 FA

07

1F

(23)

Codonseprogramme:

C:\COM>debug

-E CS:100 1E

-E CS:101 06

-E CS:102 B8 00 30

-E CS:105 8E D8

-E CS:107 8E C0

-E CS:109 B8 00 04

-E CS:10C 89 C7

-E CS:10E B9 08 00

-E CS:111 B0 41

-E CS:113 F3

-E CS:114 AA

-E CS:115 B8 00 04

-E CS:118 89 C6

-E CS:11A B8 08 04

-E CS:11D 89 C7

-E CS:11F B9 08 00

-E CS:122 AC

-E CS:123 04 20

-E CS:125 AA

-E CS:126 E2 FA

-E CS:128 07

-E CS:129 1F

-E CS:12A C3

-R BX

BX 0000

:

-R CX

CX 0000

:2B

-N LOOP.COM

-W

Eriture de 0002B otets

-Q

Aprèsexéutionduprogrammeloop.om,onvériequel'onabien plaéhuit`A'etreporté

huit`a'auxemplaementsmémoirehoisis:

C:\COM>debug

-D 3000:400

3000:0400 41 41 41 41 41 41 41 41-61 61 61 61 61 61 61 61 AAAAAAAAaaaaaaaa

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

(24)

22.3.4 Comparaison

22.3.4.1 Comparaison de deuxotetsou de deux mots

Introdution.-Nousavonssouventbesoindeomparerdeuxhaînesdearatères,'est-à-direà

déterminersiellessontégalesousilapremièrevientavantlaseondedansl'ordrelexiographique.

Làenore,lesonepteursdu8086ontimplémenté ette opérationommeprimitiveave l'ins-

trutionCMPSpourl'anglaisCoMPareStrings.

Langagesymbolique.-Onutiliselesdeuxformes:

CMPSB

et :

CMPSW

pourlaomparaison.

Sémantique.-Cetteinstrutionsoustrait,respetivement,l'otetoulemotsetrouvantàl'empla-

ementES:DIàl'otetouaumotsetrouvantàl'emplaementDS:SIetpositionnelesindiateurs

en onséquene.Leontenu dela mémoiren'est pasaetépar ette instrution.Les registres

SIetDIsontinrémentésoudérémentéssuivantlavaleurdel'indiateurdediretion.

Langagemahine.-Cesinstrutionssontodéessurunotetpar:

| 1010 011w |

avew = 0pourlapremièreetw = 1pourlaseonde,'est-à-direA6houA7h.

22.3.4.2 Comparaisons itérées

Les deux instrution spréédentes peuvent être répétées si elles sont préédées des préxes

REP,REPNZ ouREPZ. Nousavonsdéjàrenontrélarépétitioninonditionnelle,voyonsmain-

tenantlesrépétitionsonditionnelles.

Répétitions onditionnelles.-Pourdéterminersideuxhaînesdearatèressontégales,onvales

ompareraratèrepararatère.L'instrutionderépétitionREPn'estpastrèsadaptéeàeas

arela faitdérire lesdeuxhaînesenentier alorsqu'on peuts'arrêterdèsqu'on trouvedeux

emplaementsquidivergent.

-1

o

)LepréxeREPNE ouREPNZ (pourREPetition ifNoEqualetREPetitionifNoZero)

permet larépétition de CMPSjusqu'àe que leontenu de CXsoit nul,àmoins que lesdeux

termessoientégaux.

-2

o

)LepréxeREPE ouREPZ (pourREPetitionifEqual etREPetitionif Zero) permet la

répétitiondeCMPSjusqu'àequeleontenudeCXsoitnul,àmoinsquelesdeuxtermessoient

diérents.OnarépétitiontantqueCXestnonnulet quel'indiateurZFest égalà1.

Langagemahine.-Cepréxeestodésurunotet,avelemêmeodequeREP:

| 1111 001z |

soitF2hpourREPNZ etF3hpourREPE.

Exemple.- Érivonsunprogramme quiplae lahaîne dearatères`Bon'àl'emplaementmé-

moire3000:400,lahaînedearatères`BOn'àl'emplaementmémoire3000:403puisquiom-

pare les deux haînes de aratères plaées aux déalages 400h et 403h sur trois aratères,

(25)

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,3000

MOV DS,AX

MOV ES,AX

MOV BYTE PTR [400℄,42

MOV BYTE PTR [401℄,6F

MOV BYTE PTR [402℄,6E

MOV BYTE PTR [403℄,42

MOV BYTE PTR [404℄,4F

MOV BYTE PTR [405℄,6E

MOV AX,400

MOV SI,AX

MOV AX,403

MOV DI,AX

MOV CX,3

REPZ CMPSB

JNZ NZ

MOV BYTE PTR [406℄,1

JMP FIN

NZ: MOV BYTE PTR [406℄,0

FIN: POP ES

POP DS

RET

Latradutiondeesous-programmeenlangagemahinedonne:

1E

06

B8 00 30

8E D8

8E C0

C6 06 00 04 42

C6 06 01 04 6F

C6 06 02 04 6E

C6 06 03 04 42

C6 06 04 04 4F

C6 06 05 04 6E

B8 00 04

89 C6

B8 03 04

89 C7

B9 03 00

F3

A6

75 07

C6 06 06 04 01

EB 05

C6 06 06 04 00

07

1F

(26)

Codonseprogramme:

C:\COM>debug

-E CS:0100 1E

-E CS:0101 06

-E CS:0102 B8 00 30

-E CS:0105 8E D8

-E CS:0107 8E C0

-E CS:0109 C6 06 00 04 42

-E CS:010E C6 06 01 04 6F

-E CS:0113 C6 06 02 04 6E

-E CS:0118 C6 06 03 04 42

-E CS:011D C6 06 04 04 4F

-E CS:0122 C6 06 05 04 6E

-E CS:0127 B8 00 04

-E CS:012A 89 C6

-E CS:012C B8 03 04

-E CS:012F 89 C7

-E CS:0131 B9 03 00

-E CS:0134 F3

-E CS:0135 A6

-E CS:0136 75 07

-E CS:0138 C6 06 06 04 01

-E CS:013D EB 05

-E CS:013F C6 06 06 04 00

-E CS:0144 07

-E CS:0145 1F

-E CS:0146 C3

-R BX

BX 0000

:

-R CX

CX 0000

:47

-N CMPSB.COM

-W

Eriture de 00047 otets

-Q

Aprèsexéutionduprogrammempsb.om,onvériequel'onabienplaé0àl'emplaement

mémoirehoisi:

C:\COM>debug

-D 3000:400

3000:0400 42 6F 6E 42 4F 6E 00 41-61 61 61 61 61 61 61 61 BonBOn.Aaaaaaaaa

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

(27)

22.3.5 Reherhe

Introdution.- Onaégalementsouventàreherhersi une haîne dearatères ontienttelou

telaratère.Ceidonnelieuàladernièreprimitiveimplémentéesurle8086pourleshaînesde

aratères,àsavoirSCASpourl'anglaisSCAn aString.

Langagesymbolique.-Onutiliselesdeuxformes:

SCASB

et:

SCASW

pourlaomparaison.

Sémantique.- Cetteinstrution soustrait,respetivement,l'otetou le motse trouvantà l'em-

plaement ES:DIà l'otet ou aumot se trouvantdans le registreAL ou AX et positionne les

indiateursenonséquene.Leontenudelamémoiren'estpasaetéparetteinstrution.Le

registre DI est inrémenté ou dérémenté suivant la valeur de l'indiateur de diretion, d'une

unitéoudeuxsuivantlataille destermes omparés.

Langagemahine.-Cesinstrutionssontodéessurunotet:

| 1010 111w |

avew = 0pourlapremièreet w = 1pourlaseonde.

Exemple.- Érivonsunprogrammequi plae lahaînede aratères`Bon'àl'emplaementmé-

moire 3000:400 puis qui reherhe si le aratère `o' apparaît dans elle-i, plaçant 2ou 1 à

l'emplaement3000:404suivantqu'ilapparaîtounon.

Lesous-programmeenlangagesymboliques'érit:

PUSH DS

PUSH ES

MOV AX,CS

MOV DS,AX

MOV ES,AX

MOV BYTE PTR [400℄,42

MOV BYTE PTR [401℄,6F

MOV BYTE PTR [402℄,6E

MOV AX,400

MOV DI,AX

MOV CX,3

MOV AL,6F

REPNZ SCASB

JNZ NZ

MOV BYTE PTR [404℄,2

JMP FIN

NZ: MOV BYTE PTR [404℄,1

FIN: POP ES

POP DS

(28)

Latradutiondeesous-programmeenlangagemahinedonne:

1E

06

B8 00 30

8E D8

8E C0

C6 06 00 04 42

C6 06 01 04 6F

C6 06 02 04 6E

B8 00 04

89 C7

B0 6F

F2

AE

75 07

C6 06 04 04 02

EB 05

C6 06 04 04 01

07

1F

C3

Codonseprogramme:

C:\COM>debug

-E CS:0100 1E

-E CS:0101 06

-E CS:0102 B8 00 30

-E CS:0105 8E D8

-E CS:0107 8E C0

-E CS:0109 C6 06 00 04 42

-E CS:010E C6 06 01 04 6F

-E CS:0113 C6 06 02 04 6E

-E CS:0118 B8 00 04

-E CS:011B 89 C7

-E CS:011D B9 03 00

-E CS:0120 B0 6F

-E CS:0122 F2

-E CS:0123 AE

-E CS:0124 75 07

-E CS:0126 C6 06 04 04 02

-E CS:012B EB 05

-E CS:012D C6 06 04 04 01

-E CS:0132 07

-E CS:0133 1F

-E CS:0134 C3

-R BX

BX 0000

:

-R CX

CX 0000

:35

-N SCASB.COM

(29)

Eriture de 00035 otets

-Q

Aprèsexéutionduprogrammesasb.om,onvériequel'onabienplaé2àl'emplaement

mémoirehoisi:

C:\COM>debug

-D 3000:400

3000:0400 42 6F 6E 42 02 6E 00 41-61 61 61 61 61 61 61 61 BonB.n.Aaaaaaaaa

3000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

3000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

22.3.6 Choix de la diretion

Dans tous les exemplesi-dessus, nous avonshoisila diretion roissante.Considérons un

exemplepourlequellehoixdeladiretionnepeutpasêtrearbitraire.

Exemple.- Considérons le problème suivant : déplaer lahaîne de aratère de l'emplaement

400h-420hàl'emplaement402h-422hdusegmentd'adresse 3000h.Àausedel'empiètement,

onnepeutpaseetuerledéplaementdansl'ordreroissant:lesotets400het401hpourraient

être opiés dans lesotets 402het 403h;mais, aumoment de déplaer l'otet 402h,la valeur

originelledeelui-iaurait disparue.

On doit donnéessairementopier dans l'ordreinverse : d'abord l'otet de l'emplaement

420hen422h.

Exerie.-Érireunprogramme ompletorrespondantauproblème i-dessus.

Langagesymbolique.- Onutilisel'indiateurDF (pourDiretion Flag)pourindiquerlesensde

laopie:s'ilvaut0,onopiedefaçonnaturelledansl'ordreroissant;s'ilvaut1,onopiedans

l'ordredéroissant.

Ilexistedeuxinstrutions:

CLD

et:

STD

pourspéieresens.L'instrutionCLD(pourCLearDiretionag)metl'indiateurdediretion

àzéro.L'instrutionSTD(pourSeTDiretion ag)metl'indiateurdediretion à1.

Langagemahine.-Cesinstrutionssontodéessurunotetrespetivementpar:

| 1111 1100 |

soitFChetpar:

| 1111 1101 |

(30)

22.4 Historique

Le premierordinateur (EDSAC, 1949;voirhapitre??)n'utilise auuneinstrution dema-

nipulationdesaratèresarilestorientéalul.Iln'yapasnonplusderegistred'index;pour

eetuerdesopérationssurlesélémentsd'untableau,ilestnéessaireauprogrammedemodier

lesadressesdesespropresinstrutions.

Leregistred'indexest inventéen1950.

Références

Documents relatifs

(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

de la routine de servie de l'interruption se trouve à l'adresse 4 × n pour le type n : les deux otets de IP se trouvent à l'adresse 4 × n et les deux otets de CS à l'adresse 4 × n +

Langage mahine.- L'éhange peut avoir lieu entre registres ou registre et ase mémoire :.

Cei doit être eetué à partir d'une page pour laquelle les adresses virtuelles sont. égales aux adresses physiques ( hh identity mapped ii

Lorsque deux droites sont perpendiculaires à une même troisième alors elles sont parallèles donc (AB) et (FE) sont parallèles... 2) Dans le triangle OFE, (AB) et (FE) sont parallèles

a - Erire un programme qui renvoie true si un triangle est retangle à partir des longueurs de es tés. b - Erire un programme qui alule la longueur de l'hypothénuse d'un

le nez offre des arômes de petits fruits rouges avec des