Skip to content

Le langage machine

Rappel d'ouverture (5 minutes, cours fermé)

  1. Dans le modèle de von Neumann, où est rangé le programme ?
  2. Que désigne le compteur ordinal ?
  3. Pourquoi un programme d'ordinateur ne marche-t-il pas sur un téléphone ?
Corrigé
  1. Dans la mémoire, avec les données.
  2. Le numéro de la case où se trouve la prochaine instruction.
  3. 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 exemple LDA 15 ;
  • PC est 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.

        INP
        STA a
        INP
        ADD a
        OUT
        HLT
a:      DAT
  • a: DAT veut dire : cette case s'appelle a, et elle contient 0 au départ.
  • b: DAT 5 veut dire : cette case s'appelle b, et elle contient 5 au départ.
  • DAT n'est pas une instruction. On le met après le HLT, 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
  • c est 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.
  • c contient 11. Ce n'est pas ce qui est affiché : OUT affiche l'accumulateur.

4. Le simulateur

Maintenant, et seulement maintenant, la machine.

Installation

  1. Dans VSCode, ouvre les extensions (barre de gauche), cherche mmarchand.lmc-vscode, clique Installer.
  2. Crée un fichier qui finit par .lmc, par exemple essai.lmc.
  3. 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 son HLT.

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.
  • cpt contient 0 : c'est ce 0 qui fait sauter la ligne 7 vers fin.

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 HLT qui 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 un HLT avant.

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.
  • LDA et STA copient : 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.