---
tags: 1NSI, langage machine
---
# Langage machine
## Modèle et réalité
Un **modèle**, en sciences, est une représentation idéale et simplifiée de la réalité.
Ainsi, le **modèle de von Neumann** est une vision simple mais réaliste de ce qu'est un ordinateur "en vrai".
Nous allons dans cette activité utiliser VIC (["the visual computer"](https://faculty.runi.ac.il/vic/software/computer/)), un ordinateur "virtuel", lui aussi simplifié, mais utilisable.
Suivant le modèle de von Neumann, VIC comporte quatre parties :
1. une entrée (input)
2. une sortie (output)
3. un processeur (CPU)
4. une mémoire (memory)
La mémoire de VIC est une liste de cent nombres entiers naturels compris entre 0 et 999 (une case vide correspond à un 0).
Le processeur est ici partagé en trois parties :
1. un **registre d'instruction** qui contient l'instruction en cours d'exécution
2. un **registre de données** (data register) : car certaines instructions peuvent avoir besoin d'une donnée supplémentaire
3. un **compteur ordinal** (program counter) un registre qui indique l'adresse mémoire de la prochaine instruction à exécuter.
:::info
**À retenir**
Un **registre** est un emplacement de mémoire interne à un processeur. Les registres se situent au sommet de la hiérarchie mémoire : il s'agit de la mémoire la plus rapide d'un ordinateur, mais dont le coût de fabrication est le plus élevé.
La plupart des ordinateurs (comme VIC) travaillent en trois étapes :
1. chargement des données (y compris les instructions) depuis la mémoire vers le registres
1. calcul par le processeur à partir des données enregistrées dans les registres
2. écriture dans la mémoire ou les périphériques de sortie.
Ces trois étapes sont répétées autant de fois qu'il le faut, depuis le démarrage de l'ordinateur.
:::
Voici ci-dessous l'ordinateur virtuel VIC :
<iframe src="https://faculty.runi.ac.il/vic/software/computer/" width="800" height="600"></iframe>
## Langage machine
### Qu'est-ce que c'est ?
Python est un langage de programmation "de haut niveau" : il est fait pour être compréhensible par des humains.
Mais les ordinateurs utilisent un autre langage "à bas niveau", c'est-à-dire au niveau de la machine.
:::info
Un processeur ne peut exécuter qu'un assez petit nombre d'instructions différentes. L'ensemble de ces instructions et la façon de les coder constituent un **langage machine**. C'est le seul langage que comprend un processeur. Chaque marque de processeur possède un langage machine différent des autres marques.
Un langage machine est constitué uniquement de 0 et de 1, que les humains écrivent parfois en convertissant ces 0 et 1 en nombre entiers naturels en écriture décimale.
:::
### Le langage machine de VIC
L'ordinateur virtuel VIC possède son propre langage machine, très simple et limité. Voici la liste complète des instructions de VIC.
| Code | nom | Description |
| ---- | ----- | ------------------------------------------------------------------------------------ |
| 000 | STOP | Arrête l'exécution du programme |
| 1xx | ADD | Ajoute la valeur de la mémoire d'adresse xx au registre de données |
| 2xx | SUB | Soustrait la valeur de la mémoire d'adresse xx du registre de données |
| 3xx | LOAD | Charge la valeur de la mémoire d'adresse xx dans le registre de données |
| 4xx | STORE | Enregistre la valeur du registre de données dans la mémoire xx |
| 5xx | GOTO | Exécute l'instruction située à l'adresse xx de la mémoire |
| 6xx | GOTOZ | Comme GOTO, mais seulement si la valeur du registre de données est égale à zéro |
| 7xx | GOTOP | Comme GOTO, mais seulement si la valeur du registre de données est supérieure à zéro |
| 800 | READ | Lit la prochaine valeur d'entrée (Input) et l'affecte au registre de donnéess |
| 900 | WRITE | Écrit la valeur du registre de données dans la sortie (Output) |
### Comment exécuter un programme ?
Pour exécuter un programme dans VIC, il faut :
- d'abord taper une à une les instructions dans les cases de la mémoire, à partir de la case 0
- puis cliquer sur le bouton  pour démarrer le programme pas à pas ou  pour exécuter tout le programme.
Ensuite, VIC va exécuter l'instruction de la case 0, puis passer à la case suivante, et recommencer.
Le programme s'arrête dès qu'il rencontre une case mémoire égale à 0 (ou vide).
On suppose que toutes les cases mémoire vides contiennent la valeur 0. VIC exécute les instructions case par case : après exécution d'une case, il passe à la suivante (sauf pour les instructions 5xx, 6xx et 7xx).
### Quelques programmes
Étudiez les programmes suivants.
### Programme 1
```
304
105
900
0
30
12
```
### Programme 2
```
800
490
800
491
190
900
```
### Programme 3
```
800
490
800
491
290
709
390
900
000
391
900
000
```
### Programme 4
```
398
490
800
491
610
190
490
800
491
504
390
900
000
```
Imaginez des programmes très simples et programmez-les avec le langage machine de VIC. Écrivez-les sur votre cahier et testez-les.
En particulier, sauriez-vous programmer une boucle infinie ? Un "clignotant" (qui affiche en alternance 0 et 1 sans s'arrêter) ?
Aller plus loin ? Pourquoi pas créer un VIC en Python ? Il ne sera pas visuel mais en mode texte.