Aller au contenu

Langage machine

On appelle langage machine la suite de bits (de « 0 » et de « 1 ») qui est interprétée par le processeur d'un ordinateur lorsqu'il exécute un programme informatique (via l'unité de commande). Le processeur est incapable d'exécuter directement des programmes écrits dans un langage de programmation comme Python.

Format d'une instruction machine

Chaque processeur a son langage, c'est-à-dire un ensemble d'instructions spécifique que lui seul peut traiter. Comme il existe différents types de processeur, il existe aussi différents types de jeux d'instruction.

Bien que ces jeux d'instructions sont distincts les uns des autres, les instructions qui les composent ont une structure commune, généralement en deux parties :

Instruction machine

  • Le champ « code opération » indique au processeur le type de traitement à réaliser.
    Par exemple le code 00100110 peut donner 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 opérandes

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 :

  1. L'opérande est une valeur immédiate (constante) : l'opération est effectuée directement sur la valeur donnée dans l'opérande.
  2. L'opérande est un registre (c'est-à-dire un emplacement mémoire) 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.
  3. L'opérande est une donnée située en mémoire vive (emplacement mémoire hors du CPU) : 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.

Quelques instructions machine

Les instructions machines sont relativement basiques (on parle d'instructions de bas niveau). Les paragraphes ci-dessous présentent quelques exemples.

Les instructions arithmétiques (addition, soustraction, multiplication, ...)

Une instruction d'addition sera sous la forme :
additionner le nombre 789 et la valeur contenue dans le registre R1 et range le résultat dans le registre R0.

Interprétation

Cette instruction est composée :

  • du code opération qui correspond à l'addition ;
  • des opérandes suivants :
    • « le nombre 125 » qui est une valeur immédiate (cas n°1),
    • et « la valeur contenue dans le registre R1 » (cas n°2) ;
  • de l'emplacement où placer le résultat de l'instruction (« dans le registre R0 »).

Les instructions de transfert de données

Elles permettent de transférer une donnée d'un registre du CPU vers la mémoire vive (la RAM) et vice-versa.

Une instruction de transfert sera sous la forme :
prendre la valeur située à l'adresse mémoire 487 et la placer dans la registre R2

ou bien :
prendre la valeur située dans le registre R1 et la placer à l'adresse mémoire 512.

Interprétation

Cette dernière instruction est composée :

  • du code opération qui correspond au transfert de donnée ;
  • des opérandes suivants :
    • « la valeur contenue dans le registre R1 » (cas n°2),
    • et « l'adresse mémoire 512 » cas n°3).

Les instructions de rupture de séquence

Les instructions machines sont situées en mémoire vive (en RAM). Pour illustrer la notion de déroulement d'un programme en langage machine, on suppose que :

  • l'instruction n°1 est située à l'adresse mémoire 343,
  • l'instruction n°2 est située à l'adresse mémoire 344,
  • l'instruction n°3 est située à l'adresse mémoire 345,
  • etc...

Au cours de l'exécution de ce programme, le CPU passe d'une instruction à une autre en passant d'une adresse mémoire à l'adresse mémoire immédiatement supérieure : après avoir exécuté l'instruction n°2 (situé à l'adresse mémoire 344), le CPU &lquo; va chercher » l'instruction suivante à l'adresse mémoire 344+1 = 345.

Les instructions de rupture de séquence d'exécution (aussi appelées « instructions de saut » ou « instructions de branchement ») permettent d'interrompre l'ordre initial sous certaines conditions en passant à une instruction située une adresse mémoire donnée.

Exemple

A l'adresse mémoire 354, nous avons l'instruction :
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.

Pour exécuter cette instruction, le CPU va comparer le contenu du registre R1 avec 0.

  • Dans le cas où cette valeur est strictement supérieure à 0 alors la prochaine instruction à exécuter sera celle située de l'adresse mémoire 4521.
  • Dans le cas contraire, la prochaine instruction à exécuter sera celle située à l'adresse mémoire 355.

Remarque

Évidemment le microprocesseur est 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.

Tout cela doit être codé sous forme binaire...

Assembleur

Un programme en langage machine est donc une suite très très longue de « 1 » et de « 0 » : sur les dizaines de milliers de « 1 » et de « 0 » qui composent un programme en langage machine (même de taille modeste), une seule erreur, et le programme ne fonctionne pas...
Imaginez la difficulté pour retrouver l'erreur !

Ce code machine peut être rendu compréhensible pour un humain par un codage direct en langage d'assemblage (assembleur). Ce langage remplace les codes binaires illisibles par des symboles mnémoniques plus faciles à retenir (et à comprendre).

Exemple

L'instruction : additionner le nombre 789 et la valeur contenue dans le registre R1 et range le résultat dans le registre R0.

pourra être écrite sous la forme : ADD R0,R1,#789

plutôt qu'en binaire : 11100010100000100001000001111101.

Aujourd'hui plus personne n'écrit de programme directement en langage machine (suite de « 1 » et de « 0 »). En revanche l'écriture de programme en assembleur est encore chose relativement courante.