You are on page 1of 6

Init Info

Techno

Hardware OS Rseaux
Programmation Liens

Internet

Math Info

CoursTechInfo > Programmation > Introduction l'assembleur


But de ces pages
Les registres du CPU
Les adresses mmoire
Assembleur avec DEBUG
Modes d'adressage
Assemblage et dition de liens

Introduction au langage assembleur


But de ce sujet
L'objectif de ces pages est de donner un aperu succinct du langage assembleur. Ce
langage est dit de "bas niveau " car il est troitement li l'architecture du microprocesseur.
"Registres" , "Adresses mmoires", "Interruptions", "Appels systme" ... voil une srie de
notions qui risquent fort de rester thoriques. Ce serait dommage, alors qu'il est si simple
de les aborder par la pratique l'aide du langage assembleur et en visualisant l'aide d'un
debugger les instructions qui s'excutent et les registres o cela se passe.

Les registres du processeur


Les registres dcrits ci-dessous sont les registres du 8086, l'anctre des processeurs qui
sont au c?ur de nos PC actuels. Ces processeurs ont volu depuis tout en restant
compatibles avec leur anctre (compatibilit ascendante). Cette description devrait donc
suffire se faire une ide de la structure d'un microprocesseur.

Registres de donnes
AX, BX, CX et DX
Ce sont des registres 16 bits du 8086, ils peuvent chacun tre scinds
pour
y
entreposer
deux
variables
d'un
octet
Ainsi, le registre 16 bits AX peut tre considr comme l'adjonction de
deux registres 8 bits AH et AL (H =high, L =low)
Certaines instructions ddient ces registres des rles spcifiques :
AX "accumulator" l'accumulateur est privilgi pour certaines oprations arithmtiques ainsi que les
oprations d'entre/sortie
BX "base register" il est appel registre de base car l'adressage en mmoire peut se faire par son
intermdiaire
CX "count register" est implicitement le registre compteurs de boucles pour les instructions
rptitives.
(CL pour les oprations de dcalage)
DX "data register" sert dans certaines circonstances d'extension l'accumulateur.
Registres d'adresses
Registres dits d'index :
Registres de base

SI
DI
BP
SP

"Source index"
"Destination index"
"Base pointer"
"Stack pointer"

Registres de segments
CS
DS

"Code Segment"
"Data Segment"

= adresse de base pour le programme


= adresse de base pour les donnes

ES

"Extra Segment"

= adresse de base pour d'autres donnes

SS

"Stack Segment" = adresse de base pour la pile

Registre d'tats

Ce registre contient les flags, ce sont des bits qui basculent d'un tat
l'autre en fonction des rsultats de l'excution d'oprations arithmtiques
ou
logiques.
- Le flag Carry passe 1 si une addition donne lieu un report.
- Le flag Signe passe 1 si le bit le plus significatif du rsultat vaut 1.
- Le flag Zero passe 1 si le rsultat de la dernire opration est nul.
etc.
Ces flags servent entre autre aux instructions de sauts conditionnels.
L'instruction pointeur
IP Aussi appel compteur ordinal est un registre qui s'incrmente sans
cesse. Il contient en permanence l'adresse de la prochaine instruction
excuter. "Faire un saut" dans un programme revient inscrire dans le
registre IP l'adresse de l'instruction o le programme doit se rendre.
L'incrmentation de l'Instruction Pointer reprend alors depuis cette
nouvelle valeur pour poursuivre la nouvelle squence d'instructions.

Les adresses mmoires


Les Pentium et AMD actuels utilisent deux modes de fonctionnement : le mode rel et le
mode
protg.
Le mode protg est gr par Windows ou Unix, le mode rel (on devrait dire mode
segment) est l'tat dans lequel on se trouve au dmarrage de la machine. La capacit
d'adressage
est
limite

1
Mo
comme
pour
les
premiers
8086.
Les adresses sont donnes sous la forme Segment : Offset
Exemple :
Sous DOS ( mais Windows mule parfaitement la chose)
l'adresse B800:0000 est l'adresse de base de la mmoire vido en mode
texte. Cette adresse est donc celle du byte contenant le code ASCII du
caractre situ dans le coin suprieur gauche de l'cran.
Le segment
B800 dbute

l'adresse
physique
B8000.
L'adresse physique s'obtient en calculant Segment x 16 + Offset
Manipulation :
Avec l'utilitaire DEBUG, crivons 41H = le code ASCII du A majuscule
l'adresseB800:0400 = adresse physique B8400 de sorte faire
apparatre ce 'A' au milieu de l'cran.
C:\>debug
-e B800:400
B800:0400 20.41 07.4E 20.
-q

Utilisation des registres pour former des adresses


Les adresses 20 bits sont constitues dans les registres en associant les registres de
segment et les registres d'adresses. Les registres d'adresses sont associs par dfaut
chacun
des
registres
de
segment.
CS est
toujours
utilis
avec
IP
pour
former
l'adresse
logique CS:IP
SS est associ au Stack Pointer SP pour former l'adresse du dessus de la pile SS:SP
le Base Pointer BP est lui aussi par dfaut associ au Stack Segment SS
DS le Data Segment sert en principe de segment de base pour les adresses formes avec
les registresSI, DI et BX (source index, destination index et base register)

Ecrire en assembleur avec l'utilitaire DEBUG

Toujours avec le programme debug, la commande 'a' permet d'encoder des instructions
saisies en assembleur.
a
mov
mov
mov
mov
mov
ret

ax,B800
ds,ax
cx,4E41
di,400
[di],cx

Utilisez la commande T pour tracer une une, les instructions de ce bout de programme.
Elles placent l'adresse du segment B800 dans le registre DS (data segment)
Le registre CL reoit le code ASCII d'un 'A' majuscule (41) (Ne soyez pas troubls par la
valeur 4E inscrite dans le registre CH, elle va joindre des attributs au code ASCII contenu
dans CL pour faire ressortir le caractre en jaune sur fond rouge)
Le nombre plac dans le registre DI indique le dplacement par rapport au dbut de la
mmoire cran.

Les modes d'adressage


Nous
n'avons
encore
utilis
qu'une
instruction,
l'instruction
MOV.
L'exemple ci-dessus illustre dj le fait que les oprandes peuvent tre spcifies de
diffrentes manires. Ce sont les modes d'adressage.
MOV DS , AX

Adressage de registres
la valeur du registre AX est recopies dans le registre DS
MOV CX , 4E41 Adressage immdiat
la valeur immdiate 4E41 est recopie dans CX
MOV [DI] , CX
Adresse en mmoire
[DI] mis entre crochets signifie " l'adresse donne par DI"
(cette adresse est l'offset ajouter au segment de donnes)
L'instruction MOV attend deux oprandes, le premier indique la destination du dplacement
de
la
donne,
le
second
oprande
indique
la
source.
La destination peut tre un registre, une adresse mmoire ou un registre de segment (sauf
pour
le
registre
CS
qui
ne
peut
jamais
tre
une
destination)
La source peut tre un registre, une adresse mmoire, un registre de segment ou une
valeur immdiate.
Le tableau ci-dessous inventorie toutes les manires d'utiliser l'instruction MOV
r1 reoit la valeur identique celle contenue dans r2
MOV r1 , r2
Le registre r est initialis avec une valeur immdiate
MOV r , i
Ecriture d'une valeur immdiate en mmoire
MOV m , i
Lecture en mmoire l'adresse m en destination du registre r
MOV r , m
Ecriture en mmoire partir du registre r
MOV m , r
Echanges entre registres de segment et la mmoire
Lecture: s := m
MOV s , m
Ecriture: m := s
MOV m , s
Echanges entre registres gnraux et registres de segment
MOV s , r
MOV r , s
Dans cette liste les adresses 'm' sont spcifies en plaant une valeur de
l'offset et/ou des noms de registres entre crochets. Exemples : [2000] ; [BP] ;
[BP+2000] ; [SI] ; [BP+SI] ; [BP+SI+2000]

En fait toutes les combinaisons ne sont pas acceptes ! Les combinaisons valides sont
celles que l'on forme en ne prenant pas plus d'un lment dans l'une des trois colonnes du
tableau :
BX SI
BP DI

nombre
Autrement dit, il ne peut pas il y avoir simultanment dans une adresse 2 registres de base
(dont le nom commence par b) ni 2 registres d'index (dont nom se termine par i )
Il est parfois ncessaire de prciser la taille de la valeur lire. On fait alors prcder
l'adresse de la donne par BYTE PTR ou par WORD PTR selon que l'adresse dsigne un
ou deux octets.

Aperu rapide de quelques autres instructions


Les instructions MOV nous ont t utiles pour illustrer les modes d'adressage mais avec les
MOV il nous est juste possible de dplacer les donnes d'un endroit l'autre. Il nous faut
d'autres instructions pour faire des oprations arithmtiques et logiques, des sauts, des
appels des fonctions, des interruptions etc.
Voici donc d'autres instructions. La liste est loin d'tre complte mais elle doit suffire pour
se faire une ide de ce que sont les instructions en gnral.
Oprations arithmtiques et logiques lmentaires : ADD SUB CMP AND TEST OR
XOR
Modes d'adressage accepts: r,m
m,r
r,r
m,i et r,i
Multiplications et divisions: MUL
Exemples : MUL BYTE PTR Valeur
MUL WORD PTR Valeur
DIV BYTE PTR Valeur
DIV WORD PTR Valeur

IMUL

DIV

IDIV

AX := AL x Valeur
DX.AX := AX x Valeur
AL := AX / Valeur
AX := DX.AX / Valeur

Incrmentation, dcrmentation, inversion logique, ngation : INC DEC NOT NEG


Appel d'un sous-programme :

CALL label

Sauts inconditionnels JMP label


Sauts conditionnels JZ (=JE) JNZ ( = JNE) JC JNC JS JNS

Assemblage et dition de liens


TASM est l'assembleur de Borland. Nous l'utilisons avec la commande TLink dj utilise
avec l'environnement de dveloppement intgr TC ou le compilateur TCC. La vrification
de l'excution se fait avec le Turbo Debugger " TD ". Tapez simplement TASM pour voir les
options disponibles. Ces options sont assez rbarbatives aussi une fois que l'on sait celles
qui nous conviennent on a tout intrt les fixer une fois pour toute dans un fichier de
commande.
Voici les fichiers A.bat pour commander l'assemblage et L.bat pour demander l'dition de
liens.
A.bat :

TASM /zi /c /la %1.asm;

L.bat :

TLINK /v /k %1.obj;

Pour rappel, on part d'un code source ".asm" L'assemblage en fait un code objet ".obj"
relogeable qui son tour est trait par l'diteur de lien pour en faire un code excutable
".exe" Accessoirement l'assembleur produit aussi un "listing" qui est un document destin

tre imprim. On y retrouve cte cte, le code source et le code binaire correspondant
not en hexadcimal.

... suivre
CoursTechInfo > Programmation > Introduction l'assembleur

You might also like