Simulation CPU
Numérique et sciences informatiques
Instructions machine
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.
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.
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 :
- le champ « code opération » qui indique au processeur le type de traitement à réaliser.
Par exemple le code « 0010 0110 » donne l'ordre au CPU d'effectuer une multiplication. - le champ « opérandes » indique la nature des données sur lesquelles l'opération désignée par le « code opération » doit être effectuée.
Les instructions machines sont relativement basiques (on parle d'instructions de bas niveau), voici quelques exemples :
- les instructions arithmétiques (addition, soustraction, multiplication…).
Par exemple, on peut avoir une instruction qui ressemble à « additionne la valeur contenue dans le registre R1 et le nombre 789 et range le résultat dans le registre R0 ». - les instructions de transfert de données qui permettent de transférer une donnée d'un registre du CPU vers la mémoire vive et vice versa.
Par exemple, on peut avoir une instruction qui ressemble à « prendre la valeur située à l'adresse mémoire 487 et la placer dans la registre R2 » ou encore « prendre la valeur située dans le registre R1 et la placer à l'adresse mémoire 512 ». - les instructions de rupture de séquence : les instructions machines sont situées en mémoire vive dans l’ordre :
Par exemple : si l'instruction n°1 est située à l'adresse mémoire 343, l'instruction n°2 sera située à l'adresse mémoire 344, l'instruction n°3 sera située à l'adresse mémoire 345…
Au cours de l'exécution d'un programme, le CPU passe d'une instruction à une autre en passant d'une adresse mémoire à l'adresse mémoire immédiatement supérieure :
Par exemple, après avoir exécuté l'instruction n°2 (situé à l'adresse mémoire 344), le CPU « va chercher » l'instruction suivante à l'adresse mémoire 344+1=345.
Les instructions de rupture de séquence d'exécution encore appelées instructions de saut ou de branchement permettent d'interrompre l'ordre initial sous certaines conditions en passant à une instruction située une adresse mémoire donnée.
Par exemple, dans le cas où à l'adresse mémoire 354 nous avons l'instruction suivante : « si la valeur contenue dans le registre R1 est strictement supérieure à 0 alors exécuter l'instruction située à l'adresse mémoire 4521 ».
Si la valeur contenue dans le registre R1 est strictement supérieure à 0 alors la prochaine instruction à exécuter est l'adresse mémoire 4521, dans le contraire, la prochaine instruction à exécuter est à l'adresse mémoire 355.
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 :
- l'opérande est une valeur immédiate : l'opération est effectuée directement sur la valeur donnée dans l'opérande
- l'opérande est un registre du CPU : l'opération est effectuée sur la valeur située dans un des registres (R0, R1, R2,…), l'opérande indique de quel registre il s'agit
- l'opérande est une donnée située en mémoire vive : l'opération est effectuée sur la valeur située en mémoire vive à l'adresse XXXXX. Cette adresse est indiquée dans l'opérande.
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 »
nous avons 2 valeurs : « le nombre 125 » (qui est une valeur immédiate : cas n°1) et « la valeur située dans le registre R2 » (cas n°2)- quand on considère l'instruction machine :
« prendre la valeur située dans le registre R1 et la placer à l'adresse mémoire 512 »
nous avons 2 valeurs : « à l'adresse mémoire 512 » (cas n°3) et « la valeur située dans le registre R1 » (cas n°2)
Assembleur
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 syntaxesyntaxe La syntaxe concerne le signifiant, soit ce qu'est l'énoncé. 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 :
- L'instruction ADD occupe les 12 bits de poids fort
- Les adresses des registres R1 et R2 occupent chacune 4 bits
- L’opérande #125 occupe les 12 bits de poids faible
Pour en savoir plus : Présentation Architecture et jeu d’instructions ARM
Exemples d'instructions en assembleur
Instructions | Description |
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 |
Entraînement 1 :
Expliquer brièvement par une phrase, les instructions suivantes :ADD R0, R1, #42
LDR R5,98
CMP R4, #18 BGT 77
STR R0,15
B 100
Entraînement 2 :
Écrire les instructions en assembleur correspondant aux phrases suivantes :- « 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 »
- « Place la valeur stockée à l'adresse mémoire 878 dans le registre R0 »
- « Place le contenu du registre R0 en mémoire vive à l'adresse 124 »
- « 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 »