Les prérequis nécessaires |
Le langage assembleur est très proche du langage machine (c'est-à-dire le langage qu'utilise l'ordinateur: des informations binaires, soit des 0 et des 1). Il dépend donc d'un processeur. Il est donc nécessaire de connaître un minimum le fonctionnement d'un processeur pour pouvoir aborder cette partie. Un processeur réel a toutefois trop de registres et d'instructions pour pouvoir les étudier en détail. C'est pour cette raison que seuls les registres et les instructions d'un processeur simple seront étudiés
Le processeur en bref... |
Un processeur est relié à la mémoire par l'intermédiaire d'une liaison appelée bus. Les données dont le processeur a besoin sont stockées dans ce que l'on appelle des registres (ils sont notés AX, BX, CX, DX, ...). Chacun a sa propre utilité:
Nom du registre | Taille |
Accumulateur AX | 16 bits |
Registre auxiliaire BX | 16 bits |
Registre auxiliaire CX | 16 bits |
Pointeur d'instruction IP | 16 bits |
Registre segment CS | 16 bits |
Registre segment DS | 16 bits |
Registre segment SS | 16 bits |
Pointeur de pile SP | 16 bits |
Pointeur de pile BP | 16 bits |
Pourquoi utiliser l'assembleur? |
Pour faire exécuter une suite d'instructions au processeur, il faut lui fournir des données binaires (souvent représentées en notation hexadécimale pour plus de lisibilité, mais cela revient au même...). Or, les fonctions en notation hexadécimale sont difficiles à retenir, c'est pourquoi le langage assembleur a été mis au point. Il permet de noter les instructions avec des noms explicites suivis de paramètres.
Voici par exemple à quoi peut ressembler un programme en langage machine:
A1 01 10 03 06 01 12 A3 01 14
Il s'agit de la représentation hexadécimale d'un programme permettant d'additionner les valeurs de deux cases mémoire et de stocker le résultat dans une troisième case. Il est évident que ce type d'écriture est difficilement lisible par nous, humains.
Ainsi, puisque toutes les instructions que le processeur peut effectuer sont associées à une
valeur binaire chacune, on utilise une notation symbolique sous forme textuelle qui correspond à chaque
fonction, c'est ce que l'on appelle le langage assembleur. Dans l'exemple précédent la séquence
A1 01 10 signifie copier le contenu de la mémoire à l'adresse 0110h dans le registre AX du processeur.
Cela se note en langage assembleur:
MOV AX, [0110]
Toutes les instructions ont une notation symbolique associée (fournie par le fabricant du processeur). L'utilisation du langage assembleur consiste donc à écrire sous forme symbolique la succession d'instructions (précédées de leur adresse pour pouvoir repérer les instructions et passer facilement de l'une à l'autre). Ces instructions sont stockées dans un fichier texte (le fichier source) qui, grâce à un programme spécifique (appelé "l'assembleur") sera traduit en langage machine.
Le programme précédent écrit en langage assembleur donnerait:
Adresse de l'instruction | Instruction en langage machine | Instruction en langage assembleur | Commentaires sur l'instruction |
0100 | A1 01 10 | MOV AX, [0110] | Copier le contenu de 0110 dans le registre AX |
0103 | 03 06 01 12 | ADD AX, [0112] | Ajouter le contenu de 0112 à AX et mettre le résultat dans AX |
0107 | A3 01 14 | MOV [0114], AX | Stocker AX à l'adresse mémoire 0114 |
L'écriture en langage assembleur, bien que restant rebutante, est beaucoup plus compréhensible pour un humain, car on a généralement moins de mal à retenir un nom qu'un numéro...