"Le" langage assembleur
Les instructions en langage assembleur
Pour pallier cette difficulté, les informaticiens ont remplacé les codes binaires des opérations par des symboles mnémoniques (plus facile à retenir qu’une suite de ”1” et de ”0”).
Par exemple ”ADD R1,R2,#125” signifierait : ajouter 125 au contenu du registre 2 et placer le résultat dans le registre 1.
Le premier programme assembleur a été écrit par Nathaniel Rochester pour l'IBM 701 (le premier ordinateur commercialisé par IBM) en 1954.
Le processeur étant uniquement capable d’interpréter le langage machine, un programme appelé ”assembleur” assure donc le passage de ”ADD R1,R2,#125” à son équivalent ”11100010100000100001000001111101”. Par extension, on dit que l’on programme en assembleur quand on écrit des programmes avec ces symboles mnémoniques à la place de suites de ”0” et de ”1”.
Écriture des opérations en assembleur
Le jeu d'instructions utilisé dépend du type de processeur (exemple : x86, ARM, MIPS, etc.). Nous n'en verrons ici qu'un seul, utilisant les registres et la mémoire.
Écriture des opérandes en assembleur
Les opérandes peuvent être de trois sortes :
- une valeur : par exemple 42 sera représentée par #42 ;
- le contenu d'un registre : par exemple le registre 3 s'écrira R3 ;
- l'adresse d'une cellule de mémoire : par exemple l'adresse 56 s'écrira 56 (nous écrirons en décimal pour simplifier...).
Principales instructions
L'objectif n'est pas de savoir programmer en assembleur mais de découvrir les commandes de base.
Exemple d'instruction | Opération utilisée | Explication |
MOV R1,#23 | MOV pour "move", déplacer | Place le nombre 23 dans le registe R1 |
STR R1,125 | STore Registry | Copie la valeur présente dans R1 dans la mémoire d’adresse 125 |
LDR R1,78 | LoaD in Registry | Place dans R1 ce qu’il y a dans la mémoire à l’adresse 78 |
ADD R1,R0,#128 | Additionne R0 et le nombre 128 et place le résultat dans R1 | |
SUB R0,R1,R2 | La valeur de R1-R2 est stockée dans R0 | |
B 45 | Branchement | La prochaine séquence est à l’adresse 45 |
B monLabel (puis monLabel : … ) | La prochaine séquence suit l'étiquette monLabel | |
CMP R0,#23 BNE 78 | CoMPare Branchement si Non Egal | Si R0 différent de 23, la prochaine instruction est en 78 |
CMP R0,#23 BEQ 78 | Branchement si EQual | Si R0 est égal à 23, la prochaine instruction est en 78 |
CMP R0,#23 BGT 78 | Branchement si GreaTer | Si R0 est plus grande que 23, la prochaine instruction est en 78 |
CMP R0,#23 BLT 78 | Branchement si LighTer | Si R0 est plus petite que 23, la prochaine instruction est en 78 |
HALT | Fin du programme. |
Les instructions assembleur B, BEQ, BNE, BGT et BLT n’utilisent pas en général l’adresse mémoire de la prochaine instruction à exécuter, mais des ”labels”. L’utilisation d’un label évite donc d’avoir à manipuler des adresses mémoires en binaire ou en hexadécimale :
CMP R4, #18 BGT monLabel MOV R0,#73 HALT monLabel: MOV R0,#25 HALT
Ici, si le contenu du registre R4 est supérieur à 18 alors il faut mettre 25 dans R0, sinon il faut mettre 73 dans R0.
Exercice
- Expliquez les instructions :
a)ADD R0, R1, #42
b)CMP R4, #18
puisBGT 77
- Écrivez en assembleur :
a) Additionne la valeur stockée dans le registre R0 et la valeur stockée dans le registre R1, le résultat est stocké dans le registre R5.
b) La prochaine instruction à exécuter se situe en mémoire vive à l’adresse 478. Si la valeur stockée dans le registre R0 est égale 42 alors la prochaine instruction à exécuter se situe à l’adresse mémoire 85.