Aller au contenu

Langage machine, langage d'assemblage

En cours

Ce chapitre est en cours d'écriture, il est donc déconseillé de s'y attaquer.

Ce chapitre est en grande partie inspiré du cours de Christophe Mieszczak sur le même sujet, en particulier pour l'usage du M999, qui est inspiré de https://github.com/InfoSansOrdi/M999

Ce cours s'appuie sur le modèle m999. Vous pouvez télécharger la fiche du modèle en cliquant sur ce lien

Fonctionnement d'un processeur

Un processeur exécute un programme qui effectue des calculs sur des données en mémoire RAM.

Le processeur ne peut pas calculer directement avec des valeurs en mémoire RAM. Il doit les rapatrier dans une mémoire interne qu'on appelle les registres. Dans notre cas, on considérera un processeur avec uniquement 3 registres de données, A, B et R.

Les calculs arithmétiques sur les données ont lieu dans l'unité arithmétique et logique (souvent appelée ALU ou UAL). Cette unité prends un ou deux nombre en entrée dans les registres A et/ou B, effectue une opération dessus, puis écrit le résultat dans le registre R .

Un programme est un ensemble d'opérations élémentaires que nous allons détaille par la suite. Le processeur "regarde" chaque instruction, et en exécute le contenu. Pour savoir à quelle instruction il en est, le processeur a un registre supplémentaire, le compteur ordinal (appelé PC, pour Process Counter en anglais), qui est modifié à chaque instruction exécutée.

Remarques

Les processeurs modernes sont bien plus complexe, de nombreux autres registres, d'autres unités de calcul etc...

Malgré ces différences, le principe de fonctionnement reste strictement le même.

Les valeurs en mémoire, ou plutôt les cases qui permettent de stocker des valeurs, sont identifiées par un nombre, que l'on appelle adresse. Dans notre cas, on aura 100 cases, de 0 à 99. Chaque case peut contenir une valeur entre 0 et 999. Tant qu'une case n'as pas une valeur assignée, on considère sa valeur comme indéfinie (laissée vide).

Assembleur

Les instructions que le processeur exécutent sont représentées en mémoire par des nombres, un peu comme les caractères sont représentés par des codes ASCII ou Unicode.

Les jeux d'instructions varient en fonction des processeurs, mais ils sont relativement similaires dans le principe.

Il est extrêmement difficile de travailler directement sur les représentation binaire des instructions élémentaires. Pour palier ce problème, les programmeurs utilisent un langage d'assemblage, qui est une représentation textuelle d'un programme machine. On utilise ensuite un programme, appelé assembleur, qui transforme les instructions textuelles en leur code binaire. Par abus de langage, on parle souvent de programmer en assembleur pour dire que l'on écrit du code en langage d'assemblage.

La version textuelle d'une instruction est appelée mnémonique. On parlera dans ce chapitre d'instruction et de mnémonique de manière interchangeable. Elles sont présentées dans la suite de ce chapitre.

Le résultat d'un programme sera écrit dans la case 99 avant qu'il s'arrête.

Accès en mémoire

Mnémonique Usage Description
LDA LDA adr Charge la valeur à l'adresse mémoire adr dans le registre A.
LDB LDB adr Charge la valeur à l'adresse mémoire adr dans le registre B.
STR STR adr Stocke la valeur du registre R à l'adresse mémoire adr.

Arithmétique

Mnémonique Usage Description
ADD ADD Ajoute les valeurs des registres A et B. Le résultat est stocké dans le registre R.
SUB SUB Soustrait la valeur du registre B à celle du registre A. Le résultat est stocké dans le registre R.

Contrôle

Les instruction de contrôle permettent de changer la valeur du registre PC sous certaines conditions.

Mnémonique Usage Description
JMP JMP i Met le registre PC à la valeur i.
JNZ JNZ i Met le registre PC à la valeur i si le registre R ne contient pas la valeur 0.
JPZ JPZ i Met le registre PC à la valeur i si le registre R contient la valeur 0.
HLT HLT Termine le programme.

Quelques programmes

Addition

Cases mémoires utilisées : 0, 1, 99

Ce programme ajoute les valeurs dans les cases 0 et 1 et mets le résultat dans la case 99.

LDA 0
LDB 1
ADD
STR 99
HLT

Multiplication

Cases mémoires utilisées : 0, 1, 2, 99

Ce programme multiplie la valeur de la case 0 par la valeur de la case 1, et mets le résultat dans la case 99. La case 2 a pour valeur initale 1. La case 99 a pour valeur initiale 0.

LDA 0 
LDB 99
ADD
STR 99
LDA 1
LDB 2
SUB
STR 1
JNZ 0
HLT

Question : comment pourrait-on produire la valeur 0 avec le jeu d'instruction dont nous disposons ?

Question : est-ce qu'augmenter le nombre de registres nous permettrait de réduire le nombre d'instructions exécutées par le programme, et donc sa vitesse d'execution ?

(Avancé) Représentation de chaînes

TODO (prof) exercice avancé : manipulation de chaîne -> décoder une chaine de taille variable avec un code de césar ?

(Avancé) Représentation de tableaux

TODO (prof) exo