Aller au contenu

"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

  1. Expliquez les instructions :
    a) ADD R0, R1, #42
    b) CMP R4, #18 puis BGT 77
  2. É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.