Chapitre4_3_assembleur
Chapitre4_3_assembleur
Chapitre4_3_assembleur
Chapitre 4
Assembleur x86
Les entrées Sorties en assembleur
• Pour réaliser les opérations standards (affichage, saisie), le sustème d’exploitation (ici
DOS) forunit les fonctions pré-écrites suivantes:
• Affichage d’un caratère: mov DL, “A”; caractère A est transfére dans DL
mov AH, 2 ; fonction no. 2
i t 21h
int ; appell au DOS
• Affichage d’un chaine de caractères: mov DX, offset chaine; pointe vers l’adresse du premier
caratère de la chaine de caractères chaine
mov AH, 09h; fonction no. 9
int 21h;
• Saisie d’un caratère: mov AH, 1; fonction no. 1
(avec écho) int 21h ; résultat est mis dans AL
2
Les entrées Sorties en assembleur
(suite)
3
APPLICATION
Soit
i la
l déclaration
d l i dud segment de
d données
d suivante
i :
Data Segment
Chaine DB 15 dup(?)
p( )
message_1 DB ‘Bonjour$’
message_2 DB ‘Nous somme les étudiant LF2 STIC de l’ISIMM$’
Data ends
11. Pourquoi
P i on utilise
tili lel symbole
b l $
2. Ecrire un programme assembleur qui permet l’affichage des 2 message avec retour au ligne
5
Opérations arithmétiques (entiers)
¾ ADD : addition
¾ ADC : addition avec retenue de 1 ajoutée si CF = 1
¾ SUB : soustraction
¾ SBB : soustraction avec retenue de -1 ajoutée si CF = 1
¾IMUL : multiplication avec entiers signés (résultat sur taille
double)
¾ MUL : multiplication avec entiers non signés (résultat sur taille
double)
¾ IDIV : division entière signée
¾ DIV : division entière non signée
¾ INC : incrémentation de 1
¾ DEC : décrémentation de 1
¾ NEG : opposé
¾ CMP : comparaison sous forme de soustraction sans
stockage résultat
Les instructions d’addition
Instruction
Instr ction ADD : Addition
Fonction : Exécute une addition. Le résultat est dans « destination »
Syntaxe : Add Destination, Source ; Destination= Destination + Source
Instruction INC
Fonction : incrémentation
Syntaxe : Inc Destination ; Destination= Destination + 1
Exemple :
OF DF IF TF SF ZF AF PF CF
ADD BL,17
ADD CL,BL ** ‐‐ ‐‐ ‐‐ ** ** ** ** **
ADC CH, BH 7
Les instructions de Soustraction
Instruction SUB : Subtract
Fonction : Exécute une soustraction. Le résultat est dans « destination »
S t
Syntaxe : SUB Destination
D ti ti ,Source
S ; Destination=
D ti ti Destination
D ti ti - Source
S
IInstruction
t ti DEC
Fonction : décrémentation
Syntaxe : DEC Destination ; Destination= Destination - 1
Exemple :
SUB BL,17
SUB CL
CL,BL
BL
OF DF IF TF SF ZF AF PF CF
SBB CX, BH
** ‐‐ ‐‐ ‐‐ ** ** ** ** ** 8
Instruction NEG : Negateg
Fonction : L'instruction NEG soustrait l'opérande de 0, en prenant son
complément à 2; elle affecte les flags à un de la même façon que
ll'instruction
instruction SUB, selon les conditions suivantes (sinon ils restent à 0):
Syntaxe : NEG Opérande ; Opérande = 0 - Opérande
Instruction CMP: Compare p
Fonction : L'instruction CMP effectue la même opération que SUB,
mais n'altère pas les opérandes et ne garde pas le résultat, elle a simplement
pour but le positionnement des flags à l'intention
l intention des instructions de saut
saut.
Syntaxe : CMP Destination,Source
OF DF IF TF SF ZF AF PF CF
Exemple : ** ‐‐ ‐‐ ‐‐ ** ** ** ** **
NEG AL ;complément à 2 de AL
CMP DX 27
DX,27
9
Les instructions de Multiplication
Instruction MUL : Multiply
Fonction : Dans cette instruction, la source est un registre (double-
mot, mot ou octet) ou bien un emplacement mémoire, le second opérande
doit se trouver, s'il s'agit d'un octet, dans AL et dans AX pour un mot. Le
produit à double longueur, pour une multiplication à octets, est retourné dans
AX (octet haut dans AH et octet bas dans AL) et pour des mots mots, dans DX (mot
haut) et AX (mot bas)
Syntaxe : MUL Source
Instruction IMUL : Multiply signed
Fonction : Multiplication signé
OF DF IF TF SF ZF AF PF CF
Syntaxe : IMUL Source
** ‐‐ ‐‐ ‐‐ ? ? ? ? **
Exemple :
MOV AL,6 ;AL=6
MOV CL,8 ;on ne p
peut pas
p utiliser de valeur immédiate
IMUL CL ;AX= AL*CL
10
Les instructions de division
Instruction DIV : Divide
Fonction : La source est un diviseur octet, mot ou double- mot se
trouvant dans un registre général ou un emplacement mémoire. Le dividende
est un opérande de double longueur se trouvant, soit dans AH et AL pour une
opération 8 bits, soit dans DX et AX pour une opération 16 bits. Dans le
premier cas,
cas le quotient est retourné dans AL et le reste dans AH; dans le
second cas le quotient est retourné dans AX et le reste dans DX.
Syntaxe : DIV Source
Instruction IDIV : Divide signed
Fonction : Division signé
OF DF IF TF SF ZF AF PF CF
Syntaxe : IDIV Source
** ‐‐ ‐‐ ‐‐ ? ? ? ? **
Exemple :
MOV AL,6 ;AL=6
MOV CL,8 ;on ne p
peut pas
p utiliser de valeur immédiate
IDIV CL ;AX= AL*CL
11
Opérations logiques
4 opérations logiques : fonctionnement bit à bit
¾ AND : Et logique
¾ Application d'un masque sur une donnée : garde les bits de
la
¾donnée pour lesquels le masque est à 1, sinon met le bit à 0
¾ OR : OU logique
¾ XOR : XOR logique
¾ NOT : inverse les bits
¾ Exemples
¾ 0110 AND 0011 = 0010
¾ 0110 OR 0011
0011= 0111
¾ 0110 XOR 0011 = 0101
¾ NOT 0110 = 1001
Les instructions de manipulation de bit
OF DF IF TF SF ZF AF PF CF
Instruction And: Et logique
0 ‐‐ ‐‐ ‐‐ ** ** ? ** 0
S t
Syntaxe :A
Andd destination,Source
d ti ti S
Fonction : Permet l’exécution de l’opération logique AND entre sourc
et destination et le résultat sera stocké dans destination.
Instruction OR: OU logique
Syntaxe : OR destination,Source
Fonction : Permet l’exécution
l exécution de l’opération
l opération logique OR entre source
destination et le résultat sera stocké dans destination.
Instruction XOR: OU exclusive
S t
Syntaxe : XOR destination,Source
d ti ti S
Fonction : Permet l’exécution de l’opération logique XOR entre sourc
et destination et le résultat sera stocké dans destination.
13
Les instructions de manipulation de bit
14
Décalage et rotations
8 opérations
1.
1 SAR : décalage arithmétiques droite
2. SHR : décalage logique droite
3. SAL : décalage arithmétique gauche
4. SHL : décalage logique gauche
5. ROL : rotation gauche
6. ROR : rotation droite
7. RCL : rotation gauche de la donnée + la retenue
8
8. RCR: rotation droite de la donnée + la retenue
OF DF IF TF SF ZF AF PF CF
** ‐‐ ‐‐ ‐‐ ** ** ? ** **
Instruction SAL/SHL: Shift Arithmetic Left / Shift Logical Left
S t
Syntaxe : SAL destination,
d ti ti compteur
t / SHL destination,
d ti ti compteur
t
Fonction : décalage arithmétique ou logique à gauche. Le nombre
de décalage est spécifié par le compteur. Chaque décalage à
gauche est équivalent a une multiplication par 2
CF SAL/SHL (8‐16 bits) 0
SAR(8‐16 bits) CF
16
Les instructions de manipulation de bit
Exemple
p
Mov AX, 003Fh
Mov BX, 27E3H
SAL AL
AL,1
1
SHL AX,CL
SAR AL,Cl
SHR BX,1
17
Les instructions de manipulation de bit
OF DF IF TF SF ZF AF PF CF
** ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ **
Instruction RCL: Rotate Left through Carry
S t
Syntaxe : RCL d
destination,
ti ti compteur
t
Fonction : Rotation à gauche via l’indicateur de retenue CF.
OF DF IF TF SF ZF AF PF CF
Instruction ROL: Rotate Left ** ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ ‐‐ **
Syntaxe : ROL destination, compteur
Fonction : Rotation à gauche
20
Instructions de contrôle
24
Mnémonique Sens Equivalent OF SF PF ZF CF
Nombre non signés
JA Jump if Above JNBE ‐‐ ‐‐ ‐‐ 0 0
JNA Jump if Not Above JBE ‐‐ ‐‐ ‐‐ 1 1
JAE Jump if Above or Equal JNB ‐‐ ‐‐ ‐‐ ‐‐ 0
JNAE Jump
p if Not Above or JB/JC ‐‐ ‐‐ ‐‐ ‐‐ 1
Equal
JB Jump if Below JNAE/JC ‐‐ ‐‐ ‐‐ ‐‐ 1
JNB J
Jump if N
Not Below
B l JAE ‐‐ ‐‐ ‐‐ ‐‐ 0
JBE Jump if Below or Equal JNA ‐‐ ‐‐ ‐‐ 1 1
JNBE Jump if Not Below or JA ‐‐ ‐‐ ‐‐ 0 0
Equal
JC Jump if Carry ‐‐ ‐‐ ‐‐ ‐‐ 1
JNC Jump if Not Carry ‐‐ ‐‐ ‐‐ ‐‐ 0
JCXZ Jump if CX=0 ‐‐ ‐‐ ‐‐ ‐‐ ‐‐
JE Jump if Equal JZ ‐‐ ‐‐ ‐‐ 1 ‐‐
JNE Jump if Not Equal JNZ ‐‐ ‐‐ ‐‐ 0 ‐‐ 25
Mnémonique Sens Equivalent OF SF PF ZF CF
JZ Jump if Zero (ZF=1) JE ‐‐ ‐‐ ‐‐ 1 ‐‐
JNZ Jump if Not Zero JNE ‐‐ ‐‐ ‐‐ 0 ‐‐
JPE Jump if on Parity Even JP ‐‐ ‐‐ 1 ‐‐ ‐‐
(paire)
JP Jump on Parity JPE ‐‐ ‐‐ 1 ‐‐ ‐‐
26
Mnémonique Sens Equivalent OF SF PF ZF CF
Nombre signés
JG Jump if Greater JNLE ** ** ‐‐ 0 ‐‐
JNG Jump if Not Greater JLE ** ** ‐‐ 1 ‐‐
JGE Jump if Greater or JNL ** ** ‐‐ ‐‐ ‐‐
Equal
JNGE Jump if Not Greater or JL ** ** ‐‐ ‐‐ ‐‐
Equal
JL Jump
p if Less JNGE ** ** ‐‐ ‐‐ ‐‐
JNL Jump if Not Less JGE ** ** ‐‐ ‐‐ ‐‐
JLE Jump if Less or Equal JNG ** ** ‐‐ 1 ‐‐
JNLE Jump if Not Less or JG ** ** ‐‐ 0 ‐‐
Equal
JS Jump if Sign ‐‐ 1 ‐‐ ‐‐ ‐‐
JNS Jump if Not Sign ‐‐ 0 ‐‐ ‐‐ ‐‐
JO Jump on Overflow 1 ‐‐ ‐‐ ‐‐ ‐‐
JNO Jump on Not Overflow 0 ‐‐ ‐‐ ‐‐ ‐‐
27
Les instructions de boucle
28
Instructions de contrôle
On peut avec des sauts conditionnels reproduire des
instructions de contrôle de plus haut niveau
¾ If ... then ... Else
¾ if (AX = 3) then
BX = 5
else
BX = DX
CMP AX, 3
JNE else
l ; sii pas égal,
é l on saute à else
l
MOV BX, 5 ; sinon on est dans le then
JMP endif ; on saute le then pour aller à la fin du
if
else: MOV BX,, DX
endif:
Instructions de contrôle
for (cx=0; cx<5; cx++)
ax = ax + cx
MOV AX,0
AX 0 ; initialisation
i iti li ti de d AX ett CX à 0
MOV CX,0 ; CX est le compteur de boucle
for: CMP CX,
CX 5 ; compare CX à 5
JGE endfor ; si CX >= 5, on sort de la boucle
ADD AX,, CX ; fait le calcul
INC CX ; CX est incrémenté de 1
JMP for ; on reprend au début de la boucle
endfor:
df
Instructions de contrôle
MOV AX,0
MOV CX,5 ; CX est le compteur de boucle
For: ADD AX,CX ; fait le calcul
LOOP for ; décrémente CX. CX Si CX > 0 fait
; le saut à for
Structure d’un programme
¾Dans segment de données : peut définir des
variables
¾Assume
VariableCS:Code,
= zone mémoire
CS:Code DS:Donnees ; CS est le segment
Code
; DS est le segment Donnees
Donnees SEGMENT ; définit segment
données
var1 dw 12 ; var1 : variable sur 16 bits (dw) init à
12
var2 db ? ; var2 : variable sur 8 bits (db) non initialisé
Donnees ENDS ; fin de déclaration du segment
Code SEGMENT ; définit segment
g code
main: ; main sera le début du programme
...
MOV AX, var1 ; copie de var1 dans AX
MOV var2, DH ; copie de DH dans var2
Instructions de contrôle
Exemple avec saut sur drapeau
ADD AX,
AX BX
JO erreur
...
erreur: MOV AX, 0
Passer par la
P l pile
il
• On empile les paramètres de la procédure
• On appelle la procédure
• On dépile les paramètres et résultats
p q mais p
• Plus compliqué plus g
général
Gestion de la pile
Gestion de la pile
pile, 4 opérations
PUSH : empiler une valeur sur la pile
POP : dépiler
p une valeur de la ppile
PUSHA : empiler les 8 registres généraux sur la pile
POPA : positionne les valeurs des 8 registres à partir des 8
valeurs
l
au sommet de la pile
PUSHA et POPA permettent de sauvegarder et restaurer
simplement
l'état des registres
g
Avant un appel de procédure par exemple
Egalement des opérations pour dépiler/empiler registre d'état
nomProc PROC
...
instructions de la procédure
...
RET
nomProc ENDP
• Appel d'une
d une procédure
CALL nomProc
•Quand
Quand appelle une procédure, le registre IP est empilé sur la
pile pour savoir où revenir
Procédures
Calcul PROC
ADD AX, DX ; addition
SHL AX, 1 ; décalage gauche = X 2
RET
calcul ENDP
.....
MOV AX, 10
MOV DX, 20
CALL calcul ; après l'appel, AX contient le résultat
Procédures
calcul PROC
PUSH BP ; sauvegarde base de la pile
MOV BP, SP ; nouvelle base de pile = sommet pile
PUSH AX ; sauvegarde AX
MOV AX, [BP+4] ; récupère argument 2
ADD AX, [BP+6]
[BP 6] ; addition AX et argument 1
SHL AX, 1 ; décalage gauche = X 2
MOV [BP+6],AX ; remplace argument 1 par résultat
POP AX ; restaure AX
POP BP ; restaure la base de la pile
RET
calcul ENDP
Procédures
Exemple d'interuption
d interuption : interruption système DOS 21h
Affectation des registres selon la fonction de l'interruption
à utiliser
Afficher un caract`ere `a l’´ecran
MOV DL, ''E''
MOV AH,AH 2 ; fonction 2 : affichage à l'écran
l écran du caractère
; stocké dans DL
INT 21h ; appel de ll'interruption
interruption
lecture du caractère entré au clavier
MOV AH,1 ; fonction 1
INT 21h ; le caractère lu est placé dans AL
Conclusion