Vous êtes sur la page 1sur 26

27/05/2016

Architecture en couches

 Couche 4 : Couche langage d’assemblage (Assembleur).


ARCHITECTURE DES  Les données manipulées: La forme symbolique d’un
des langages L2, L3: Un assembleur traduit le langage
ORDINATEURS
assembleur (L4) en codes d’instruction.
& ASSEMBLEUR  Offre une forme symbolique aux langages des

couches inférieures

Partie 2: Langage Assembleur  Permettre à l’humain d'interagir avec les couches

Inférieures

Un peu d’histoire Langage assembleur

 Début des années 40  50  Programme


 Résoudre les problèmes dus aux limitations en rapidité et en  Un ensemble d’instructions implantées en mémoire afin de
résoudre un problème donné
capacité de mémoire
 Permettre à l'humain de dialoguer avec sa machine

 Le premier programme assembleur par Nathaniel Rochester


pour l'IBM 701  Assembleur :
 Langage: le plus bas niveau accessible facilement à
 1970-80: L’assembleur pour applications et systèmes l’humain
d’exploitation  Logiciel: transformation : fichier source (des instructions)

 fichier exécutable compréhensible par le processeur


 Les années 90: L’assembleur pour les jeux vidéo à consoles

1
27/05/2016

Langage assembleur Langage assembleur

 Ou langage d’assemblage  Directement basé sur :

 Très proche du langage machine  Les mnémoniques : séries de caractères  Mot

 Langage de bas niveau  associés à une instruction

 Diffère selon le type du processeur  rappeler le code et l’action des instructions

 langage par type de processeur  Ex: MOV ( move)

ADD (add)

Langage assembleur

 Utiliser le langage assembleur

 Ecrire sous forme symbolique la succession


d'instructions
Programmer en
Assembleur
 Les précéder par leur adresse pour faciliter leur repérage

 Elles sont stockées dans un fichier texte (fichier source)

 Traduit par l'assembleur en langage machine.

 Ex: A1 01 10 en langage machine

MOV AX, [0110] en langage assembleur

2
27/05/2016

Structure d’un programme L’Etiquette / Label

 Un code source assembleur est une suite de lignes:  Identificateur de l’instruction


 Utilisé pour désigner l’adresse d’un emplacement de mémoire
 Ordonnées  Peut être vide
 Indépendantes  Située à la 1ère colonne
 Peut être formé de lettres, nombres, _, $, #, @, ~, ., et ?/ # Mots
 Chaque ligne peut comporter (dans l’ordre) système
1. Un label  Longueur maximale : 4095 caractères
2. Une instruction/directive (+ opérandes)  Se termine par le signe ‘ : ’
3. Un commentaire  Unique dans tout le programme  faciliter le repérage dans le
4. Le symbole « \ » seul programme
 Ex :
Label_nom.1 :

Les commentaires Le caractère \

 Indique la rupture de ligne


 Peut être vide
 N’est suivi d’aucun caractère
 N’est pas tenu en compte par le compilateur
 Lors de l’exécution
 Contient le texte défini par le programmeur
 La ligne suivante sera lue est considérée comme la suite de
 Se termine à la fin de la ligne
la ligne courante

3
27/05/2016

Les instructions Les instructions

 Types  Obligatoires  constituent le code de l’opération


 Instructions d’affectation  Très nombreuses et variées
 Instructions logiques  Peuvent avoir un ou plusieurs opérandes
 Instructions arithmétiques  Génération du code pendant l’assemblage
 Sous-programmes  Exemple :
 Ruptures conditionnelles et inconditionnelles add eax, 2

 …

Les opérandes Structure d’un programme

 Exemple :
 Les paramètres de l’instruction courante

 Séparés par des virgules Code: mov eax,1 \


commentaire
 Sous la forme de:

 Nom de registres : eax, bx, … Code  label


 Constante : 1, constante , ... mov  mnémonique
eax,1  les opérandes (source et destination)
 Expressions : (82+2),… \  rupture de ligne
 Emplacement mémoire: (20) commentaire  commentaire

 …

4
27/05/2016

Structure d’un programme Langage assembleur Intel 80x86

Exemple de calcul: (7+6)/3, on aura le code suivant :


 Netwide Assembler (NASM): assembleur pour
MOV AX, 7 ; AX est mis à 7 l'architecture x86, basé sur la syntaxe Intel.
ADD AX, 6 ; On ajoute à AX la valeur 6, le résultat est stocké dans la
 Placer la destination avant la source ( comme les langages
destination AX
MOV BL, 3 ; BL est mis à 3 haut niveau)
DIV BL ; DIV divise AX (qui vaut 13) par BL (qui vaut 3)
 Utilisé par la plupart des assembleurs
;le résultat de la division est stocké dans AL
;et le reste de la division est mis dans AH  Une instruction par ligne  Lignes séparées par le retour à
la ligne

etiquette: instruction opérandes ; commentaire

Structure d’un programme Segment de données

 Segment de données: Pour données initialisées


 Fichier résultant:
 Débute par : .data
 Un fichier texte (.asm)
B (byte) W(word) D(double
 Utiliser la directive : dX word/ float)
 Découpé en plusieurs segments ou sections
1 octet 2 octets 4 octets
 Définir …
 Section de données
 Exemples:
 Section de texte (le code source)
 db 0x55 ; 1 octet (l’octet 0x55)
 Les labels servent pour organiser les sections  db 0x55,0x56,0x57 ; 3 octets en succession
 dw 'abc' ; 0x41 0x42 0x43 0x00 (string)
 dd 0x12345678 ; 0x78 0x56 0x34 0x12

5
27/05/2016

Segment de données Segment de données

 Segment de données:
 Segment de données: Pour données non initialisées
 Définir une constante: la directive equ
 Débute par : .bss
B W D label: equ valeur
 Utiliser la directive : resX
1 octet 2 octets 4 octets  Répéter instruction (l’assembler) ou déclaration: la directive
 Réserver … times
label: times nbr_fois instruction

 Exemples:  Exemples:
 i1: resb 60 ; reserver 60 octets  nombre: equ 30
 i2: resw 1 ; reserver 1 mot  label: times 100 db 0 ; 100 fois l’octet 0x00 (100 emplacements
mémoire initialisés à 0)
 label: times 100 resb 1 ; la meme chose que label: resb 100

Segment de code Structure d’un programme


 Exemple de structure:
 Segment de code ou de texte: %include ’’asm_io.inc’’
SECTION .data
 Débute par : .text
; données initialisées
 Constitue le corps du programme ;
SECTION .bss
SECTION .text ; données non initialisées
global main ;
SECTION .text
main:
global main ; l’étiquette devient visible de l’extérieur
... main:
; programmme
Après la mov ebx, 0 ; code de sortie, 0 = normal ;
fin du mov eax, 1 ; numero de la commande exit mov ebx,0
programme m int 0x80 ; interruption 80 hex, appel au noyau mov eax,1
int 0x80

6
27/05/2016

Assembleur, pourquoi? Assembleur, pourquoi?

 Tout microprocesseur contient un jeu d’instructions basiques se  L’assembleur permet de contrôler le CPU d’une manière directe.
résumant à une tâche simple: (additionner la valeur x avec la valeur y,
mettre la valeur x dans la mémoire,…)  Bonne maîtrise du système
 L’assembleur :
 Programmes rapides par rapport aux langages haut niveau
 convertir
 Insertion des bouts de codes assembleur dans des programmes
Les instructions du un fichier source
microprocesseur sous la (Pascal, C, …)
forme de mnémoniques
 La communication entre les programmes et le CPU est assurée par

les REGISTRES
Le code numérique binaire un fichier exécutable
de chaque instruction

Compréhensible par le microprocesseur

Assemblage Assemblage

 Un programme en assembleur
 L’assemblage : transformer le programme écrit en langage
 doit subir un certain nombre de transformations avant l’exécution d’assemblage en instructions machine en créant un fichier objet
 Différentes étapes du traitement nasm -f <format> <filename> [-o <output>]
.asm  Exemples :
Fichier assembleur source
 nasm -f elf monfichier.asm  Assembler le fichier
Traduction (compilateur)
.obj monfichier.asm en un fichier objet ELF (executable and
Fichier Objet (Lng Machine)
linkable file format / contient le code compilé) monfichier.o
Utilitaire LINK ou TLINK (Edition des liens)
Fichier exécutable .exe
Ajuster les adresses des
Résultats différentes procédures

7
27/05/2016

Assemblage 8086 - Registres

 Il faut lier le fichier objet avec les bibliothèques dont il dépend Elément de
mémoire
ld -e main monfichier.o -o monfichier
Stockage
• Adresses Capacité
réduite
• Résultats
 Le programme débute avec une procédure "main".
intermédiaires
 Besoin d'utiliser gcc pour créer l’exécutable

gcc monfichier.o -o monfichier Base de


Interne au
plusieurs
microproce
commandes
sseur
assembleur

8086 - Registres 8086 - Registres

 Gérer les registres  Faire appel aux instructions du


Programmes assembleur
processeur Chercher des données (nombres) dans la mémoire

 Effectuer les opérations de base sur les registres


Placer les nombres dans les registres
 y mettre des valeurs

 effectuer des traitements arithmétiques

 effectuer des traitements logiques Effectuer des opérations sur les registres

…

 A travers les mnémoniques Replacer les résultats dans la mémoire

8
27/05/2016

8086 – Registres 8086 – Registres généraux (Rappel)


Registres généraux ou de travail Registres de segments

Registre des indicateurs

Registres d’offset

Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX

 Taille: 16 bits / Usage général  AX: Registre Accumulateur


 En arithmétique non signée  Stocker des nombres de 0 à  utilisé pour les opérations simples  effectuer des calculs
65535
AX = AH x 256 + AL arithmétiques ( ADD, MUL, …) de nombres entiers ou
BX = BH x 256 + BL envoyer un paramètre à une interruption
CX = CH x 256 + CL
 sert souvent de registre d'entrée-sortie : on lui donne des
DX = DH x 256 + DL
paramètres avant d'appeler une fonction ou une procédure.
 En arithmétique signée  Stocker des nombres de -32768 à
32767
 Modification de xL ou xH  Modification de xX et vice versa

9
27/05/2016

Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX

 CX: Registre Compteur


 BX: Registre de Base
 sert généralement comme compteur dans des boucles
 sert à effectuer des calculs arithmétiques ou bien des  nombreuses opérations de comptage sont effectuées
calculs sur les adresses directement avec CX par le processeur
 Exemple:
 le registre de "Base"  peut parfois être utilisé comme
;(…)
base d'indexage Mov cx, 20 ; mettre 20 dans CX
Instruction1:
;les instructions à répéter
;(…)
loop Instruction1
;(…)

Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX
 Exemple: Pour répéter 12 fois une instruction en assembleur
 DX: Registre de Données
1 Mettre la valeur 12 dans CX
 sert à stocker des données destinées à des fonctions
Ecrire l'instruction précédée d'une étiquette [son adresse en
2
mémoire]  le registre propre aux manipulations des données
3 Faire un LOOP à cette adresse  Par exemple
Lorsque le processeur reconnaît l'instruction LOOP, il sait que le
4  Ecrire une chaîne de caractères à l'écran
nombre d'itérations à exécuter se trouve dans CX
Il se contente alors de décrémenter CX, de vérifier que CX  Il faut placer l'offset de cette chaîne dans DX avant
5 est différent de 0 puis de faire un saut (« jump ») à l'étiquette
mentionnée. d'appeler la fonction appropriée
Si CX vaut 0, le processeur ne fait pas de saut et passe à
6
l'instruction suivante.

10
27/05/2016

Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS

 Taille: 16 bits
 La mémoire est découpée en morceaux
 Surtout sur DOS  besoin de stocker des nombres de 0 à 1
 Chaque morceau contient un certain nombre
048 575  Besoin de 20 bits
d'informations
 Combiner 2 registres : 1 des registres avec 1 des 4 registres
 utilisés pour stocker l’adresse de début d’un segment:
de segment  former une adresse de 20 bits
l’adresse du début des instructions du programme

 Exemples:
l’adresse du début des données

 CS et IP: combinés  CS:IP  accéder à la prochaine
 l’adresse du début de la pile
instruction à exécuter sous la forme CS:IP
 Registres de segment  Indiquer le segment de la
 SS et SP: combinés  SS:SP  toutes les opérations
mémoire utilisée par chaque partie du programme
concernant la pile

Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS

 CS: Code Segment


 DS: Data Segment
 CS stocke l’adresse du début des instructions d’un programme
 Contient l'adresse du segment des données du programme en cours
 Mémorise le segment où se trouve le code du programme
 Mémorise le segment où se trouve les données du programme
 Modifier CS  utiliser des instructions telles que des sauts
 Peut être modifié
(JMP) ou des appels (CALL) vers un autre segment.
Par exemple, si dans un programme, il y a deux segments de
 CS est actualisé d’une façon automatique par le processeur en
données, pour accéder au deuxième  Il faut faire pointer DS vers
fonction de l'adresse d'arrivée
ce segment.

11
27/05/2016

Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS

 SS: Stack Segment  ES: Extra Segment


 Sert à adresser le segment au choix. Il est changeable aux mêmes
 Le registre SS adresse le segment de pile
conditions que DS.
Mémorise le segment où se trouve la pile de données du  Ce segment peut être utilisé pour faire ce que l'on veut.

programme  Utilisé comme registre de segment temporaire

 Par exemple, pour copier des données d'un segment vers un autre

 Il faut pointer DS vers le premier et ES vers le second.

Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP

 IP: Pointeur d’instructions


 La mémoire est décomposée en segments
 Le registre IP désigne l'offset de la prochaine instruction à
 Pour localiser une donnée précise
exécuter, par rapport au segment adressé par CS
 il faut savoir dans quel segment elle se trouve, et le
 Le pointeur d’instructions est modifiable directement
décalage entre cette donnée et la première donnée du
segment  C'est ce qu'on appelle offset.  utilisé avec le registre CS pour mémoriser l'adresse de la

 Pointeurs de pile : BP, SP prochaine instruction a exécuter

 Registres d’index: SI, DI  Le processeur :


 cherche l’instruction en mémoire et l'exécute.
 incrémente IP pour pointer vers l’instruction suivante

12
27/05/2016

Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP

 SP et BP: pointeurs de pile  SP et BP: pointeurs de pile


 pointer sur des données dans la pile du langage machine  Deux instructions pour empiler et dépiler une pile :

 La pile: emplacement mémoire  PUSH A  empile le registre A

 La pile est gérée en LIFO : dernier entré premier sorti.  PUSHa : empiler les registres : AX, BX, CX, DX ainsi

 Le nombre des registres est limité  Utiliser la pile lorsqu’on que les registres SP, BP, SI et DI.

a plus de place.  POP A  dépile le registre A

 La pile est plus lente que les registres.

Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP

 SP et BP: pointeurs de pile


 SP: pointeur de pile
 La valeur empilée ou dépilée doit être de 16 ou 32 bits: (un
 Pointeur de pile  pointe sur le sommet de la pile.
registre ou une valeur immédiate)
 Le sommet de la pile: une partie de la mémoire
 Exemples:
 permet de stocker le contenu des registres relatif au
PUSH AX POP CX
traitement des interruptions et des sous-programmes.
PUSH BX POP BX

PUSH 750 POP AX

 CX=750 BX=BX AX=AX

13
27/05/2016

Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP

 SP est :  SI, DI: Registres d’index


 décrémenté avant chaque empilement  SI: le registre source
 les opérations d'indexage
 incrémenté après chaque dépilement  DI: le registre destination

 Utilisés comme des pointeurs


 BP: pointeur de base  Peuvent être modifiés et utilisés comme des registres
 le registre de base de la pile  pointe sur l'adresse de base de généraux en plus de leurs fonctions de base
la pile

Le registre des indicateurs ou Registre Flags Le registre des indicateurs

 Les flags regroupés tous dans un registre => le registre des


 Un programme fait des choix en fonction de ses données.
indicateurs  un ensemble de 16 bits
(comparer des nombres, examiner leur signe, etc).
 Chaque bit => un rôle précis.
 Le rôle des petits indicateurs => les flags
 Le programmeur peut lire chacun de ces flags et parfois
 Les flags: des bits spéciaux ayant une signification très précise.
modifier leur valeur directement.
 fournir des informations sur les résultats des opérations
précédentes

14
27/05/2016

Le registre des indicateurs Le registre des indicateurs

SF (« Sign Flag ») IF (« Interrupt Flag »)


• l'indicateur de signe • Si positionné à 1  les interruptions sont prises en compte / ignorées
• vaut 1 si le résultat d'une opération sur des nombres signés est sinon
négatif
DF (« Direction Flag »)
ZF (« Zero Flag »)
• utilisé pour les opérations sur les chaînes de caractères.
• passe à 1 si le résultat d'une opération est nul • Si positionné à 1, le sens du parcours des chaines de caractères
 les adresses décroissantes, sinon les adresses sont croissantes.
PF (« Parity Flag »)
• l'indicateur de parité TF (« Trap Flag »)
• vaut 1 si le résultat est pair
• utilisé pour le débogage d'un programme
CF (« Carry Flag ») • Si positionné à 1 une routine spéciale du débogueur est appelée une
fois chaque instruction est exécutée par le processeur.
• l'indicateur de retenue
• vaut1 si et seulement si l'opération a généré une retenue OF (« Overflow Flag »)
AF (« Auxiliary Carry Flag ») • indique la présence d’un débordement (capacité de stockage dépassée)
• (retenue auxiliaire) est peu utilisé • Sert à éviter les plantages

8086 – Adressage (Rappel) Les sauts conditionnels / inconditionnels

Code opération Adresse de l’opérande


 Les sauts inconditionnels: effectuent le saut sans conditions
Code opération Valeur de l’opérande
Valeur de l’opérande
comme JMP (Jump)  affecter une valeur définie au registre IP

…  Les sauts conditionnels: sautent si la condition est vérifiée.

Sinon, passer automatiquement à l’instruction suivante


Code opération Registre Code Adresse de base de
opération l’opérande  très utiles pour la création les boucles et les structures
Code opération Registre conditionnelles
+ valeur registre
d’index  La condition est vérifié à travers les valeurs des indicateurs.
Adresse de l’opérande

Valeur de l’opérande
 J = Jump if (Saut si)
Valeur de l’opérande

15
27/05/2016

Les sauts conditionnels (Rappel) L’instruction CMP

Instruction Action  Effectuer des tests entre des valeurs et modifier les flags
cmp arg1, arg2 Comparer les 2 opérandes, si égaux ZF = 1
suivant le résultat
jp / jnp sauter si pair (PF=1) / impair (PF=0)  Le fonctionnement du CMP est semblable à SUB.
jc/ jnc sauter si retenue (CF=1) / (CF=0)
 Exemple:
je / jne sauter si ZF de cmp est égal à 1/ (ZF = 0)
jo / jno sauter si dépassement (OF=1) / (OF=0) CMP AX, BX  vérifier si les valeurs MOV AX, 9
MOV BX, 8
jb / jbe sauter si cmp retourne plus petit que (CF =1) / (CF=1 or AX et BX suite au résultat de: AX-BX JMP somme
ZF =1)
suite:
ja/ jae sauter si cmp retourne plus grand que (CF=0 and ZF=0)  si AX-BX= 0  ZF=1
MOV BX,AX
/ (CF =0)
 sinon  ZF=0 ...
… … somme:
ADD AX, BX
JMP suite

Les sauts conditionnels (Récapitulatif) Instructions de base

JA est supérieur [a > b]  CF=ZF=0


 En assembleur, les constantes prennent la forme:
JAE ou JNB ou JNC est supérieur ou égal [a => b]  CF=0
Non signé
 Nombres
JB ou JC est inférieur [a <b]  CF=1

JBE est inférieur ou égal [a <= b]  CF=ZF=1  Chaines de caractères

JG est supérieur [a > b]  SF=ZF=0


 Ces formes sont converties en binaire dans le fichier objet
JGE est supérieur ou égal [a => b]  SF=OF
Signé
JL est inférieur [a < b]  SF<>OF
est inférieur ou égal [a <= b] SF<>OF
JLE
et ZF=1
JE ou JZ est égal [a = b]  ZF = 1
Egalité
JNE ou JNZ est différent [a <> b]  ZF = 0

16
27/05/2016

Instructions de base Hexadécimal en assembleur


 Forme d’écriture  Nombre hexadécimal: le précéder des deux caractères 0x ou

 Nombre décimal: forme habituelle ou un ‘0d’ comme 0X ou ‘0h’ ou ajouter un ‘h’ comme suffixe avec un 0 au début
préfixe ou un ‘d’ comme suffixe (avec un ‘0’ au début) lorsqu’on veut pas le confondre avec la chaine de caractères.
 Nombre octal: un ‘q’ ou ‘o’ comme suffixe / ‘0q’ ou
 En base 10, écrire 564:
‘0o’ comme préfixe
 Chaine de caractère: suite de caractères  564 = 5*100 +6*10 +4*1 = 5*(10^2) +6*(10^1) + 4*(10^0)

db 'hello'  db 'h','e','l','l','o'  Même principe, écrire 20:  23 = (16*1+7)  s'écrira 17h


db ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘,’, ‘ ‘, ‘W’, ‘o’, ‘r’, ‘l’, ‘d’, ‘ ‘, ‘!’
 Convertir de l'hexadécimal en décimal : 3CAh
 db ‘Hello, World !’
3CAh = 3*(16^2) +C*(16^1) +A*(16^0) = 3*256 +12*16 + 10*1 =
970

Binaire en assembleur Interruptions

 Le processeur central (CPU) ne travaille qu’en binaire, notation  Une interruption: un programme exécuté quand un
en base 2 (bits) évènement particulier se produit (exemple: branchement
 En assembleur, le suffixe ‘b’ ou ‘y’ est utilisé pour les nombres d’une clé USB, …) et dont l’exécution cause l’interruption
binaires ou ajouter un ‘0b’ ou ‘0y’ comme préfixe du programme en cours

 Par exemple 9 s'écrira: Une interruption est appelée avec: INT constante

9 = 1*(2^3) +0*(2^2) +0*(2^1) +1*(2^0) = 1001b

17
27/05/2016

Interruptions Interruptions

 Types:
Le programme en cours est interrompu pour gérer des

événements imprévus nécessitant une réponse rapide  interruptions logicielles: appelées directement par le

programme
 le contrôle passé au gestionnaire d’interruptions

(routine traitant une interruption)  interruptions matérielles: déclenchées suite à la


production d’un évènement physique (appuyer sur une
 le contrôle est redonné au programme interrompu
touche du clavier, …)
après le traitement de l’interruption

Interruptions Entrées / Sorties

 Types:  Rôle: échanger des informations entre le processeur avec

l’extérieur
 interruptions externes: proviennent de l'extérieur du

processeur (ex: périphérique)  Assurer le bon fonctionnement du CPU

 interruptions internes: soulevées depuis le processeur  Entrées: données envoyées par un périphérique vers l’unité

centrale.
 Les interruptions erreur: sont appelées aussi traps
 Sorties: données émises par l’unité centrale vers un

périphérique.

18
27/05/2016

Entrées / Sorties Instructions principales

 L’unité d’E/S  assurer les liaisons entre bus internes /  MOV: l'instruction la plus basique  mov dest, src

externes
 Déplacer les données d'un emplacement à un autre

 Copie de la valeur de la donnée src dans dest (même taille)


Bus de données
Unité d’entrées/
sorties (E/S) Bus d’adresses  Exemples:

Bus de commandes mov ebx, 9 ; stocker 9 dans le registre EBX

Intérieur du processeur Extérieur du processeur mov bx, ax ; stocker la valeur de AX dans BX

Instructions principales Instructions principales

 SUB : soustraire les entiers  sub dest, src


 ADD : additionner les entiers  add dest, src
 soustraire src de dest  placer le résultat dans dest
 additionner dest et src  placer le résultat dans dest
 INC et DEC : incrémenter ou décrémenter la valeur (de 1)
 Exemples:

add eax, 6 ; eax = eax + 6  Exemples:

add bl, bh ; bl = bl + bh sub ax, 8 ; ax = ax - 8


inc dl ; dl++

19
27/05/2016

Instructions principales Instructions principales

 MUL : multiplier les nombres non signés (0 à 65535)


 DIV : multiplier les nombres non signés (0 à 65535)

 IMUL : multiplier les nombres signés (-32768 à 32767)


 IDIV : multiplier les nombres signés (-32768 à 32767)

mul src
div src

 Multiplier par les variantes de AX selon la taille (AL, AX,


 Diviser la valeur de AX par la source
EAX)  la destination (AX, DX:AX, EDX:EAX)
Taille du diviseur 8 bits 16 bits 32 bits
Dividende AX DX:AX EDX:EAX
Stockage du retour AH DX EDX
Stockage du
AL AX EAX
quotient

Instructions principales: Décalage Instructions principales: Rotation

 Décalage  Rotation

décaler d'un côté ou de l'autre les bits des registres + remplir les Décalage avec le même principe + les bits qui sortent d'un

positions des poids les plus faibles par 0 côté rentrent de l'autre.
 Décaler un nombre binaire d'un chiffre à gauche le multiplie
 0001110000
par 2.
0011100000 (rotation à gauche)
 Effectuer un décalage n fois donne une multiplication par 2n
0111000000
 Permettre la division par 2n par une rotation à droite
1110000000
110011 (décalage gauche)  100110
1100000001
1000000011

20
27/05/2016

Instructions principales: Décalage et Rotation Procédures et Fonctions


Instruction Action de décalage ou de rotation
 Procédure:
ROL registre, 1  Une rotation des bits sur la gauche.
Rotate Left  Le bit de poids fort est copié dans CF et réintroduit à droite.  bout de code, peut être appelé par la routine principale du
ROR registre, 1  Une rotation des bits sur la droite. programme ou par des procédures ou fonctions.
Rotate Right  Le bit de poids faible est copié dans CF et réintroduit à gauche.
 peut contenir des arguments
RCL registre, 1  Une rotation gauche des bits en passant par l'indicateur de retenue CF.
Rotate Carry  Le contenu de CF est introduit à droite + le bit de poids fort est copié dans
 Fonction : même principe que la procédure
Left CF.
 différence:
RCR registre, 1  Une rotation droite des bits en passant par l'indicateur de retenue CF.
Rotate Carry  Le contenu de CF est introduit à gauche + le bit de poids faible est copié  renvoyer une valeur à l’élément appelant : routine
Right dans CF.
principale, fonction ou procédure
SHL registre, 1  Décaler les bits du registre de 1 bit vers la gauche.
Shift Left  Transférer les bits sortants dans l'indicateur de retenue CF mais ne sont pas  la valeur retournée peut être stockée dans une variable à
réintroduits à droite
SHR registre, 1  Décaler les bits du registre de 1 bit vers la droite. utiliser par la suite
Shift Right  Transférer les bits sortants dans l'indicateur de retenue CF mais ne sont pas
réintroduits à gauche.

Sous-programmes d’E/S Procédures

Action
 Un sous-programme
read_int  lecture de l’entier entré au clavier
 le stocker dans eax
permet d'effectuer un ensemble d'instructions à travers
read_char  lecture du caractère entré au clavier
 stocker son code ASCII dans eax un simple appel de la procédure.
print_int  afficher à l’écran la valeur de l’entier contenu dans eax
Simplifier le code
print_char  afficher à l’écran le caractère dont le code ASCII est
stocké dans al
Minimiser la taille du programme
print_string  afficher à l’écran le contenu de la chaîne de caractères
à l’adresse stockée dans eax.

print_nl  afficher à l’écran un caractère de nouvelle ligne

21
27/05/2016

Procédures Procédures : CALL

 Déclarer la procédure  Appeler la procédure  L'instruction CALL

 Une étiquette: le nom de la procédure


 Syntaxe : CALL Etiquette
 PROC: début de la procédure

 RET: la dernière instruction  Empiler l'offset de l'instruction suivante

 ENDP: la fin de la procédure étiquette PROC


instruction1
+ faire un saut à l'adresse définie dans Etiquette
instruction2
...
RET
étiquette ENDP

Procédures : RET Procédures


 Retourner à l'instruction qui suit immédiatement le CALL
 Passer les paramètres, deux manières:
 Syntaxe : RET
 Une fois la fonction ou la procédure est appelée:  Passer les paramètres par registre :
 sauvegarde de l’adresse de l’instruction suivante (IP) dans la
pile  Stocker les valeurs dans les registres utilisés dans la

 A la fin de la procédure: la valeur de (IP) set récupérée par procédure


dépilement avec RET pour retourner au programme principal  faire référence aux registres dans les instructions
 Le programme continue à l'adresse qui suit le CALL.  Cette méthode est utilisée quand le nombre de paramètres
 Objectif: dépiler une adresse et sauter à cette adresse
est limité
RET  pop A
jmp A

22
27/05/2016

Procédures Procédures

 Gestion de la pile:
 Passer les paramètres, deux manières:
 L’instruction PUSH A:
 Passer les paramètres par pile :
 SP  SP -2
 comme les langages de haut niveau
 [SP]  valeur du registre A (16 bits)
 1/ Placer la valeur des paramètres un à un sur la pile
 L’instruction POP A:
 2/ Appeler la procédure
 Registre destination A  [SP]
 3/ Nettoyer la pile (restaurer la pile)
SP - 2
 SP  SP + 2
SP  Stockage des valeurs dans la pile avec PUSH

Adresses  les paramètres sont empilés un à un

Procédures Procédures

 Passer les paramètres par pile :  Changement de l’état de la pile:

• t=1: PUSH Param1 …


Une fois la procédure est appelée  lecture du contenu de
sauvegarde BP précédente SP (t=4,5) = BP
• t=2: PUSH Param2
la pile dans la procédure avec BP adresse de retour (IP) SP (t=3)
• t=3: PUSH Param3
Param3 SP (t=2)
 sans dépiler les valeurs • t=4: PUSH BP Param2 SP (t=1)
• t=5: MOV BP, SP Param1 SP (t=0)
 sans modifier SP (le pointeur de sommet de pile)

À la fin de la procédure  rendre à SP la valeur initiale  On peut accéder aux paramètres depuis partout dans le sous-
programme par: [BP + décalage (par rapport à SP]
avant l'empilement des paramètres.
• Param3 est accessible depuis [BP+4], Param2 est accessible
depuis [BP+6] et Param3 est accessible depuis [BP+8]

23
27/05/2016

Procédures Procédures
 Changement de l’état de la pile:
Syntaxe unifiée
myprocedure PROC  Après terminaison du sous-programme

push bp ; empiler la valeur originale de bp


 Retirer les paramètres empilés avec l’appel de la
mov bp, sp ; bp = sp, pointer BP sur le sommet de la pile
procédure ou de la fonction
… ; code du sous-programme
push parametre ; passer un paramètre
pop bp ; restaurer l’ancienne valeur de bp push parametre ; passer un paramètre
RET ; RET n avec n = 2* nombre de paramètres call myprocedure ; appeler la procédure
add sp, n ; retirer les paramètres de la
myprocedure ENDP
pile
 Retirer le paramètre de la pile se fait avec manipulation
directe de l’adresse du sommet de la pile.

Procédures Fonctions
push ax
push bx empiler les paramètres
 Même principe que les procédures
push dx
call myprocedure  avec valeur de retour

 Ex: Fonction récursive
myprocedure
push bp  calculer la somme des entiers de 1 à n
mov bp, sp
;lecture des paramètres
pop bp
ret 6
myprocedure endp

24
27/05/2016

Fonctions Fonctions
fonction:
 Variables = zones mémoire
push bp ; empiler la valeur originale de bp
Les variables peuvent être stockées dans le segment de mov bp, sp ; bp = sp
données (comme c’est déjà vu) sub sp, 4 ; 2 variables locales de 2 octets
 Variables locales ...
 peuvent être stockées dans la pile mov sp, bp ; désallouer les variables locales
Économiser la mémoire pop bp ; restaurer la valeur de bp
Stockées après la valeur de bp sauvegardée dans la ret
pile.

Fonctions Macros

 Exemple de 2 variables locales: sont accessibles depuis


 Codes prédéfinis pour les tâches les plus utilisées
n’importe quel endroit du sous-programme ; pour les
utiliser : [bp-2] et [bp-4]  Composées d'instructions  codes complexes

 Associés à des noms



VariableLocale2
 Remplacent un ensemble de lignes de code dans le
VariableLocale1
sauvegarde BP précédente programme
adresse de retour (IP)
 Peu utilisés par rapport aux procédures et aux fonctions

25
27/05/2016

Macros Tableaux

 Tableau en assembleur
 Dans le code compilé

 Structure de données  collection d’octets adjacents


 les lignes où le nom de la macro apparaît seront remplacées

par le corps de la macro  Bloc de données en mémoire

 Syntaxe: (en NASM)  Accéder à un élément du tableau:

%macro MyMacro
MyMacro
%macro MACRO [ adresse1 + taille*indice ]
Avec:
; instructions
 adresse1: l’adresse du 1er élément dans le tableau
ENDM MyMacro
%endmacro
 indice: l’indice de l’élément concerné

 taille: le nombre d’octets occupés par l’élément

Tableaux Tableaux

 Exemple:

SECTION .data  Les chaînes de caractères en assembleur peuvent être

table1: db 9,4,7,1,8,3,5,1,2, 6 ; tableau d’octets


table2: dw 9,8,7,6,5,4,3,2,1 ,3 ; tableau de mots considérées comme des tableaux

SECTION .text  bloc d’octets en mémoire, terminé par un 0



mov ecx, 10  tableau d’octets (caractères en ascii) terminé par un 0
boucle: mov eax, 0
mov al, [table1 + ecx] ; la taille est égale à 1 (db)
add ax, [table2 + 2*ecx] ; la taille est égale à 2 (dw)
loop boucle
...

26

Vous aimerez peut-être aussi