Vous êtes sur la page 1sur 2

Cours Assembleur NSI

I - Langage machine
Les langages de haut niveau comme python doivent être « traduits » en instructions directement
compréhensible par l’électronique du CPU, c’est-à-dire en binaire. Ainsi, les programmes stockés
dans la mémoire centrale d’un ordinateur sont des suites de mots constituées de 0 et de 1 que l’on
appelle langage machine.
Il est parfois nécessaire d'écrire directement des programmes en langage machine, par exemple
quand un calcul précis doit être réalisé le plus vite possible par la machine. Pour cela, il n'est pas
raisonnable (voir possible) d’écrire directement les mots binaires du langage machine. On utilisera
alors un langage assembleur, qui est le langage le plus bas niveau d'un ordinateur lisible par un
humain. Ce langage fournit un certain nombre de facilités pour programmer, comme des étiquettes
symboliques pour identifier des points de programme.
Le langage machine exprime les instructions des programmes par des combinaisons de bits
10110000 01100001
En langage d'assemblage, ces instructions sont représentées par des symboles mnémoniques bien
plus lisibles
mov $0x61, %al
(qui signifie de mettre la valeur hexadécimale 61 (97 en décimal) dans le registre 'AL'.)

1.1 Jeux d’instructions


Il s’agit de l’ensemble des instructions-machine qu'un processeur d'ordinateur peut exécuter, c’est-
à-dire pour lesquelles il possède un circuit électronique (à base de portes logiques) adapté. Le jeu
d'instructions précise aussi quels sont les registres du processeur manipulables.
Parmi les jeux d'instructions principaux, nous avons :
• x86 (16, puis 32 bits)
• AMD64 (version 64 bits de x86 par AMD, aujourd'hui la plus répandue de la famille x86)
• ARM (16, 32, puis 64 bits)
• RISC-V (32, 64 et 128 bits), un format ouvert
Le jeu d'instructions x86 équipe tous les processeurs compatibles avec l'architecture Intel (qu'ils
soient construits par Intel ou AMD). Pour ce cours, et à titre d'exemple, nous présentons ci-dessous
le langage assembleur x86 des microprocesseurs d’Intel.

II – Langage assembleur pour x86


Nous utiliserons pour nos programmes les registres eax, ebx, ecx et edx

2.1 instructions de transfert


La principale instruction pour transférer des données entre des registres et / ou la mémoire est mov
mov destination, source
La source ou la destination peuvent être des nombres, des registres ou des emplacement mémoire
mov eax, 42 ; copie la constante 42 dans eax
mov eax, ebx ; copie le contenu de ebx dans eax
mov [x], eax ; copie eax dans la variable x (ie la zone mémoire x)
mais les copies de la mémoire vers la mémoire ne sont pas possible directement(il faut passer par un
registre)

1
Cours Assembleur NSI
2.2 instructions de calcul
L’assembleur x86 permet d’écrire les opérations arithmétiques (additions, soustractions…) et les
opérations logiques (et, ou …). Voici l’addition :
add eax, 10 ; ajoute 10 à eax
add eax, ebx ; ajoute le contenu de ebx à eax
add [x], eax ; ajoute eax à x
add ebx, [x] ; ajoute x à ebx

2.3 instructions de saut


Pour contrôler le flot d’exécution (boucles, instructions de branchement...), le langage x86 dispose
d’instructions de comparaison et de saut. L’instruction de comparaison a la forme
cmp source1, source2
Elle calcule source1 – source2 mais ne stocke pas le résultat : à la place, elle met à jour des
registres spéciaux appelés drapeaux (flags en anglais) indiquant si le résultat est nul, positif ou
négatif. Ces flags sont utilisés par les instructions de saut je (jump if equal) jne (jump if not
equal) jg (jump if greater) jl (jump if lesser) pour diriger l’exécution à une ligne indiquée par
une étiquette.
add eax, 1 ; ajoute 1 à eax
cmp eax, 3 ; compare eax à 3 et met les flags à jour
je fin ; lit les flags et saute à l’étiquette « fin » si égalité
mov ecx, eax
fin: ; l’étiquette « fin »
→ Lors de cette exécution la 4ème ligne (copie de eax dans ecx) ne sera pas exécutée si eax = 3

Enfin, il existe une instruction jmp de saut non conditionnel (saut systématique)
jmp etiq ; saute à la ligne qui suit l’étiquette « etiq »

2.4 exemple

Voici un exemple de boucle en assembleur :


mov eax, 1
mov ebx, 1
entete:
cmp ebx, 10
je fin
add ebx, 1
add eax, ebx
jmp entete
fin:

Exercice :
1/ Quel est le rôle du registre ebx ?
2/ Que calcule la variable eax ?

Vous aimerez peut-être aussi