Cours issu de : https://info.blaisepascal.fr/nsi-modele-darchitecture-de-von-neumann
Le CPU ne gère que des grandeurs booléennes : les instructions exécutées au niveau du CPU sont donc codées en binaire. L’ensemble des instructions exécutables directement par le microprocesseur constitue ce que l’on appelle le langage machine, c'est le langage de plus bas niveau possible.
Les langages de programmation « évolués » (Python, C++, …), destinés à être utilisés par des humains, se composent d’instructions complexes, opérant sur des types de données beaucoup plus complexes que des booléens. Ce sont des langages de haut niveau.
Il faudra donc passer par une étape de « conversion » du langage évolué vers le langage machine, chaque instruction du langage « évolué » donnant lieu à un grand nombre d’instructions « élémentaires » du langage machine. On distinguera l’opération de compilation (conversion de tout le code évolué en langage machine) de l’opération d’interprétation (la conversion est réalisée au fur et à mesure du déroulement du code).
Une instruction machine est une chaîne binaire composée principalement de 2 parties :
Les instructions machines sont relativement basiques (on parle d’instructions de bas niveau), voici quelques exemples :
Comme déjà dit, les opérandes désignent les données sur lesquelles le code opération de l’instruction doit être réalisée. Un opérande peut être de 3 natures différentes :
Exemples :
Quand on considère l’instruction machine : « additionne le nombre 125 et la valeur située dans le registre R2 , range le résultat dans le registre R1 ».
Quand on considère l’instruction machine : « prendre la valeur située dans le registre R1 et la placer à l’adresse mémoire 512 ».
Le microprocesseur étant incapable d’interpréter la phrase « additionne le nombre 125 et la valeur située dans le registre R2 , range le résultat dans le registre R1 », il faut coder cette instruction sous forme binaire :
« additionne le nombre 125 et la valeur située dans le registre R2 , range le résultat dans le registre R1 ».
⇓
« 11100010100000100001000001111101 »
Afin de faciliter la lecture et l’écriture d’instructions machine par les informaticiens, on remplace les codes binaires par des symboles mnémoniques, en utilisant la syntaxe du langage appelé assembleur.
« additionne le nombre 125 et la valeur située dans le registre R2 , range le résultat dans le registre R1 ».
⇓
« ADD R1,R2,#125 »
⇓
« 11100010 10000010 00010000 01111101 »
Remarque : chaque élément de l’instruction occupe une quantité de mémoire bien définie. Par exemple, en architecture ARM :
Pour en savoir plus : Présentation Architecture et jeu d’instructions ARM
QUELQUES INSTRUCTIONS :
LDR R1,78
Place la valeur stockée à l’adresse mémoire 78 dans le registre R1.
STR R3,125
Place la valeur stockée dans le registre R3 en mémoire vive à l’adresse 125.
ADD R1,R0,#128
Additionne le nombre 128 (une valeur immédiate est identifiée grâce au symbole # ) et la valeur stockée dans le registre R0, place le résultat dans le registre R1.
ADD R0,R1,R2
Additionne la valeur stockée dans le registre R1 et la valeur stockée dans le registre R2, place le résultat dans le registre R0.
SUB R1,R0,#128
Soustrait le nombre 128 de la valeur stockée dans le registre R0, place le résultat dans le registre R1.
SUB R0,R1,R2
Soustrait la valeur stockée dans le registre R2 de la valeur stockée dans le registre R1, place le résultat dans le registre R0.
MOV R1, #23
Place le nombre 23 dans le registre R1.
MOV R0, R3
Place la valeur stockée dans le registre R3 dans le registre R0.
B 45
Structure de rupture de séquence : la prochaine instruction à exécuter se situe en mémoire vive à l’adresse 45.
CMP R0, #23
Compare la valeur stockée dans le registre R0 et le nombre 23. Cette instruction CMP doit précéder une instruction de branchement conditionnel BEQ, BNE, BGT, BLT (voir ci-dessous).
CMP R0, R1
Compare la valeur stockée dans le registre R0 et la valeur stockée dans le registre R1.
CMP R0, #23
BEQ 78
La prochaine instruction à exécuter se situe à l’adresse mémoire 78 si la valeur stockée dans le registre R0 est égale à 23.
CMP R0, #23
BNE 78
La prochaine instruction à exécuter se situe à l’adresse mémoire 78 si la valeur stockée dans le registre R0 n’est pas égale à 23.
CMP R0, #23
BGT 78
La prochaine instruction à exécuter se situe à l’adresse mémoire 78 si la valeur stockée dans le registre R0 est plus grand que 23.
CMP R0, #23
BLT 78
La prochaine instruction à exécuter se situe à l’adresse mémoire 78 si la valeur stockée dans le registre R0 est plus petit que 23.
HALT
Arrête l’exécution du programme
Exemple :
Expliquer brièvement par une phrase, les instructions suivantes :
ADD R0, R1, #42
Additionne le nombre 42 (une valeur immédiate est identifiée grâce au symbole # ) et la valeur stockée dans le registre R1, place le résultat dans le registre R0.
LDR R5,98
Place la valeur stockée à l’adresse mémoire 98 dans le registre R5.
CMP R4, #18
Compare la valeur stockée dans le registre R4 et le nombre 18. Cette instruction CMP doit précéder une instruction de branchement conditionnel BEQ, BNE, BGT, BLT (voir ci-dessous).
BGT 77
La prochaine instruction à exécuter se situe à l’adresse mémoire 77 si la valeur stockée dans le registre R4 est plus grand que 18.
STR R0,15
Place la valeur stockée dans le registre R0 en mémoire vive à l’adresse 15.
B 100
Structure de rupture de séquence : la prochaine instruction à exécuter se situe en mémoire vive à l’adresse 100.
LABELS :
En réalité, les instructions assembleur B , BEQ , BNE , BGT et BLT n’utilisent pas directement l’adresse mémoire de la prochaine instruction à exécuter, mais des labels.
Un label correspond à une adresse en mémoire vive (c’est l’assembleur qui fera la traduction « label »→ »adresse mémoire »). L’utilisation d’un label évite donc d’avoir à manipuler des adresses mémoires.
Voici un exemple qui montre comment utiliser un label :
CMP R4, #18
BGT monLabel
MOV R0, #14
HALT
monLabel:
MOV R0,#18
HALT
Dans l’exemple ci-dessus, nous avons choisi monLabel comme nom de label. La ligne MOV R0,#18 a pour label « monLabel » car elle est située juste après la ligne monLabel: .
Concrètement, voici ce qui se passe avec ce programme : si la valeur stockée dans le registre R4 est supérieure à 18 on place le nombre 18 dans le registre R0 sinon on place le nombre 14 dans le registre R0.
ATTENTION : la présence du HALT juste après la ligne MOV R0,#14 est indispensable, car sinon, la ligne MOV R0,#18 sera aussi exécutée (même si la valeur stockée dans le registre R4 est inférieure à 18).
En TP, nous allons utiliser le simulateur d'assembleur de Peter Higginson.
Cette machine virtuelle simule une architecture de 32 bits. L'instruction Halt n'existe pas en pratique.