Langage machine et assembleur

Objectifs

  • Découvrir le langage machine ;

  • Découvrir les bases de l'assembleur.

Mise en situation

Les développeurs écrivent des programmes dans des langages compréhensibles par les humains. Mais l'ordinateur travaille à un niveau différent, il manipule des séquences binaires.

Le langage le plus proche de la machine se nomme assembleur. C'est un langage qui permet des instructions très basiques. On l'utilise assez rarement car il est beaucoup plus efficace pour un être humain d'écrire dans un langage de haut niveau comme le C ou le JavaScript. D'autant qu'il existe des compilateurs ou des interpréteurs qui transforment ce code de haut niveau que l'on écrit en langage machine.

Mais il est néanmoins utile de comprendre les mécaniques de l'assembleur. Cela aide à comprendre certains concepts comme l'adressage mémoire. Et c'est utile pour programmer plus efficacement.

FondamentalCodage binaire

Un processeur ne comprend pas les langages de programmation. Il ne peut traiter que des instructions sous forme binaire, c'est-à-dire constituées de 0 et de 1. Un processeur ne traitera pas le nombre 42 mais la suite 00101010, qui est l'équivalent de 42 en codage binaire.

DéfinitionLe langage assembleur

L'assembleur est un langage compréhensible par le processeur. Il ne comporte que quelques instructions très simples (déplacer une donnée, multiplier, additionner, etc.), là où les langages de programmation classiques comportent des instructions plus complexes, correspondant à une combinaisons d'instructions en assembleur.

Les registres

Les registres sont des petites zones mémoire dans le processeur où sont stockées les variables d'entrée ou de sortie d'un calcul. Chaque processeur n'a que quelques registres nommés AX, BX, CX, DX, etc.

Leur taille étant extrêmement limitée, leur tâche est de stocker une donnée uniquement le temps du calcul (quelques fractions de secondes) et d'envoyer le résultat en mémoire vive par la suite, quitte à récupérer le résultat dans la mémoire vive pour un calcul ultérieur.

ExempleQuelques instructions de base

Chaque instruction assembleur a une équivalence binaire direct. Le processeur peut ainsi comprendre ces instructions.

Voici quelques exemples d'instructions de base pour le processeur Intel 8086 :

  • MOV destination source : déplace une valeur fixe ou celle d'un registre dans un autre,

  • INC registre : additionne 1 à la valeur d'un registre,

  • NEG registre : change le signe de la valeur stockée dans un registre,

  • IMUL destination source : multiplie les valeurs et stocke le résultat dans le premier registre.

AttentionTraduire un langage de programmation en langage machine

L'écriture d'un programme informatique ne se fait la plupart du temps pas en assembleur.

On utilise des langages dits de plus haut niveau qui sont eux-mêmes traduits automatiquement en assembleur par un autre programme :

  • le compilateur pour les langages compilés (comme C ou C++),

  • ou l'interpréteur pour les langages interprétés (comme JavaScript ou Python).

ComplémentToutes les machines ne parlent pas exactement le même langage

Tous les processeurs comprennent un langage binaire. Cependant, chaque type de processeur a son propre jeu d'instructions.

Par exemple, la plupart des ordinateurs ont des processeurs utilisant un jeu d'instructions étendu (dit CISC) alors que les smartphones ont des processeurs utilisant un jeu d'instructions réduit (RISC). Ainsi, un code dans un langage de programmation donné sera traduit différemment en fonction du processeur cible.

À retenir

  • Un processeur ne traite que des instructions binaires.

  • L'assembleur est un langage composé d'instructions basiques et facile à traduire en binaire.

  • Une instruction dans un langage de programmation donné correspond à de multiples instructions en assembleur.