Ordinapoche

lun. 14 septembre 2009

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 soit avec le système décimal, en opérant sur des nombres entiers positifs compris entre 0 et 999, soit avec le système hexadécimal, en opérant sur des nombres entiers positifs compris entre 0 et FFF. Sa mémoire ne comporte que 100 mots (d'adresse 00 à 99) en décimal ou 256 mots (d'adresse 00 à FF) en hexadécimal, pouvant accueillir des nombres ou des instructions dont le codage ne dépasse pas 3 chiffres décimaux ou 3 chiffres hexadécimaux.

Son implantation a donné lieu à une adaptation de l'idée originale et s'appuie sur la toolkit TclTk. Elle fonctionne normalement avec les environnements Windows, MacOS et Linux, à condition d'installer préalablement la version de TclTk appropriée (que l'on peut trouver sur le site www.tcl.tk, rubrique \"Get Tcl/Tk Now\". Le programme se nomme ordinapoche.tcl et nécessite la version 8.5 (et ultérieur) ainsi que le package Ttk (intégré dans la version 8.5).

Les instructions

L'ordinapoche connait 10 codes opération (ou instructions) en mode décimal.

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

A ces 10 instructions s'ajoutent les 5 instructions suivantes pour l'Ordinapoche en mode hexadécimal :

Code Assembleur Instruction Signification
A TMP TeMPorary mémorisation dans le registre TMP du contenu de la cellule mémoire
B LTH Less THan si (ACC < TMP) alors instruction suivante sinon CO=adresse fournie
C GTH Greater THan si (ACC > TMP) alors instruction suivante sinon CO=adresse fournie
D CAL CALl appel d'une sous-routine, commençant à l'adresse fournie et stockage de l'adresse de retour dans le registre ADR
E RET RETurn poursuite du programme à l'adresse contenue dans le registre ADR
F non définie

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 A70), initialise CO à 70 si ACC ≠ 0.

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

TMP : instruction initialisant le registre temporaire (TMP) de l'unité arithmétique et logique (UAL) à la valeur fournie en argument de cette instruction. Les étapes sont similaires à celles de l'instruction CLA. Exemple : TMP 53 (codée 853) initialise TMP au contenu de la cellule mémoire d'adresse 53.

LTH (resp. GTH) : comparaison du contenu du registre accumulateur (ACC) et du contenu du registre TMP. Si la valeur de ACC est inférieure (resp. supérieure) à TMP alors la valeur du compteur ordinal est augmentée de 1 comme d'habitude, sinon CO prend la valeur fournie avec l'instruction. Etapes : similaires à celles de l'instruction TAC. Exemple : LTH 80 (codée B80), initialise CO à 80 si ACC < TMP. Attention : le registre TMP doit être initialisé, par l'instruction TMP, avant le test !

CAL : instruction initialisant le registre de base des adresses (ADR) de l'unité de commande (UC) à la valeur d'adresse de l'instruction et qui poursuit l'exécution du programme à l'adresse associée à l'instruction. Exemple : 20 CAL 50 initialise ADR à la valeur (adresse) 20 puis effectue un saut inconditionnel à l'adresse 50. Attention : une instruction CAL ne peut pas être imbriquée dans une autre instruction CAL.

RET : instruction utilisant le contenu du registre de base des adresses (ADR) pour poursuivre l'exécution du programme à l'adresse mémorisée par ce registre, en initialisant pour ce faire le registre CO. Exemple : RET (codée E00).

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
10 050 lire A
11 051 lire B
12 250 initialiser l'accumulateur et additionner A
13 451 additionner B (S est maintenant dans l'accumulateur)
14 352 mémoriser S à l'adresse 52
15 152 afficher S
16 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.