Vous êtes sur la page 1sur 31

ASSEMBLEUR

Module N3

I-INTRODUCTION:
est le langage de programmation de plus bas
niveau. Cela signifie quil est trop proche du
matriel, qui oblige le programmeur se soucier de
concepts proches du fonctionnement de la
machine, comme la mmoire.
transforme un fichier source contenant des
instructions, en un fichier excutable que le
processeur peut comprendre.
Les programmes faits en ASM sont plus petits, plus
rapides et beaucoup plus efficaces que ceux fait
avec des compilateurs

Langage humain

Langage de programmation : Haut niveau (Par


exemple, le C)

Compilation
Langage Assembleur

Assemblage

Langage Machine : (code binaire)


3

II- LE PROCESSEUR ET LES REGISTRES


Il existe plusieurs types de registres et chacun a son utilit.
registres gnraux (EAX, EBX, ECX, EDX)
Ils servent manipuler des donnes, transfrer des
paramtres lors de lappel de fonction DOS et stocker des
rsultats intermdiaires.

registres doffset ou pointeur (EIP, ESI, EDI, ESP, EBP)


Ils contiennent une valeur reprsentant un offset combiner
avec une adresse de segment

registres de segment(CS, DS, SS, ES, FS, GS)


Ils sont utiliss pour stocker ladresse de dbut dun segment. Il
peut sagir de ladresse du dbut des instructions du programme,
du dbut des donnes ou du dbut de la pile.

Un registre de flag
Il contient des bits qui ont chacun un rle indicateur.

LES REGISTRES GNRAUX


EAX -- accumulateur -- sert effectuer des calculs
arithmtiques ou envoyer un paramtre une
interruption
EBX -- registre auxiliaire de base -- sert
effectuer des calculs arithmtiques ou bien des
calculs sur les adresses
ECX -- registre auxiliaire (compteur) -- sert
gnralement comme compteur dans des boucles
EDX -- registre auxiliaire de donnes -- sert
stocker des donnes destines des fonctions
Ceci est leur utilisation thorique, mais dans la
pratique ils peuvent tre utiliss d'autres usages.

REGISTRE EAX

EAX(32 bits)

AX(16 bits)

AH(8bits)

AL(8bits)

JEU DINSTRUCTIONS
Dcrit lensemble des oprations lmentaires que le
microprocesseur pourra excuter.
Transfert de donnes: charger ou sauver en
mmoire (mov , )
Oprations arithmtiques (add ,mul ,div , )
Oprations logiques( and ,or , )
Contrle de squence :
- Branchement (jmp, )
- Test (cmp,)
7

DCLARATION DE VARIABLES
Les variables se dclarent de la manire suivante:
datas1 db ? ; datas1 est un byte non initialis
datas2 db 0FFh ; datas2 est un byte initialis FF (255 en hexadcimal)
datas3 dw ? ; datas3 est un word (16 bits)
datas4 db 5 dup (?) ; datas4 est un tableau de 5 bytes non initialiss
datas5 dw 10 dup (15) ; datas5 est un tableau de 10 byte initialiss 15
De manire gnrale:
DB
: 1 byte (8 bits) (Declare Byte)
DW
: 1 word (16 bits) (Declare Word)
DD
: 2 words (32 bits) (Declare Double)
DF,DP
: 6 bytes
DQ
: 8 bytes (64 bits)
DT
: 10 bytes
Les constantes peuvent tre crites en:
- dcimal: 1, 2, 3, 123, 45
- hexadcimal : 1h,2h,3h,12h,0Fh,0AD4h (noter la prsence du 0 quand le le
premier
chiffre du nombre en hexadcimal commence par une lettre)
- binaire : 1b,0b,1010b,111101b
8

Directives de base

Type

de processeur

.386, .486, ou .586


Dfinition des variables
.data
Dbut

du programme

.code
Appel

invoke

d'une fonction ou d'une procdure ou d'un sous-programme :


fonction a, b, c

; appelle fonction(a, b, c)

Le rsultat d'une fonction est toujours dans al, ax ou eax, selon que la taille du
rsultat est 8, 16 ou 32 bits.

III- LES FONCTIONS PRDFINIS


AFFICHAGE LECRAN
Syntaxe :
invoke StdOut , ADDR msg
Avec msg : le texte afficher lcran

Remarque: pour utiliser la fonction StdOut , il faut


importer les bibliotheques :
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

10

EXEMPLE1: AFFICHER UN MESSAGE A LCRAN


.486
.model flat, stdcall
option casemap:none
;--------------------------------------------------------------------------------------include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
;---------------------------------------------------------------------------------------.data
msg db "Bonjour : ",0
.code
start:
invoke StdOut , ADDR msg
ici:
jmp ici
end start

11

CONVERSION DE HEXA TO ASCII


Syntaxe :
invoke dwtoa , eax, ADDR z
La valeur hexadcimal de eax sera converti
en ascii
Exemple: eax = F -> z =15

12

EXEMPLE2 : SOMME DE 2 NOMBRES


.data ; variables globales initialises
x dd 60
y dd 70
.data?
z dd ? ; variable globale non initialise
.code
start:
mov eax, x
add eax, y
invoke dwtoa , eax, ADDR z
invoke StdOut ,ADDR z
ici: jmp ici
end start

13

IV- INSTRUCTIONS DE BASE

mov
L'instruction la plus utilise est l'instruction mov, qui copie la valeur
d'un oprande source dans un oprande destination. La syntaxe est
la suivante :

mov reg, reg (registre registre)


mov reg, mem (registre mmoire)
mov mem, reg (mmoire registre)
mov
reg, imed (registre valeur)
mov
mem, imed (mmoire valeur)

NOTE: Pas de transfert de mmoire mmoire


14

VARIANTES DE MOV : MOVZX ET MOVSX


Permettent de changer le type dune variable
Supposons que bl contient 0x94

movzx ax, bl
movsx ax, bl

-> ax = 0094
-> ax = FF94

movzx eax, bl
movsx eax, bl

-> eax = 00000094


-> eax = FFFFFF94

= + 148 sur 16 bits


= 108 sur 16 bits
= + 148 sur 32 bits
= 108 sur 32 bits

15

INSTRUCTIONS DE BASE ARITHMTIQUE

Incrmentation
INC AX
; AX <- AX + 1
Inc ma_variable
Dcrmentation
DEC AX
Dec ma_variable
Addition
ADD AX, 5
; AX <- AX + 5
ADD BH, toto
; BH <- BH + toto
Add toto, Cx
; toto <- toto + Cx
Soustraction
SUB AX, 5
; AX <- AX 5
SUB BH, toto
; BH <- BH toto
SUB toto, CX
; toto <- toto CX
Multiplication
Mul BX
; AX <- BH * AX
Division
div BX
; AX <- BH / AX

16

INSTRUCTIONS DE BASE LOGIQUE

AND bit bit

MOV AH, 0101b


; AH <- 5
MOV BH, 1001b
; BH <- 9
AND AH, BH ; AH <- AH AND BH; AH vaut 0001b, soit 1

OR bit bit

MOV AH, 0101b


; AH <- 5
MOV BH, 1001b
; BH <- 9
Or AH, BH
; AH <- AH OR BH; AH vaut 1101b , soit 13

17

INSTRUCTION

LEA

lea

calcule l'adresse effective de l'oprande source et place le


rsultat dans l'oprande destination.

lea reg, mem

C'est la faon de mettre dans un registre l'adresse d'une variable. Par


exemple, l'instruction : lea
eax, var1
place dans eax l'adresse mmoire de la variable var1.
Remarque : Ceci na gnralement dintrt que si toto est une
variable de type tableau.
18

V- LA PILE

Utilit d'une pile

Une pile est une zone de mmoire dans laquelle on peut stocker
temporairement des registres. Il s'agit d'un moyen d'accder
des donnes en les empilant. Ainsi il est ncessaire de dpiler
les valeurs stocker au sommet (les dernires avoir t
stockes) pour pouvoir accder aux valeurs situes la base
de la pile.
La pile est de type LIFO (Last In First Out), c'est--dire que la
premire valeur empile sera la dernire sortie
Les instructions PUSH et POP
Les instructions PUSH et POP sont les instructions qui servent
empiler et dpiler les donnes.
- PUSH registre met le contenu du registre dans la pile
(empilement)
- POP registre rcupre le contenu de la pile et le stocke dans le
registre (dpilage)

19

Ainsi, Les instructions:


PUSH BX
empile le contenu du registre BX,

POP AX
rcupre le contenu du sommet de la pile et le
transfre dans AX.

20

LES PROCDURES-FONCTIONS
La notion de procdure - fonctions
En langage assembleur, on appelle procdure
un sous-programme qui permet d'effectuer un
ensemble d'instructions par simple appel de la
procdure.
Les fonctions et les procdure permettent
d'excuter dans plusieurs parties du
programme une srie d'instruction, cela permet
une simplicit du code et donc une taille de
programme minimale.
21

22

VI- LE BRANCHEMENT :
LE REGISTRE FLAG
Les bits de cet ensemble sont appels "indicateurs".
Les instructions arithmtiques, logiques et de
comparaison modifient la valeur des indicateurs.
Les instructions conditionnelles testent la valeur des
indicateurs et agissent en fonction du rsultat.
Les bits les plus importants:
-ZF : Zero Flag - Indicateur zro
Si le rsultat d'une opration est nul (gal 0) ZF
passera 1.
-SF : Sign Flag - Indicateur de signe
SF passe 1 quand le rsultat est ngatif.
-CF : Carry Flag - Indicateur de retenue
CF=1 s'il y a une retenue de gnre, sinon CF = 0,

23

Instructions de comparaison
CMP destination, source

Compare la source et la destination; soustrait la source la


destination et met 1 dans le flag (drapeau) zero (ZF) si
le rsultat est nul et 1 dans le flag sign (SF) si le
rsultat est ngatif.
CMP AL, BL ; met 'ZF' a 1 si AL = BL

; met 'SF' a 1 si AL < BL


24

Instructions de branchement inconditionnel


JMP tiquette de destination

Ltiquette vers laquelle se fait le saut occupe une ligne du programme


assembleur mais ne prend pas de place en mmoire. Elle reprsente
une certaine adresse.
JMP FIN

FIN:
(ne pas oublier les : )

Change la valeur du compteur ordinal (IP : Instruction pointer).

25

Instructions de branchement conditionnel


Suit une instruction de comparaison (CMP) et ralise le saut en
fonction des drapeaux, c'est--dire du rsultat de la comparaison.
Sinon passe l'instruction suivante.
JZ DEBUS
JNZ PLACE
JS RET
JNS START

; saute DEBUS si le flag ZF est 1


; saute place si le flag ZF est 0
; saute RET si le flag SF est 1
; saute START si le flag SF est 0

En jouant sur l'ordre des registres on peut raliser toutes les


comparaisons (>, <, >=, <=, =, ! =) comme nous le dtaillerons dans la
suite.

26

La condition : if
MOV AL, op1
MOV BL, op2
; ou autres registres
CMP AL, BL ou BL, AL
J?? vrai
; instructions du cas_faux
JMP fin
vrai:
; instruction du cas_vrai
fin:
o J?? est un des branchements possibles (JZ, JNZ, JS ou JNS) en
fonction de la condition :
condition
traduction
explication
op1 = op2
CMP AL, BL puis JZ ...
op1-op2 = 0
op1 != op2
CMP AL, BL puis JNZ ...
op1-op2 != 0
op1 < op2
CMP AL, BL puis JS ...
op1-op2 < 0
op1 > op2
CMP BL, AL puis JS ...
op2-op1 < 0
op1 >= op2
CMP AL, BL puis JNS ...
op1-op2 >= 0
op1 <= op2
CMP BL, AL puis JNS ...
op2-op1 >= 0

27

EXEMPLE3 : VRIFIER SI UN NOMBRE EST NULL


.data ; variables globales initialises
x dd 60
msg1 db nombre est null ",0
msg2 db nombre est non null ",0
.code
start:
mov eax,x
cmp eax,0
jz alors
invoke StdOut , ADDR msg2
jmp fin:
alors:
invoke StdOut , ADDR msg1
fin:
ici: jmp ici
end start

28

Les itrations (avec compteur pour)


pour i de 1 limite faire
bloc__rpter
Fin pour
Litration se traduit comme suit :
MOV registre1, 1
MOV registre2, limite

; compteur i

re:
CMP registre2, registre1
JS fin
; limite-compteur<0 c'est dire
; compteur>limite
bloc__rpter
INC registre1
; incrmentation de i
JMP re
fin:
29

VII- LES TABLEAUX


Un tableau, ou encore chane, est une suite dlments de mme taille
(mme type) rangs conscutivement en mmoire (de faon contigu).
On dclare un tableau comme suivant :
tab dw 11,12, 3 ; un tableau de trois mots initialiss 11, 12, 3
On utilise le registre ESI qui pointe vers l'lment 0 du tableau.
lea esi , tab ; on stocke ladresse de premire lment du tab dans ESI

tab
ESI

0534FA40h

11
12
3

30

EXEMPLE4 : AFFICHER LES LMENTS DUN


TABLEAU

.data
tab dd 11,12,13
ele dd 0
espace db " ",0
.code
start:
lea esi,tab
mov ebx,0

pour:
cmp ebx ,3
jns fin
inc ebx
mov eax, [esi]
invoke dwtoa , eax,ADDR ele
invoke StdOut ,ADDR ele
invoke StdOut ,ADDR espace
add esi,4
jmp pour
fin:
ici: jmp ici
end start

31