Vous êtes sur la page 1sur 16

COURS N 1 - Mon premier programme

.386
.MODEL FLAT, STDCALL
NCLUDE !ma"m3#!in$%&'e!(erne%3#.in$
NCLUDEL) !ma"m3#!%i*!(erne%3#.%i*
MonCo'e SE+MENT ,CODE,
Main-

p&". /.
$a%% E0i12ro$e""
MonCo'e ENDS
END Main
Le programme ci-dessus ne fait rien d'autre que terminer le processus, dans lequel il est, en appelant
la fonction particulire de Windows : "ExitProcess".
ien de !ien compliqu" #
$ais il a le m"rite d'%tre court et d'%tre compris ais"ment.
EXPLICATIONS
1) Type de machine utilis : ".386"
Permet l'usage du mode &' !its et l'utilisation du (eu d'instructions du &)* et ascendant.
2) Modle mmoire utilis : ".model flat, stdcall"
"flat", signifie plat. +'est le modle m"moire utilis" sous win&' ,windows &' !its-.
"stdcall", signifie : appel standard c'est-.-dire la fa/on dont sont transmis les paramtres . la fonction.
Les paramtres sont transmis de la droite 0ers la gauc1e.
3) Inclusion : "include C:\masm32\include\kernel32.inc"
"2nclude" signifie inclusion. 2l permet l'usage de la fonction qui est incluse dans le fic1ier li!rairie.
Le fic1ier "3ernel&'.inc" contient les d"clarations de toutes les fonctions comprises dans
"3ernel&'.li!".
Pour pou0oir utiliser une fonction d'une li!rairie il faut informer le compilateur du nom et de ses
paramtres.
+e fic1ier est donc trs important au moment de la compilation.
La fonction utilis"e est : "ExitProcess" et se trou0e dans la li!rairie "3ernel&'.li!".
4) Inclusion de librairie : "includelib C:\masm32\lib\kernel32.lib"
"2ncludeli!" signifie inclusion d'une li!rairie.
Le fic1ier "3ernel&'.li!" contient le code de la fonction "ExitProcess".
Le compilateur extraira la fonction et la (oindra au fic1ier ".o!(" qui en r"sultera.
5) Dclaration dun se!ment de code : "CODE Sement !code!"
4out programme informatique sous Windows n"cessite qu'il soit log" dans une 5one m"moire appel"e
segment.
6n segment de code est l'en0eloppe principale du programme.
+ette d"claration permet de signifier au compilateur et au lieur que nous 0oulons cr"er un segment
m"moire qui contiendra notre code.
") Dclaration dune #onction : ""ain:"
Le code doit-%tre contenu dans une en0eloppe appel"e proc"dure qui est elle m%me contenue dans le
segment de code. 70ec $78$&' une proc"dure peut %tre d"clar"e de fa/on !asique comme dans ce
code.
Le code de la proc"dure d"!ute . l'adresse repr"sent"e ici par "$ain:". Lors du liage $ain sera
remplac" par une adresse offset. 6ne adresse offset est une 0aleur relati0e par rapport au d"!ut du
code.
$)%aramtre de #onction : "#us$ %"
Enfin nous 9 0oil. #
+ette instruction du (eu d'instructions du microprocesseur, demande au microprocesseur de mettre sur
la pile le paramtre qui suit, c'est-.-dire la 0aleur num"rique :.
8i une fonction est appel"e et n"cessite le passage d'un paramtre il faudra utiliser l'instruction "pus1"
puis appeler la fonction. La s9ntaxe est la m%me pour tout passage de paramtres . une fonction.
&) 'onction (indo)s : "call E&it'rocess"
+ette instruction appelle la fonction "ExitProcess" de Windows qui se trou0e dans la li!rairie
"3ernel&'.li!".
Elle termine le programme.
*) 'in de #onction +Main+ :
;ans l'exemple ci-dessus la fin de la proc"dure se termine . l'instruction : "call ExitProcess".
1,) 'in de se!ment de code : "CODE ends"
2dem pour le segment de code.
"ends", signifie : fin de segment.
11) 'in de #onction principale : "end "ain"
2ndique au compilateur la fonction principale . partir de laquelle Windows d"!utera le programme et la
fin de l'application. L'adresse de la premire instruction d'un programme ex"cut"e par le processeur
s'appelle : Entr9Point ,point d'entr"e-.
COMPILATION

+opie5 le code puis colle5 le ,il est recommand" de le r""crire afin d'assimiler plus rapidement- dans
un nou0eau document au format texte a0ec l'extension ".asm".
<omme5 ce fic1ier par exemple : "+ours=.asm" et enregistre5 le dans le r"pertoire "+:>Exemple".
Puis en ligne de commandes tape5 :
C:\masm32\bin\ml /c /coff c:\Exemple\Cours1.asm
La compilation aura g"n"r" le fic1ier "+ours=.o!(" que 0ous copiere5 dans le r"pertoire "+:>Exemple".
Ensuite, utilise5 le lieur de la fa/on sui0ante :
C:\masm32\bin\link /subsystem:windows /out:Cours1.exe c:\Exemple\Cours1.obj
Les fic1iers "+ours=.o!(" et "+ours=.exe" sont g"n"r"s dans le r"pertoire courant. +opie5 les dans le
r"pertoire "+:>Exemple" si il n'est pas le r"pertoire courant.
$aintenant, 0ous pou0e5 %tre fier d'a0oir "crit 0otre premier programme en 7ssem!leur et sans trop
de peine.
+'est excitant n'est-ce pas ?
+a donne en0ie d'aller plus loin #
+@68 <A ' B $sgCox
+e cours a pour !ut d'affic1er une !oDte . messages . l'"cran.
.&)*
.$@;EL EL74, 84;+7LL
@P42@< +78E$7P:<@<E
2<+L6;E >masm&'>include>windows.inc
2<+L6;E >masm&'>include>Fernel&'.inc
2<+L6;E >masm&'>include>user&'.inc
2<+L6;EL2C >masm&'>li!>Fernel&'.li!
2<+L6;EL2C >masm&'>li!>user&'.li!
$es;onnees 8EG$E<4 ';747'
$sg ;C "Hello World #",:
4itle$sg ;C "$sgCox.asm",:
$es;onnees E<;8
$on+ode 8EG$E<4 '+@;E'
Main:
push M-./0 ICouton @F.
push /''12T TitleMs! I4itre.
push /''12T Ms! I$essage.
push 3455 I1wnd dans ce cas :.
call Messa!e-o6

push ,h
call 26it%rocess
$on+ode E<;8
E<; $ain
= - Pour r"aliser ce petit programme nous de0ons utiliser & fic1iers d'inclusion et ' !i!liot1ques :
Eic1iers d'inclusion : Windows.inc, Fernel&'.inc, user&'.inc
Eic1iers li!rairie : Fernel&'.li!, user&'.li!
Les fic1iers d'inclusion sont prioritaires et doi0ent tou(ours %tre pr"sent"s a0ant les fic1iers de li!rairie.
Le fic1ier d'inclusion : windows.inc est prioritaire sur tous les autres fic1iers d'inclusion et doit par
cons"quent %tre d"clar" en premier. Windows.inc contient toutes les d"clarations de constantes et
structures de Win&' il contient notamment :
$CJ@3
<6LL
Le fic1ier d'inclusion et de li!rairie : Fernel&'.inc contient toutes les d"clarations de fonctions
contenues dans la li!rairie Fernel&'.li!. La fonction ExitProcess fait partie de cette li!rairie.
Le fic1ier d'inclusion et de li!rairie : user&'.inc contient toutes les d"clarations de fonctions contenues
dans la li!rairie user&'.li!. La fonction $essageCox en fait partie.
'- Le segment ;ata repr"sente l'espace de donn"es de l'application. ;eux 0aria!les ont "t" d"clar"es
:
- $sg, fait r"f"rence au messageI
- $sg4itle, fait r"f"rence au titre de la !oDte de dialogue.
&- 6n segment de code : +ode a "t" cr"e. +e dernier contient les instructions qui r"aliseront
l'affic1age de la !oDte de dialogue : $sgCox.
L'ex"cution du code d"!ute . l'instruction pus1 $CJ@F.
@n utilise donc, la fonction $essageCox qui requiert K paramtres. ,Le n'expliquerai pas les
paramtres de cette fonction, pour cela faites r"f"rence . l'aide Win&'-
6ne fois la !oDte . messages affic1"e et aprs a0oir cliqu" sur le !outon @3 le programme se termine
et rend la main . windows en utilisant la fonction : ExitProcess.
M6'E84-+E M6E L7 P2LE ?
2magine5 une colonne rece0ant des +;. +ette colonne contient un certain nom!re de logements. +1acun de ces logements
peut rece0oir un +;. +ette colonne possde un !as et un 1aut ,+ool #-. 7 c1aque fois que 0ous a(oute5 un +;, en g"n"ral,
0ous commence5 par le 1aut. Elle se remplit en s'"tendant 0ers le !as. Lorsqu'il n'9 a plus d'emplacement, la colonne est
satur"e et il faudra en augmenter la capacit" pour qu'elle en re/oi0e d'autres.
Et !ien, la pile d'un programme c'est exactement pareil.
Les paramtres ,+;- de fonction sont plac"s sur la pile ,colonne . +;- en commen/ant par le 1aut, le deuxime .
l'emplacement en-dessous, etc... Lorsqu'il n'9 a plus d'espace ,logement- la pile est pleine et une d"faillance programme est
annonc"e.
2l important de tou(ours !ien 0"rifier que l'espace allou" . la pile est suffisant pour le !on fonctionnement du programme.
521 728I1T721
4rois registres sont utilis"s . cet effet. +e sont : 119 21%9 2-%:
11 est un registre de segment. Pour simplifier, il contient l'adresse de !ase du segment de donn"es relati0es aux paramtres et
0aria!les de fonction. +'est-.-dire le !as de la pile.
21% est le registre qui pointe tou(ours sur le somment de la pile 0ide. ;onc, il pointe sur le dernier emplacement rempli.
2-% est un registre qui est utilis" pour cr"er un cadre de pile pour la fonction concern"e. 2l facilite la gestion des paramtres,
0aria!les locales des fonctions.
521 I31T74;TI/31
Les instructions qui agissent sur la pile : push9 call9 ret9 ret#9 pop
push ;"cr"mente la pile de K octets et place la donn"e . cet emplacement.
call ;"cr"mente la pile de K octets et place l'adresse de la proc1aine instruction . ex"cuter au retour de la fonction.
ret ou retn ,ces deux intructions sont "qui0alentes- ;"pile et r"cupre l'adresse plac"e par l'instruction call.
ret# Eait la m%me c1ose que l'instruction ret mais utilise en plus la 0aleur segment dans le cas d'un appel lointain.
pop Enl0e la dernire 0aleur mise sur la pile.
enter +r"e un cadre de pile.
lea<e ;"truit le cadre de pile.
52 ;=D72 D2 %I52 :
Le cadre de pile est un espace de stocFage situ" dans le segment m"moire attri!u" au registre de pile : 88. +et espace sert
aux 0aria!les locales et aux paramtres des fonctions appel"es.
Le cadre de pile est g"r" par le registre ECP. 8on contenu est trs important. GrNce . la 0aleur qu'il contient, on peut acc"der
aux 0aria!les locales et aux paramtres de la fonction courante. 2l permet "galement de retrou0er les cadres de pile des
fonctions appelantes.
Le cadre de pile d'une fonction est cr"" en sau0egardant sur la pile le contenu du registre ECP puis, on copie dans ce dernier le
contenu du registre E8P. ECP est "gal, . ce ni0eau, . E8P et sa 0aleur ne c1angera (amais.
Le registre ECP contient un pointeur sur l'emplacement, sur la pile, lequel contient le pointeur du cadre de pile de la fonction
appelante.
En mode &' !its, pour acc"der aux paramtres on utilisera la notation sui0ante : OECP P )Q et pour acc"der aux 0aria!les
locales : OECP - KQ.
En mode =* !its, pour acc"der aux paramtres on utilisera la notation sui0ante : OCP P *Q et pour acc"der aux 0aria!les locales :
OCP - 'Q.
Etant donn" que le contenu du registre ECP est une 0aleur pr"cieuse, il ne sera (amais modifi". @n l'utilisera tou(ours de fa/on
index"e. L'index est un d"calage multiple de K ou de ' selon le mode du microprocesseur.
MuRest-ce quRun programme :
Casiquement, un programme est une ou plusieurs instructions comprises et ex"cut"es par le
processeur.
6ne instruction est une fonction gra0"e dans la puce, elle peut %tre sui0ie d'operande,s-. ;u point de
0ue du processeur, l'instruction est un code num"rique auquel on a attri!u" un mn"monique qui est
plus facile . retenir par le programmeur qu'un code.
Par exemple : mo0 dest, src
"mo0" est un mn"monique, et lorsque le processeur rencontrera cette instruction, il copiera le contenu
de l'operande source dans l'operande de destination.
6n programme ex"cuta!le au format Windows s'appelle un : Porta!le Executa!le ,PE-.
4out programme PE doit contenir :
6n segment contenant le code
6n segment contenant les donn"es
6n segment contenant la pile
+omme 0ous a0e5 pu le remarquer dans les deux pr"c"dants cours, il a "t" d"clar" des segments
sous la forme :
Data 128M23T data
Odonn"es informati0esQ
Data 23D1
;ode 128M23T code
donn"es ex"cuta!les
;ode 23D1
;onc, tout programme assem!leur de0ra comporter la d"claration de segments dans la forme
"nonc"e ci-dessus.
Lorsque 0ous clique5 sur un fic1ier ex"cuta!le ,.exe- le programme c1arg" d'implanter en m"moire le
code et les donn"es s'appelle le "Loader". +e dernier 0a lire le contenu du fic1ier et initialiser les
diff"rents segments en m"moire. L'application une fois c1arg"e dans la m"moire 0i0e sera ex"cut"e
par le processeur. Le programme se terminera lorsque le processeur aura ex"cut" la fonction
ExitProcess de windows. +omme son non l'indique cette fonction termine le processus dans lequel
l'application a "t" c1arg"e. Puis Windows reprend la main.
4out segment de code de0ra se terminer o!ligatoirement, afin de fermer l'application, par l'appel . la
fonction sp"ciale de Windows : ExitProcess.
5e se!ment de code
+e segment contiendra comme son nom l'indique tout le code de l'application.
5e se!ment de donnes
+e segment contiendra l'ensem!le des donn"es informati0es de l'application. +e sont les donn"es
glo!ales. 6ne donn"e est appel"e une 0aria!le ou une constante. 6ne 0aria!le peut a0oir son
contenu effac" alors que le contenu de la constante ne sera (amais effac".
5e se!ment de pile
+'est aussi un segment de donn"es mais ces dernires ne seront utilis"es qu'au ni0eau local, c'est-.-
dire dans le !loc d'une fonction. +'est dans pile que les paramtres de la fonction appel"e sont plac"s.
+e segment, contrairement au segment 'data' de0ra tou(ours %tre d"clar". 8'il ne l'est pas, le
compilateur se c1argera d'en d"clarer un par d"faut. 7u moment du c1argement en m"moire de
l'application, Windows place sur la pile du programme ex"cut" des donn"es. +'est la raison pour
laquelle un programme possde un tel segment.
;i>aprs9 le pro!ramme prsent dans le cours n? 2 implant en mmoire <i<e :
Pour enle0er toute am!iguSt", il faut sa0oir qu'un programme est constitu" d'une partie de donn"es et
de code. +et ensem!le est log" en m"moire. La gestion de la m"moire est effectu"e par le s9stme
d'exploitation.
;onc, lorsque 0ous clique5 sur l'icTne d'un fic1ier ex"cuta!le, le s9stme d'exploitation r"agit et
effectue les tNc1es sui0antes :
= - Le "loader" ,c1argeur d'application- 0a lire le contenu du fic1ierI
' - 2l r"cupre un certain nom!re d'informations afin de cr"er :
'.= - Le segment de donn"es est cr"" et les registres de segment se 0erront affect"s de l'adresse
p19sique. +es registres sont : ;8, E8, E8, 88 et sont des registres =* !its. Uous alle5 0ous demander
comment le s9stme fait-il pour stocFer une adresse &' !its dans un segment qui ne peut en rece0oir
que =*. Muestion pertinente. En fait le registre segment ne contient pas l'adresse p19sique mais un
num"ro d'index qui fait r"f"rence . une ta!le qui quant . elle contient l'adresse p19sique. Grosso
modo c'est cela. +'est un processus complexe que l'on 0erra plus tard.
'.' - 6ne fois le segment de donn"es cr"", le s9stme cr"era le segment de code. ;s qu'il aura log"
tout le code de l'application en m"moire, il initialisera le compteur d'instructions. +e compteur
d'instruction est le registre "2P" ,2nstructions Pointer-. +'est . partir de l. que l'application 0a
commencer . tra0ailler.
& - Lorsque l'application s'arr%te la main est redonn"e au s9stme d'exploitation.
+@68 <A & - Les registres du microprocesseur
+e cours a pour o!(ectif de 0ous montrer comment utiliser les registres. 8euls les registres de m%me
taille peu0ent %tre utilis"s ensem!le. @n ne peut pas copier le contenu d'un registre =* !its dans un
registre &' !its. Les deux op"randes doi0ent %tre de m%me taille tel que : mo0 eax, esp
70ant de commencer ce cours il est 0i0ement recommand" de consulter : Les registres du
microprocesseur
Les registres de segment ne sont pas directement utilisa!les. Pour cela, 2l faut utiliser les instructions
ad"quates. 2l est pr"f"ra!le de laisser le s9stme d'exploitation g"rer ces segments.
.&)*
.$@;EL EL74, 84;+7LL
2<+L6;E >masm&'>include>Fernel&'.inc
2<+L6;EL2C >masm&'>li!>Fernel&'.li!
$on+ode 8EG$E<4 '+@;E'
IPoint d'entr"e du programme
Main:

I+opie le contenu d'un registre &' !its 0ers un autre registre &' !its.
mo< ea69 ebp
mo< eb69 esp
mo< ed69 edi
mo< ec69 esi
mo< esi9 ec6
mo< edi9 ed6
mo< esp9 eb6
mo< ebp9 ea6
I+opie le contenu d'un registre =* !its 0ers un autre registre =* !its.
mo< a69 bp
mo< b69 sp
mo< d69 di
mo< c69 si
mo< si9 c6
mo< di9 d6
mo< sp9 b6
mo< bp9 a6
I+opie le contenu d'un registre ) !its 0ers un autre registre ) !its.
mo< ah9 bh
mo< al9 bl
mo< bh9 dh
mo< bl9 dl
mo< dh9 ch
mo< dl9 cl
mo< ch9 ah
mo< cl9 al
mo< cl9 dl
mo< bl9 al
mo< bl9 bl

ILe registre EEL7G8 n'est pas directement utilisa!le. 2l faut utiliser les instructions
Isp"ciales pour manipuler son contenu. "cup"ration et restauration du registre des drapeaux.
I70ant la restauration on met le !it : : +E . =.
push#d
pop ea6
mo< al91 I+E V =
push ea6
pop#d

ILe registre E2P n'est pas directement utilisa!le. 2l faut utiliser les instructions pus1 et ret, call et
ret ou
Ialors les instructions de saut : (cond, pour placer une adresse offset 0alide dans ce registre.

I=- 6tilisation des instructions pus1 et ret

push 'unction I@n place l'adresse Eunction sur la pile.
ret IPuis on d"pile a0ec l'instruction ret qui a pour effet de placer l'adresse dans le registre E2P.

<ext:

I'-6tilisation de l'instruction call

call 'unction1 IL'instrction call place l'adresse Eunction= dans le registre E2P

I&- 6tilisation de l'instruction de saut inconditionnel : (mp

@mp 'unction2 IL'instruction (mp place dans le registre E2P l'adresse Eunction'

EndProg:
IEin du programme
push ,h
call 26it%rocess

Eunction:
mo< ea69 esp
push 3e6t I@n place l'adresse de l'instruction : call Eunction= sur la pile.
ret I@n d"pile l'adresse dans le registre E2P

Eunction=:
mo< ea69 ec6
ret

Eunction':
mo< ea69 edi
@mp 2nd%ro! I(mp place dans le registre E2P l'adresse EndProg
$on+ode E<;8
E<; $ain
Le code pr"sent" ci-dessus 0ous a donn" un petit aper/u de ce qui peut %tre fait a0ec les registres.
Exercices
=. +omment s'appelle le registre qui d"finit les !its d'"tat aprs une op"ration arit1m"tique ?
'. Muel est le nom du groupe des registres du registre E+W ?
&. Muel est le nom du registre utilis" par le microprocesseur pour ex"cuter une instruction ?
K. Est-ce que les instructions sui0antes sont 0alides, "cri0e5 le code et compile5 pour rep"rer les erreurs :
mov eip, eax
mov eax, ebx
mov edi, si
mov cx, bx
X. Mu'est-ce qu'un registre ?
*. @Y trou0e-t-on les registres ?
Z. Est-ce que l'on peut copier a0ec l'instruction mo0 le contenu d'un registre ) !its dans un registre =* !its ?
+@68 <A K - 7dressages m"moire
+e c1apitre 0ous montrera, de fa/on pratique, comment utiliser les diff"rents modes d'adressage pour
acc"der . la m"moire 0i0e.
70ant de commencer . tra0ailler, (e 0ous in0ite . lire le document sui0ant : La m"moire 0i0e
L'exemple de code ci-dessous aura pour effet de remplacer certaines lettres du message "Hello World
#" par le caractre "toile "[" code 78+22 : '71 ,K'-. La dernire !oDte de message de0rait faire
apparaDtre le message sous la forme sui0ante : +AellA AorldAB+.
.&)*
.$@;EL EL74, 84;+7LL
@P42@< +78E$7P:<@<E
2<+L6;E >masm&'>include>windows.inc
2<+L6;E >masm&'>include>Fernel&'.inc
2<+L6;E >masm&'>include>user&'.inc
2<+L6;EL2C >masm&'>li!>Fernel&'.li!
2<+L6;EL2C >masm&'>li!>user&'.li!
$es;onnees 8EG$E<4 ';747'
$sg ;C "Hello World #",:
4itle$sg ;C "$sgCox.asm",:
$es;onnees E<;8
$on+ode 8EG$E<4 '+@;E'
Main:
I
I7dressage indirect en utilisant le registre edx.
ILe code sui0ant c1ange le caractre num"ro *
I,le septime- c'est-.-dire le "W" par le caractre "toile : "[".
ILe message affic1" de0rait %tre celui-l. : "Hello [orld #".
I

I 7dresse offset dans le registre edx.
mo< ed69 /''12T Ms!
ILe registre al contient le caractre "toile.
mo< al9 +A+
I7(oute le d"calage de * caractres.
I+e qui me permet d'o!tenir l'adresse offset de la lettre "W".
add ed69 "
I+opie le caractre "toile . l'emplacement m"moire point" par le registre edx.
mo< Ced6D9 al
I
I7ffic1age du r"sultat
I
push M-./0 ICouton @F.
push /''12T TitleMs! I4itre.
push /''12T Ms! I$essage.
push 3455 I1wnd dans ce cas :.
call Messa!e-o6

I-----------------------------------------------------------------
I
I7dressage indirect ind"x" en utilisant le registre ecx.
ILe caractre "o" de "Hello" sera remplac" par le caractre "[".
ILe message affic1" de0rait %tre celui-l. : "Hell[ [orld #".
I

I7dresse offset dans le registre ecx.
mo< ec69 /''12T Ms!
ILe registre al contient le caractre "toile.
mo< al9 +A+
IPlace le num"ro du caractre de0ant c1ang" : "o" de "Hello" dans le registre edx.
mo< ed69 4
I+opie le caractre "toile . l'emplacement m"moire point" par les registres ecx et edx.
mo< Cec6Eed6D9 al
IEait le m%me tra0ail que l'instruction pr"c"dente.
I+'est exactement la m%me instruction.
I+e codage est montr" uniquement pour %tre complet.
IElle ne modifie en rien, le r"sultat.
I+ette notation "edx[=" sert uniquement lorsque l'on 0eut traiter
Ides ta!leaux de t9pe : Word, ;word.
ILe nom!re ,scale- plac" aprs l'op"rateur de multiplication doit %tre
Iun multiple de la donn"e que nous sommes en train de traiter.
IPour un C9te c'est : =, pour un Word c'est : ' et pour un ;word c'est : K.
mo< Cec6Eed6 A 1D9 al
I
I7ffic1age du r"sultat
I
push M-./0 ICouton @F.
push o##set TitleMs! I4itre.
push o##set Ms! I$essage.
push 3455 I1wnd dans ce cas :.
call Messa!e-o6

I-----------------------------------------------------------------
I
I7dressage indirect ind"x" P d"calage en utilisant le registre e!x.
ILe dernier espace " " de "Hello World #" sera remplac" par "[".
ILe message affic1" de0rait %tre celui-l. : "Hell[ [orld[#".
I

I7dresse offset dans le registre e!x.
mo< eb69 /''12T Ms!
ILe registre al contient le caractre "toile.
mo< al9 +A+
IPlace le num"ro du caractre de0ant c1ang" : " " de "World #" dans le registre edx.
mo< ed69 4
I+opie le caractre "toile . l'emplacement m"moire point" par les registres e!xPedxPZ :
ICaseP2ndexP@ffset.
mo< Ceb6Eed6E$D9 al
I
I7ffic1age du r"sultat
I
push M-./0 ICouton @F.
push /''12T TitleMs! I4itre.
push /''12T Ms! I$essage.
push 3455 I1wnd dans ce cas :.
call Messa!e-o6

I-----------------------------------------------------------------
I7dressage direct.
ILe caractre "H" de "Hello World #" sera remplac" par "[".
ILe message affic1" de0rait %tre celui-l. : "[ell[ [orld[#".
I2l faut tou(ours pr"fixer le registre de segment ;8 sui0i des deux points
Ipour utiliser l'adressage direct.
I

ILe registre al contient le caractre "toile.
mo< al9 +A+
I+opie le caractre "toile . l'adresse offset de ::K:K:::1
mo< ds:C,,4,4,,,hD9 al
I
I7ffic1age du r"sultat
I
push M-./0 ICouton @F.
push /''12T TitleMs! I4itre.
push /''12T Ms! I$essage.
push 3455 I1wnd dans ce cas :.
call Messa!e-o6

I
IEin du programme
I
push ,h
call 26it%rocess
$on+ode E<;8
E<; $ain
3otes :
5e mode dadressa!e direct ne peut pas Ftre utilis par le d<eloppeur: Il #aut laisser lditeur
de lien G5I30:e6e) #aire le calcul des adresses: ;e mode nest montr Hue pour Ftre complet et
pda!o!iHue: 1i9 par a<enture9 le d<eloppeur utilise cette #aIon de #aire9 il se6poserait J de
serieuses complications de maintenance BBB
L'usage d'une adresse offset calcul"e par le programmeur ,adressage direct- ne peut %tre utilis"e que
sous le format sui0ant : egistre8egment:O7dresse@ffsetQ. 4el que montr" dans l'exemple : ds:
O::K:&:::1Q. Les croc1ets qui encadrent l'adresse offset sont o!ligatoires. 2ls indiquent le
d"r"f"rencement et permet d'entrer . l'int"rieur de la case m"moire. +onsid"re5 les comme une clef
qui ou0re une porte d'une pice.
70ec le mode d'adressage indirect ,usage des registres- il n'est pas n"cessaire de pr"fixer l'adresse
offset par un registre de segment. +ar tous les registres sont relatifs aux registres de segments. Le
cours consacr" aux registres indique cette particularit".
Uous a0e5 pu d"cou0rir par ces diff"rents exemples comment acc"der . la m"moire.
Le proc1ain cours, qui traitera des instructions de c1aDnes, nous permettra de 0oir de fa/on plus
approfondie le traitement des cases m"moires en lecture et "criture. Le traitement des c1aDnes
constitue une part importante de la programmation assem!leur mais "galement de tout s9stme de
d"0eloppement tel que : +PP, UC, L7U7 etc...
E1 oui # +ar affic1er une 0aleur num"rique . l'"cran n"cessite que l'on utilise un programme qui
permet de la con0ertir en une c1aDne de caractres 78+22.
7 l'issue de l'ensem!le des cours relatifs aux c1aDnes on aura constitu" un fic1ier source regroupant
l'ensem!le des fonctionnalit"s de traitement des c1aDnes de caractres 78+22.
Le 0iens de parler de c1aDnes 78+22 mais il faut sa0oir qu'en assem!leur, une c1aDne n'est pas
forc"ment une c1aDne de caractres 78+22. 6ne c1aDne n'est ni plus ni moins qu'une suite d'octets, de
words ou de dwords. Pour %tre clair, tout ta!leau contenant n'importe quel t9pe de donn"e.
7fin d'enle0er toute am!iguSt", lorsque (e parlerai de c1aDne se sera de c1aDne 78+22. Pour tout autre
t9pe de donn"e se sera le terme ta!leau que ('emploierai.
Kuestions :
=. Est-ce que l'instruction sui0ante est correcte ?
mo0 al, O::K:::::1Q
'. Muel est le maximum de m"moire que l'on peut adresser ?
&. 8i (e copie un caractre situ" . l'emplacement ::K:):::1, est-ce que (e peux utiliser la suite
d'instructions sui0antes ?
mo0 eax, ::K:):::1
mo0 cl, OeaxQ
K. Muel est la directi0e qui permet au lieur de calculer l'adresse offset d'une donn"e ?
X. En mode &' !its, peut-on placer une adresse offset dans le registre !x ?
*. 8i ('ex"cute les instuctions sui0antes, que se passe-t-il ?
$sg ;C "Con(our, 1omme du monde."
mo0 eax, @EE8E4 $sg
mo0 edx, OeaxQ
Z. L'instruction sui0ante est-elle 0alide ?
mo0 al, Oe!xPedxPecxQ
+@68 <A X - LE8 +H72<E8 ;E +77+4EE8