Ordinapoche

jeu. 07 février 2013

L'ordinapoche est un outil pédagogique, directement inspiré des travaux de De Rosnay, Hagelbarger et Fingerman (Science & Vie n° 763, 1985), pour comprendre l'architecture, l'organisation interne et le fonctionnement d'un ordinateur ainsi que les relations qui existent entre eux. Son architecture est volontairement simplifiée par rapport à la réalité, c'est un simulateur qui démonte les opérations de base.

Entre autre limitation, l'ordinapoche fonctionne dans le système décimal, en opérant sur des nombres entiers positifs compris entre 0 et 999. Sa mémoire ne comporte que 100 mots (d'adresse 00 à 99), pouvant accueillir des nombres ou des instructions dont le codage ne dépasse pas 3 chiffres décimaux.

Son implantation a donné lieu à une adaptation de l'idée originale et s'appuie sur la bibliothèque graphique libre Tkinter associée par défaut au langage Python. Elle fonctionne normalement avec les environnements Windows, MacOS et Linux, à condition d'installer préalablement la version de Python appropriée (que l'on peut trouver sur le site www.python.org. Le programme se nomme ordinapoche.cpython-32.pyc et nécessite la version 3.2 de Python.

Une version simplifiée, qui repose sur Brython, est également disponible en ligne : ordinapoche.

Les instructions

L'ordinapoche connait 10 codes opération (ou instructions).

Code Assembleur Instruction Signification
0 INP INPut entrée d'une donnée depuis un périphérique d'entrée
1 OUT OUTput affichage d'une donnée sur un périphérique de sortie
2 CLA CLear and Add mise à zéro du registre ACC et addition du contenu de la cellule mémoire
3 STO STOre stockage du contenu de l'ACC en mémoire centrale
4 ADD ADD addition du contenu de la cellule mémoire à l'ACC
5 SUB SUBstract soustraction du contenu de la cellule mémoire à l'ACC
6 SHT SHifT décalage à gauche (du 1er chiffre) puis à droite (du 2nd chiffre) du contenu de l'ACC
7 JMP JuMP branchement inconditionnel à l'adresse fournie
8 TAC Test Accumulator Content si (ACC = 0) alors instruction suivante sinon CO=adresse fournie
9 HRS Halt and ReSet fin du programme et remise à zéro des registres

Nous allons décrire, dans les paragraphes suivants, le rôle de ces instructions ainsi que leur principe de fonctionnement.

INP : instruction permettant la lecture d'une donnée (nécessairement numérique, d'une valeur comprise entre 0 et 999) à partir du périphérique d'entrée, ici le clavier. Pour se faire, les actions suivantes vont se succéder : 1) positionnement du bus d'adresse à l'adresse correspondant au périphérique d'entrée, 2) positionnement du bus d'adresse de la mémoire centrale à l'adresse associée à l'instruction, 3) lecture de la donnée et mémorisation à l'adresse associée à l'instruction. Exemple : INP 50 (codée 050) mémorise le nombre tapé au clavier à l'adresse 50.

OUT : instruction permettant l'affichage d'une donnée sur le périphérique de sortie qu'est l'écran. Les étapes sont les mêmes que pour l'instruction INP précédente à ceci prés que l'on adresse l'écran au lieu du clavier et que la donnée transite de la mémoire principale au périphérique de sortie. Exemple : OUT 51 (codée 151) affiche à l'écran la donnée mémorisée à l'adresse 51.

CLA : instruction initialisant le registre accumulateur (ACC) de l'unité arithmétique et logique (UAL) à la valeur fournie en argument de cette instruction. Etapes : 1) mise à zéro du registre ACC, 2) positionnement du bus d'adresse à l'adresse correspondant au registre ACC, 3) positionnement du bus d'adresse de la mémoire centrale à l'adresse associée à l'instruction, 4) lecture de la donnée et mémorisation dans le registre ACC. Exemple : CLA 52 (codée 252) initialise ACC au nombre contenu à l'adresse 52.

STO : instruction mémorisant, en mémoire centrale, le contenu du registre ACC à l'adresse fournie en argument de l'instruction. Les étapes sont similaires à celles de l'instruction CLA, sans initialisation du registre ACC bien entendu. Exemple : STO 53 (codée 353) stocke le contenu d'ACC à l'adresse 53.

ADD (resp. SUB) : instruction d'addition (resp. de soustraction) du contenu de la cellule mémoire dont l'adresse est fournie en argument au contenu du registre accumulateur de l'UAL. Les étapes sont similaires à celles de l'instruction CLA. Exemple : ADD 53 (codée 453) (resp. SUB 53) ajoute (resp. soustrait) le contenu de la cellule mémoire d'adresse 53 au registre accumulateur (ce qui correspond, si on suit l'ordre des exemples, à une multiplication pas deux dans le cas de l'addition).

SHT : instruction de décalage d'une unité vers la gauche puis vers la droite du nombre contenu dans le registre accumulateur, avec entrée de zéro à droite puis à gauche. Le but est d'obtenir très rapidement la multiplication et/ou la division par 10 (ou par 16 en hexadécimal) du nombre contenu dans l'ACC. Aucune étape particulière, si ce n'est la positionnement du bus d'adresse à l'adresse correspondant au registre ACC. Exemple : SHT 12 (codée 612) du nombre 12 donne comme résultat 002 soit 2.

JMP : saut inconditionnel (i.e sans condition) à l'adresse fournie en argument de l'instruction. Cette instruction initialise le compteur ordinal à cette adresse. Aucune étape particulière, si ce n'est l'initialisation de CO. Exemple : JMP 60 (codée 960) initialise CO à la valeur (adresse) 60.

TAC : comparaison du contenu du registre accumulateur (ACC) et du nombre 0. Si leur valeur sont égales, la valeur du compteur ordinal est augmentée de 1 comme d'habitude, si par contre elles diffèrent, le CO prend la valeur fournie avec l'instruction. Etapes : 1) positionnement du bus d'adresse à l'adresse correspondant au registre ACC, 2) comparaison entre ACC et 0 puis retour du résultat (un booléen) à l'unité de commande, 3) mise à jour du compteur ordinal (CO). Exemple : TAC 70 (codée 870), initialise CO à 70 si ACC ≠ 0.

HRS : instruction de fin de programme. Aucune étape particulière.

Exemple

L'exemple ci-dessous est un premier programme très simple qui permet d'additionner le nombre A au nombre B pour obtenir la somme S. Il ne cherche pas à vous impressionner sur la puissance supposée d'un ordinateur mais à vous familiariser avec son fonctionnement.

Adresse Contenu Commentaires
00 050 lire A (d'adresse 50)
01 051 lire B (d'adresse 51)
02 250 initialiser l'accumulateur et additionner A
03 451 additionner B (S est maintenant dans l'accumulateur)
04 352 mémoriser S à l'adresse 52
05 152 afficher S
06 900 arrêter et remettre à l'état initial

Cet exemple peut vous sembler plutôt long et fastidieux pour faire quoi ? Une addition aussi simple que A + B, mais ce faisant, vous avez pénétré la méthode de travail d'un ordinateur, une méthode qui découpe le travail en tranche sans rien laisser au hasard. L'ordinateur effectue ce calcul des millions de fois plus vite que nous, en quelques nanosecondes, et une fois ce programme mis en mémoire, l'ordinateur est alors capable de faire n'importe quelle addition.