Académique Documents
Professionnel Documents
Culture Documents
Introduction à l’Assembleur
Introduction
Tous les langages de programmation dits « évolués »
(«structurés», «orientés objet», etc.), qu'ils soient compilés ou
interprétés doivent d'une manière ou d'une autre être «traduits»
en langage machine avant de pouvoir être exécutés par un
ordinateur
• Avantage des langage évolués:
Développements des logiciels complexes
Conception, lisibilité, maintenance, portabilité…
• Le côté déplaisant
Ils cachent les limitations de la machine:
1. sous-exploitation des capacités du processeur (processeur
64 bits: nouveaux jeux d’instruction, e.g SIMD (16 opération
arithmétique à la fois) mais rares les compilateurs exploitant
ces instructions et les langages qui en tirent profit
SIMD: Single Instruction on Multiple Data ( instruction unique, données multiples)
1
17/11/2017
Introduction Cont.
1 bit Case
mémoire
2
17/11/2017
• La base hexadécimale
La base hexadécimale est utilisée pour représenter des données
pour :
des raisons de lisibilité
Faciliter la représentation des données: un nombre binaire de 4
bits peut être représenté par un chiffre hexadécimal (0, 1, 2, 3, 4,
5, 6, 7, 8, 9, A, B, C, D, E, F) (e.g (1111)B = (F)X = (15)D)
• Sous-parties du contenu d’une case mémoire
Partie haute de 16 bits
Partie basse de 12 bits
F9E8D7C6
Partie haute de 8 bits
3
17/11/2017
4
17/11/2017
• Suite d’instructions-machine,
petit programme en langage machine
chaque instruction-machine est totalement, écrit en binaire avec une
une suite de bits contenant les mémoire découpée en octets
5
17/11/2017
gcc: GNU
Compiler
Collection
6
17/11/2017
7
17/11/2017
al (AL): registre de
travail en architecture
x86, la lettre ‘L’ veut
dire du poids faible
(Low)
8
17/11/2017
Instruction en assembleur
exemple
mov $10, %al #déplacer la valeur 10 au registre AL
Langage assembleur:
mov A, % eax #déplacer la valeur de A au registre eax
En langage haut niveau:
mul B #multiplie B par la valeur stokée en eax
D = A * B + 10
add $10, %eax #ajouter la valeur 10 à eax
mov %eax, D #déplacer la valeur stockée dans EAX vers D
9
17/11/2017
Remarque:
Comme les opérations arithmétiques ne peuvent être réalisées
directement sur des emplacements en mémoire externe, les registres,
qui sont des emplacements de mémoire internes au processeur, sont
utilisés pour ces opérations.
10
17/11/2017
11
17/11/2017
12
17/11/2017
Débordements
• Comment peut-on savoir si le calcul a donne un résultat valide
?
• Exemple 1: 1 + 255 sur un octet pour le CPU est invalide
(résultat = (00000000)b = (0)d)
• Exemple2: -128 - 1 sur un octet donne 127 (invalide)
-128 = (10000000)b et -1 = (11111111)b
• le microprocesseur possède un registre special de 64 bits: le
registre d'etat RFLAGS (FLAG c.à.d. Drapeau en anglais). Une
partie de ces birts concerne les opérations arithmétiques
après une exécution.
PF (Parity Flag) indique que le résultat est pair (PF=1) ou impair (PF=0)
CF (Carry Flag) indique une retenue (CF=1) sur les entiers non signés
OF (Overflow indique un débordement (OF=1) sur les entiers signés
Flag)
CF: Ce drapeau prend la valeur 1 si une opération arithmétique génère une retenue
sur le bit le plus significatif (bit de poids fort). Le drapeau est désarmé dans les
autres cas. Ce drapeau indique ainsi une condition de débordement en arithmétique
entière non signée. Il est aussi utilisé pour l'arithmétique en précision multiple.
13
17/11/2017
Arithmétique binaire
Les règles de la soustraction
0-0=0
0 - 1 = (on emprunte "1" ce qui fait 10-1, on écrit "1" et on retient 1)
1-0=1
1-1=0
0 - 1 - 1 = (on emprunte "1" ce qui fait 10-1-1, on écrit "0" et on retient "1")
1-1-1=0-1
opérations de soustraction
Addition d'un nombre positif et un nombre négatif plus petit en valeur absolue
Addition d'un nombre positif et un nombre négatif plus grand en valeur absolue
Le dépassement
14
17/11/2017
Flag de retenue CF
Exemples:
• 0b11111111 + 0b1 = 0b00000000, CF = 1
• 0b11111110 + 0b1 = 0b11111111, CF = 0
Remarque: si les opérandes sont des entiers non signés, le résultat
est valide si et seulement si CF =0 et il est invalide si et seulement
si CF = 1
Flag de débordement OF
Exemples:
0b11111111 + 0b1 = 0b00000000, CF=1 et OF=0
Si (0b11111111) est entier non signé donc (255 + 1) est invalide
dans N8 (la valeurs maximale est 28 – 1 = 255 gérée par le
microprocesseur)
Si (0b11111111) est un entier signé donc (-1 + 1) est valide dans
Z8 (la valeurs gérées sont de -128 à 127)
15
17/11/2017
• Exemple 2:
0b00000000 – 0b1 = 0b11111111 avec CF=1, mais OF=0
Exemple 3:
0b10000000 + 0b1 = 0b10000001 avec CF=0 et OF=0
Si (0b10000000) est entier non signé donc (128+ 1) est valide dans
N8 (0 – 255 valeurs)
Si (0b10000000) est un entier signé donc (-128 + 1) est valide dans
Z8 (-128 à 127)
• Exemple 4:
0b10000000 – 0b1 = 0b01111111, CF=0, mais OF =1
Exemple 5:
0b01111111 + 0b1 = 0b10000000, CF=0, mais OF =1
(0b01111111)= 127d donc 127 + 1 est valide en N8 mais invalide
en Z8 (-128 à 127)
16
17/11/2017
17
17/11/2017
Exemple de multiplication
18
17/11/2017
Si l'opérande de cette instruction est codée sur 16 bits, l'entier défini par la paire
de registre DX:AX est divisé par l'opérande, le quotient est stocké dans AX et le
reste dans DX. Dans la pair de registre DX:AX, le poids faible est AX.
Si l'opérande de cette instruction est codée sur 32 bits, l'entier défini par la pair de
registre EDX:EAX est divisé par l'opérande, le quotient est stocké dans EAX et le
reste dans EDX.
19
17/11/2017
Incrémentation et décrémentation
• Incrémentation:
Syntaxe: inc opérande
• Décrémentation:
Syntaxe: dec opérande
20
17/11/2017
les instructions de
branchement
21
17/11/2017
• branchement inconditionnel
Instruction jmp (sauter)
Elle permet de remplacer le contenu de RIP par une adresse
symbolique (Tag)
Syntaxe: jmp tag
Exemple:
debut: movl $2, %eax # 2 -> eax
jmp suite # on saute l’ instruction suivante
addl $2, %eax # cette instruction
# n'est pas exécutée
suite: movl %eax, %ebx # eax -> %ebx
• Branchements conditionnels
elles testent un ou plusieurs Flags du registre d‘état et en
fonction de leurs valeurs, effectuent le branchement ou
passent a l'instruction suivante, Le branchement est
effectué si la condition est remplie et qui est en fonction
des états des Flags ZF, CF et OF
Syntaxe: jz Tag (si résultat est nul ZF=1)
jnz Tag (si résultat est non nul ZF=0)
jc Tag (saut si retenue CF=1)
jnc Tag (saut si pas de retenue CF=0)
jo Tag (saut si débordement OF=1)
jno Tag (saut si pas de débordement OF=0)
22
17/11/2017
Exemple 1
Init: movw $0, %cx # 0 -> cx
Boucle: addw $1, %cx # cx+1 -> cx
jnc Boucle # boucle tant que cx+1
# est valide (de 1 à 65535)
Exemple 2 (peut on remplacer: if else, while do, switch case, for?)
maximum: movq var_a, %rax # a -> rax (q: 64 bits)
movq var_b, %rbx # b -> rbx
subq %rax, %rbx # rbx-rax -> rbx
jc amax # CF=1 => b-a<0 => a>b
bmax: movq var_b, %rax # CF=0 => b-a>=0 =>
# a <= b, on copie
# b dans rax
amax: movq %rax, var_c # max(a,b) -> c
Structures de données
23
17/11/2017
Registres Pointeurs
• Un pointeur est une case mémoire qui contient l'adresse
d'une autre case mémoire.
• La modification du contenu d’une case mémoire peut se fait à
partir du pointeur qui a son adresse (il pointe sur elle)
Exemples de pointeurs:
• RIP est un exemple de registre pointeur qui point sur
l’instruction courante
• RSI (Re-extended source index) et RDI (Re-extended destination index)
sont deux pointeur indiquant la source et la destination (copie
de zone de mémoire)
• RSP (Re_extended Stack Pointer) et RBP (Re_extended Base Pointer)
deux pointeurs pour la gestion de la pile
24
17/11/2017
25
17/11/2017
Utilisation de la pile
Fonctionnement de la pile
La pile est une zone spéciale réservée dans la mémoire pour stocker les données
d’un programme. Sa particularité réside dans la manière d’insertion et de
suppression des données de la pile.
26