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.
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 oteto 2 est p + 1
, elle du troisième
oteto 3estp + 2
,...,elledun
-ièmeoteto n estp + n − 1
.Ilsut dondeonnaîtrel'adresse
dupremierotet,p
,quiest appeléel'adresse de lahaîne de aratères.
p + 1
, elle du troisième oteto 3estp + 2
,...,elledun
-ièmeoteto n estp + n − 1
.Ilsut dondeonnaîtrel'adresse
dupremierotet,p
,quiest appeléel'adresse de lahaîne de aratères.
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éterminerlandeelle-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'
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.
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;
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℄
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 plaelalongueurdansleregistreDXpuislareporteà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
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 ...
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 SIpourSoureIndex)doitontenirl'adressedel'élémentàopier;leouplederegistres
ES : DI
(aveDIpourDestination 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
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
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
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
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
-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
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
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 ...
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
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 ...
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 pourw = 1
, si l'indiateur de diretion DF est nul; sinon il y a dérémentation si DF vaut un. Cei n'a pas vraimentd'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
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
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
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
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
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 ...
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,
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
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 ...
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
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
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 |
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.