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.
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.
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