Le langage machine
Rappel d'ouverture (5 minutes, cours fermé)
- Dans le modèle de von Neumann, où est rangé le programme ?
- Que désigne le compteur ordinal ?
- Pourquoi un programme d'ordinateur ne marche-t-il pas sur un téléphone ?
Corrigé
- Dans la mémoire, avec les données.
- Le numéro de la case où se trouve la prochaine instruction.
- Les deux machines n'ont pas la même table d'instructions.
1. La machine et ses instructions
On va parler dans le langage d'une machine : le Little Man Computer (LMC).
- Elle a 100 cases mémoire, numérotées de 0 à 99. Chaque case contient un nombre.
- Elle a une seule case de calcul : l'accumulateur. Tous les calculs se font dedans.
Et voici tout ce qu'elle sait faire. Rien d'autre.
| Instruction | Exemple | Ce que fait la machine |
|---|---|---|
LDA (load) |
LDA 15 |
Elle prend ce qu'il y a dans la case n°15 et le met dans l'accumulateur. La case n°15 ne change pas. |
STA (store) |
STA 15 |
Elle met ce qu'il y a dans l'accumulateur dans la case n°15. L'accumulateur ne change pas. |
ADD |
ADD 15 |
Elle ajoute à l'accumulateur ce qu'il y a dans la case n°15. |
SUB |
SUB 15 |
Elle enlève de l'accumulateur ce qu'il y a dans la case n°15. |
INP (input) |
INP |
Elle demande un nombre et le met dans l'accumulateur. |
OUT (output) |
OUT |
Elle affiche ce qu'il y a dans l'accumulateur. |
HLT (halt) |
HLT |
Elle s'arrête. |
BRA (branch) |
BRA 4 |
Elle va à la case n°4, au lieu de passer à la suivante. |
BRZ (branch if zero) |
BRZ 4 |
Si l'accumulateur vaut 0, elle va à la case n°4. Sinon, elle passe à la suivante. |
BRP (branch if positive) |
BRP 4 |
Si l'accumulateur vaut 0 ou plus, elle va à la case n°4. Sinon, elle passe à la suivante. |
Cette table ne s'apprend pas par cœur : tu l'as sous les yeux pour tous les exercices. C'est une convention, comme la table que ton groupe a inventée : une autre machine en a une autre.
La même table, dite comme dans les livres
C'est exactement la même chose, dite de façon plus courte et plus précise. Deux mots à connaître :
<adr>n'est pas à recopier : les chevrons< >veulent dire « mets un numéro de case ici ».LDA <adr>s'écrit par exempleLDA 15;PCest le compteur ordinal, le numéro de la case où se trouve la prochaine instruction.
De gauche à droite, le langage devient de plus en plus formel : la première table en français de tous les jours, puis la description usuelle, puis la notation, où ← se lit « reçoit ».
| Instruction | Description usuelle | Notation |
|---|---|---|
LDA <adr> |
charge dans l'accumulateur le contenu de l'adresse <adr> |
ACC ← mémoire[<adr>] |
STA <adr> |
range le contenu de l'accumulateur à l'adresse <adr> |
mémoire[<adr>] ← ACC |
ADD <adr> |
ajoute à l'accumulateur le contenu de l'adresse <adr> |
ACC ← ACC + mémoire[<adr>] |
SUB <adr> |
soustrait de l'accumulateur le contenu de l'adresse <adr> |
ACC ← ACC − mémoire[<adr>] |
INP |
lit une entrée et la place dans l'accumulateur | ACC ← entrée |
OUT |
envoie l'accumulateur sur la sortie | sortie ← ACC |
HLT |
arrête le processeur | arrêt |
BRA <adr> |
branchement inconditionnel à l'adresse <adr> |
PC ← <adr> |
BRZ <adr> |
branchement à l'adresse <adr> si l'accumulateur est nul |
si ACC = 0 : PC ← <adr> |
BRP <adr> |
branchement à l'adresse <adr> si l'accumulateur est positif ou nul |
si ACC ≥ 0 : PC ← <adr> |
À l'évaluation, tu auras cette deuxième table, et seulement elle
Pas besoin de l'apprendre par cœur, elle te sera donnée. Mais il faut savoir la lire : entraîne-toi avec elle, au plus tard pour les défis.
2. Prédire, sur ton cahier
Pas de simulateur dans cette partie : papier et crayon.
2.1 LDA
Exercice 1
Au départ, la mémoire contient :
| Case n° | 10 | 11 | 12 | 13 |
|---|---|---|---|---|
| Contenu | 7 | 3 | 0 | 25 |
Sur ton cahier, écris :
- ce que contient l'accumulateur après
LDA 11; - ce que contient l'accumulateur après
LDA 13; - pour le programme ci-dessous, l'accumulateur après la ligne 1, puis après la ligne 2, et ce que contient la case n°10 à la fin.
| Ligne | Instruction |
|---|---|
| 1 | LDA 10 |
| 2 | LDA 11 |
2.2 STA
Exercice 2
Même mémoire au départ : case n°10 → 7, case n°11 → 3, case n°12 → 0, case n°13 → 25.
Programme A. Recopie et remplis.
| Ligne | Instruction | Accumulateur | Case n°10 | Case n°12 |
|---|---|---|---|---|
| 1 | LDA 10 |
|||
| 2 | STA 12 |
Programme B. Écris le contenu des cases 10 à 13 à la fin.
| Ligne | Instruction |
|---|---|
| 1 | LDA 13 |
| 2 | STA 10 |
| 3 | STA 11 |
Exercice 3 : échanger deux cases
Même mémoire au départ. Ce programme veut échanger les cases n°10 et n°11, pour avoir 3 dans la case n°10 et 7 dans la case n°11.
| Ligne | Instruction |
|---|---|
| 1 | LDA 10 |
| 2 | STA 11 |
| 3 | LDA 11 |
| 4 | STA 10 |
Sur ton cahier : que contiennent les cases n°10 et n°11 à la fin ? Le programme a-t-il réussi ?
2.3 ADD et SUB
Exercice 4
Même mémoire au départ : case n°10 → 7, case n°11 → 3, case n°12 → 0, case n°13 → 25.
Programme A. Recopie et remplis.
| Ligne | Instruction | Accumulateur | Case n°12 |
|---|---|---|---|
| 1 | LDA 10 |
||
| 2 | ADD 11 |
||
| 3 | STA 12 |
||
| 4 | SUB 10 |
Programme B. Que contient l'accumulateur à la fin ?
| Ligne | Instruction |
|---|---|
| 1 | LDA 13 |
| 2 | SUB 10 |
| 3 | SUB 10 |
| 4 | SUB 10 |
2.4 Un programme entier
Le programme aussi est rangé dans la mémoire : sa première instruction dans la case n°0, la suivante dans la case n°1, et ainsi de suite. La machine les fait l'une après l'autre, jusqu'à HLT.
Exercice 5
Toutes les cases de données valent 0 au départ.
Programme A. On tape 4, puis 9. Qu'est-ce qui s'affiche ? Que contient la case n°10 à la fin ?
| Case n° | Instruction |
|---|---|
| 0 | INP |
| 1 | STA 10 |
| 2 | INP |
| 3 | ADD 10 |
| 4 | OUT |
| 5 | HLT |
Programme B. On tape 6. Qu'est-ce qui s'affiche ? Que contient la case n°11 à la fin ?
| Case n° | Instruction |
|---|---|
| 0 | INP |
| 1 | STA 10 |
| 2 | ADD 10 |
| 3 | STA 11 |
| 4 | LDA 10 |
| 5 | OUT |
| 6 | HLT |
3. Donner un nom aux cases
Compter les numéros de cases, c'est pénible, et on se trompe. Alors on donne un nom à une case.
a: DATveut dire : cette case s'appellea, et elle contient 0 au départ.b: DAT 5veut dire : cette case s'appelleb, et elle contient 5 au départ.DATn'est pas une instruction. On le met après leHLT, pour que la machine ne passe jamais dessus.
C'est le programme A de l'exercice 5, en plus lisible.
Exercice 6
Chaque ligne occupe une case, à partir de la case n°0.
| Ligne | Instruction |
|---|---|
| 1 | LDA a |
| 2 | ADD b |
| 3 | STA c |
| 4 | SUB a |
| 5 | OUT |
| 6 | HLT |
| 7 | a: DAT 4 |
| 8 | b: DAT 7 |
| 9 | c: DAT 0 |
Sur ton cahier, écris :
- le numéro de la case qui s'appelle
c; - le nombre affiché ;
- ce que contient
cà la fin.
Correction
cest la case n°8 : la ligne 1 est dans la case n°0, donc la ligne 9 dans la case n°8. Le nom, c'est juste un numéro que la machine calcule pour toi.- Affiche 7.
ccontient 11. Ce n'est pas ce qui est affiché :OUTaffiche l'accumulateur.
4. Le simulateur
Maintenant, et seulement maintenant, la machine.
Installation
- Dans VSCode, ouvre les extensions (barre de gauche), cherche
mmarchand.lmc-vscode, clique Installer. - Crée un fichier qui finit par
.lmc, par exempleessai.lmc. - Pour ouvrir le simulateur, clique sur la flèche ▶ en haut du fichier.
| Bouton | Ce qu'il fait |
|---|---|
| Assembler .lmc | traduit ton fichier en nombres |
| Charger .lmcobj en RAM | met ces nombres dans la mémoire |
| Step | fait une instruction |
| Run | fait tout, jusqu'au HLT |
Tu as modifié ton programme ? Assemble à nouveau
Sinon, « Charger » remet l'ancienne version en mémoire.
Exercice 7
Tape le programme de l'exercice 6, et vérifie tes réponses en mode Step, une instruction à la fois.
5. Sauter
Jusqu'ici, la machine fait les cases dans l'ordre. BRA, BRZ et BRP la font sauter à une autre case. Avec un nom de case, c'est plus simple : BRA fin veut dire « va à la case qui s'appelle fin ».
Dans toute cette partie : écris ta réponse avant d'ouvrir le simulateur.
5.1 BRA
Exercice 8
Programme A. On tape 5. Qu'est-ce qui s'affiche ?
| Ligne | Instruction |
|---|---|
| 1 | INP |
| 2 | BRA fin |
| 3 | OUT |
| 4 | fin: HLT |
Programme B. Combien de nombres ce programme va-t-il demander ?
| Ligne | Instruction |
|---|---|
| 1 | debut: INP |
| 2 | OUT |
| 3 | BRA debut |
N'ouvre pas le simulateur tant que tu n'as pas écrit tes réponses.
Correction
A. Rien. La ligne 2 saute par-dessus le OUT.
B. Sans fin. Après la ligne 3, la machine revient à la ligne 1, toujours. Rien ne l'arrête.
5.2 BRZ
Exercice 9
| Ligne | Instruction |
|---|---|
| 1 | INP |
| 2 | BRZ zero |
| 3 | LDA cent |
| 4 | OUT |
| 5 | HLT |
| 6 | zero: LDA mille |
| 7 | OUT |
| 8 | HLT |
| 9 | cent: DAT 100 |
| 10 | mille: DAT 1000 |
Sur ton cahier, écris ce qui s'affiche :
- quand on tape 5 ;
- quand on tape 0 ;
- quand on tape 5, si on a effacé la ligne 5.
N'ouvre pas le simulateur tant que tu n'as pas écrit tes réponses.
Correction
- Avec 5 : 100.
- Avec 0 : 1000.
- Sans la ligne 5, avec 5 : 100 puis 1000. Rien n'arrête la machine après le premier
OUT, alors elle continue sur la ligne suivante. Chaque chemin a besoin de sonHLT.
5.3 BRP
Exercice 10
| Ligne | Instruction |
|---|---|
| 1 | INP |
| 2 | SUB dix |
| 3 | BRP grand |
| 4 | LDA zero |
| 5 | OUT |
| 6 | HLT |
| 7 | grand: LDA un |
| 8 | OUT |
| 9 | HLT |
| 10 | dix: DAT 10 |
| 11 | zero: DAT 0 |
| 12 | un: DAT 1 |
Sur ton cahier, écris :
- ce qui s'affiche quand on tape 15, puis 10, puis 3 ;
- en une phrase, ce que fait ce programme.
N'ouvre pas le simulateur tant que tu n'as pas écrit tes réponses.
Correction
- 15 donne 1, 10 donne 1, 3 donne 0.
- Il affiche 1 si le nombre vaut 10 ou plus, et 0 sinon. La machine ne sait pas comparer : on enlève 10, et on regarde si le résultat est positif.
5.4 Revenir en arrière : la boucle
Exercice 11
| Ligne | Instruction |
|---|---|
| 1 | INP |
| 2 | STA cpt |
| 3 | boucle: LDA cpt |
| 4 | OUT |
| 5 | SUB un |
| 6 | STA cpt |
| 7 | BRZ fin |
| 8 | BRA boucle |
| 9 | fin: HLT |
| 10 | cpt: DAT |
| 11 | un: DAT 1 |
On tape 3. Sur ton cahier, écris :
- les nombres affichés, dans l'ordre ;
- combien de fois la ligne 4 est faite ;
- ce que contient
cptà la fin.
Puis : qu'est-ce qui se passe si on tape 0 ?
N'ouvre pas le simulateur tant que tu n'as pas écrit tes réponses.
Correction
- Affiche 3, 2, 1.
- La ligne 4 est écrite une fois et faite trois fois.
cptcontient 0 : c'est ce 0 qui fait sauter la ligne 7 versfin.
Avec 0 : la machine affiche 0, puis −1, −2, −3… et ne s'arrête jamais. cpt ne repasse jamais par 0, donc la ligne 7 ne saute jamais.
Deux sortes de sauts
- Sauter en avant, par-dessus des lignes : la machine choisit un chemin. En Python, ce sera
if. - Sauter en arrière : la machine refait les mêmes lignes. En Python, ce sera
while.
6. Écrire des programmes
Dans l'ordre. Chaque défi ajoute une seule difficulté.
Pour chacun : écris ton programme sur ton cahier, puis tape-le et teste-le dans le simulateur.
Il n'y a pas de correction : c'est le simulateur qui te dit si ça marche. Si ça ne marche pas, reprends ton programme ligne par ligne avec la deuxième table, celle que tu auras à l'évaluation. Chaque instruction fait ce qui est écrit dans la table, et rien d'autre.
Sans saut
Défi 1
Demander un nombre et l'afficher.
Défi 2
Demander un nombre et l'afficher deux fois.
Défi 3
Demander deux nombres, et afficher le second, puis le premier.
Indice
Le deuxième INP écrase le premier nombre. Range-le avant.
Défi 4
Demander deux nombres et afficher leur somme.
Défi 5
Demander deux nombres et afficher le premier moins le second.
Indice
Au moment du SUB, c'est le premier nombre qui doit être dans l'accumulateur.
Défi 6
Demander un nombre et afficher son triple. La machine ne sait pas multiplier.
Indice
Le triple de 7, c'est 7 + 7 + 7.
Avec un saut
Défi 7
Demander un nombre. Afficher 1 s'il vaut 0 ou plus, 0 s'il est négatif.
Indice
Regarde l'exercice 10. Les nombres 0 et 1 doivent exister dans des cases : zero: DAT 0 et un: DAT 1.
Défi 8
Demander deux nombres. Afficher 1 s'ils sont égaux, 0 sinon.
Indice
Deux nombres sont égaux quand l'un moins l'autre vaut 0.
Défi 9
Demander deux nombres et afficher le plus grand.
Indice léger
Calcule le second moins le premier, et regarde le signe avec BRP.
Indice précis
Range les deux nombres dans a et b. Si b − a vaut 0 ou plus, on saute vers un morceau qui affiche b. Sinon, on affiche a. Chaque morceau finit par son HLT.
Défi 10
Demander trois nombres et afficher le plus grand.
Indice léger
Une case max garde le plus grand vu jusqu'ici. Le premier nombre y va directement.
Indice précis
Pour chaque nouveau nombre : nombre moins max. Si c'est 0 ou plus, le nombre va dans max. On n'affiche qu'une fois, à la fin.
Avec une boucle
Défi 11
Afficher 10, 9, 8, … jusqu'à 1.
Indice
C'est l'exercice 11, sans le INP : le compteur part de 10.
Défi 12
Afficher 1, 2, 3, … jusqu'à 10.
Indice léger
Le compteur ne passe jamais par 0. Pour savoir s'il vaut 10, calcule compteur moins 10.
Indice précis
Ce calcul écrase l'accumulateur : le compteur doit être rangé dans une case cpt, et rechargé après le test.
Défi 13
Demander un nombre, et afficher sa table de multiplication de 1 à 10. On tape 7 : affiche 7, 14, 21, … 70.
Indice léger
C'est le défi 12, avec une case res en plus : à chaque tour, on lui ajoute le nombre tapé.
Indice précis
Deux cases à tenir, res et cpt, et un seul accumulateur. Avant de charger l'une, range l'autre.
Défi 14
Demander un nombre N, et afficher 1 + 2 + … + N. On tape 5 : affiche 15.
Indice léger
Un compteur part de N et descend jusqu'à 1. À chaque tour, on l'ajoute à une case somme.
Indice précis
Charger somme, ajouter cpt, ranger somme. Puis charger cpt, enlever 1, ranger cpt, tester s'il vaut 0. Afficher une seule fois, à la sortie.
7. Quand ça ne marche pas
- Le simulateur fait l'ancien programme : assemble à nouveau.
- Ça ne s'arrête pas : un saut en arrière sans sortie, ou un
HLTqui manque. - Une valeur a disparu : tu as chargé autre chose dans l'accumulateur sans la ranger avant.
- N'importe quoi, puis ça s'arrête : la machine est passée sur tes
DAT. Il manque unHLTavant.
Utilise Step, et dis ce qui va se passer avant de cliquer.
8. À retenir
- La machine ne connaît qu'une petite table d'instructions. Elle fait exactement ce qui est écrit.
- Il n'y a qu'un accumulateur : on range avant de charger autre chose.
LDAetSTAcopient : la case, ou l'accumulateur, garde sa valeur.- Un nom de case, c'est juste un numéro que la machine calcule pour toi.
- Sauter en avant, c'est choisir ; sauter en arrière, c'est répéter.
Une case contient au plus 9999. Que se passe-t-il si un calcul donne 10 000 ? C'est la question du chapitre Représentation de l'information.
Ce que la machine voit vraiment, des nombres et rien d'autre, est à la page Pour aller plus loin.