M1105 – TD1 – Architecture d’un ordinateur.
Éric Würbel
Table des matières
1 Objectifs 1
2 Architecture générale 1
3 La mémoire centrale 2
4 Le processeur 2
5 Les instructions du processeur LMC 3
6 Instructions simples 3
7 Instructions de branchement 8
8 Correction des exercices 15
1 Objectifs
La séance d’aujourd’hui aura pour but de comprendre le fonctionnement d’un ordinateur fictif à vocation pédagogique : Little Man Computer (LMC). L’objectif est de vous faire comprendre la façon dont fonctionne un ordinateur utilisant l’architecture de Von Neumann (c’est à dire l’architecture de tous les ordinateurs actuels).
Le but n’est pas de faire de vous des spécialistes de la couche matérielle, mais bien de com- prendre suffisamment le fonctionnement de ce matériel de façon à prendre conscience de ce qu’un système d’exploitation doit prendre en charge.
2 Architecture générale
Bus
Processeur Mémoire vive
Périphérique d’entrée
Périphérique de sortie
FIGURE 1 – Little Man Computer : un modèle simplifié d’ordinateur avec architecture de Von Neumann
On retrouve les éléments vus en cours :
— Leprocesseur: chargé d’exécuter des instructions trouvées en mémoire. Ces instructions manipuleront des données situées elles aussi en mémoire, et écriront éventuellement des résultats en mémoire.
— La mémoire vive : est une mémoire réinscriptible, qui perd son contenu à l’extinction de l’ordinateur.
— Périphérique d’entrée : permet d’acquérir des données du monde extérieur. Ici on pourra considérer qu’il s’agit d’un clavier.
— Périphérique de sortie : permet d’envoyer des résultats au monde extérieur. Ici on pourra considérer qu’il s’agit d’un écran.
3 La mémoire centrale
La mémoire de LMC est très simple : elle est constituée de 100 cases consécutives, numérotées de 0 à 99. Chaque case peut contenir un nombre entier de 3 chiffres, (de 000 à 999 donc). La figure 2 représente la mémoire et un exemple de contenu.
adresse contenu
00 599
02 030
03 000
04 001
05 010
06 551
. . . .
99 000
FIGURE2 – La mémoire de la machine LMC
La mémoire contiendra aussi bien des données que des programmes. Il faudra donc faire attention à ne pas tout mélanger.
4 Le processeur
Le processeur est constitué de :
— un registre appeléaccumulateur(Acc), pouvant contenir un nombre entier à trois chiffres ;
— Deux registres pour la manipulation des instructions :
— un registre appelécompteur ordinal(PC : program counter), qu’il est possible de re- mettre à zéro. Ce registre contient l’adresse de la prochaine instruction que va exécuter LMC. Ce registre est normalementincrémentéde 1 après chaque instruction exécutée.
Ainsi, l’exécution des instructions estséquentielle. Nous verrons qu’il existe des instruc- tions permettant de forcer la valeur du compteur ordinal, et ainsi d’indiquer où continuer l’exécution, appelées instructions de branchement. Ce branchement peut être forcé (branchement inconditionnel) ou soumis à une condition (branchement conditionnel) ;
— unregistre d’instruction(IR : instruction register) contenant une instruction à exécuter
— un registre d’état (nous y reviendrons plus tard). Le processeur s’en sert pour indiquer que l’exécution d’une instruction a généré une situation anormale ;
— uneUnité Arithmétique et Logique(UAL) capable d’effectuer des additions et des soustrac- tions.
— UneUnité de Commandechargée de coordonner les opérations dans le processeur comme nous l’avons vu en cours. Dans les fait, l’unité de commande, ce sera nous !
L’exécution d’un programme commence toujours à l’adresse 0.
L’exécution d’un programme est décrite par lecycle d’exécution(voir le cours). Celui-ci est défini de la façon suivante.
Définition 4.1 — Cycle d’exécution de la machine LMC. Le cycle d’exécution effectué par l’unité de commande est toujours le même, et consiste à répéter idéfiniment (ou jusqu’à l’arrêt de LMC) :
1. Lire le registre PC, aller à l’adresse mémoire correspondante, récupérer l’instruction et la mettre dans IR (Fetch).
2. Incrémenter le registre PCa. 3. décoder l’instruction 4. exécuter l’instruction
a. Incrémenter signifieajouter 1
Ce cycle d’exécution, bien que légèrement plus simple que le cycle d’exécution d’un vrai processeur, en est malgré tout proche. Tous les éléments principaux sont présents. Ce dont il faut bien se rendre compte, c’est qu’en réalité tout cela va très vite. L’horloge d’un microprocesseur actuel utilise une fréquence d’environ 2GHz. Autrement dit, elle génère 2 milliards d’impulsions par seconde. On peut raisonnablement dire qu’en moyenne, un cycle d’exécution prend environ 10 cycles d’horloge. Ce qui revient à dire que le processeur est capable d’exécuter 200 millions
d’instructions par seconde !
5 Les instructions du processeur LMC
Une instruction est un nombre compris entre 000 et 999. Autrement dit, une instruction peut être stockée dans un emplacement mémoire.
Chaque instruction est composée de deux parties :
— le chiffre de gauche indique l’opération à efffectuer
— Les deux autres chiffres indiquent l’opérande sur laquelle agir, quand cela a un sens. Si l’opération ne nécessite pas d’opérande, celle-ci vaudra 00.
Le tableau 1 décrit toutes les instructions du processeur de LMC. Ne vous préoccupez pas pour l’instant de la colonnecode mnémonique, nous y reviendrons plus tard.
6 Instructions simples
Exemple 6.1 — addition simple. Voici un exemple de programme qui additionne deux valeurs situées à l’adresse 4 et 5 de la mémoire, et range le résultat à l’adresse 6 :
Adresse Contenu Opération Commentaires
00 504 MÉMOIRE[4]→Acc Charge la valeur située à l’adresse 4 dans l’ac- cumulateur
01 105 Acc = Acc + MÉMOIRE[5] Ajoute le nombre situé à l’adresse 5 à la va- leur de l’accumulateur. Ranger le résultat dans l’accumulateur
02 306 Acc→MÉMOIRE[6] Range la valeur actuelle de Acc à l’adresse 6
03 000 Arrête le fonctionnement
04 030 Première valeur à aditionner
05 100 Deuxième valeur à aditionner
06 000 Emplacement de stockage du résultat. Sa va-
leur avant exécution importe peu
L’état du système avant l’exécution du programme peut se représenter de la façon suivante :
TABLE1 – Little Man Computer : jeu d’instructions du processeur
Code Code Instruction Description
Numérique Mnémonique
1xx ADD ADD Ajoute la valeur présente à l’adressexx de la mé-
moire à la valeur actuellement dans l’accumulateur.
Le résultat se trouvera dans l’accumulateur. Si la somme est supérieure à 999, la valeur de l’accumula- teur n’est pas modifiée.
2xx SUB SUBSTRACT Soustrait la valeur présente à l’adressexxde la mé- moire à la valeur actuellement présente dans l’accu- mulateur. Le résultat se trouvera dans l’accumulateur.
Si le résultat est négatif, la valeur de l’accumulateur n’est pas modifiée, et un drapeau NEG est armé dans le registre d’état.
3xx STA STORE Enregistre le contenu de l’accumulateur à l’adresse
xxde la mémoire (opération destructive). Le contenu de l’accumulateur n’est pas modifié.
5xx LDA LOAD Charge la valeur présente à l’adressexxdans l’accu-
mulateur. La valeur à l’adressexxn’est pas modifiée, mais le contenu de l’accumulateur est écrasé.
6xx BRA BRANCH Branchement inconditionnel. Fixe le compteur or-
dinal PC à l’adresse xxdonnée. L’exécution de la prochaine instruction se fera donc à cet emplacement.
7xx BRZ BRANCH IF ZERO Branchement conditionnel. Si laccumulateur contient la valeur 000, fixe le compteur ordinal PC à la valeur xx. Ne fait rien autrement.
8xx BRP BRANCH IF POSITIVE Branchement conditionnel. Si le drapeau NEGn’est pas armé dans le registre d’état, fixe le compteur ordinal PC à la valeur xx. Autrement, désarme le drapeau NEG et ne fait rien d’autre.
901 INP INPUT Lit le port d’entrée, récupère la valeur et la stocke dans l’accumulateur.
902 OUT OUTPUT Copie la valeur de l’accumulateur sur le port de sor- tie.
000 HLT/COB HALT/COFFEE BREAK Arrête le fonctionnement.
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 000 000 IR
Acc 000
On lance maintenant l’exécution du programme. On suit donc le cycle d’exécution décrit dans la définition 4.1. Le registre PC contient l’adresse de la prochaine instruction à exécuter. On charge donc cette instruction dans le registre IR :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 000 504 IR
Acc 000
On incrémente de 1 le compteur ordinal PC :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 001 504 IR
Acc 000
L’instruction est ensuite décodée : Le chiffre le plus à gauche (5) indique qu’il s’agit d’une instruction servant à charger le registre accumulateur Acc avec la valeur contenue à une certaine adresse mémoire. L’adresse est donnée par les deux derniers chiffres (ici 04).
Une fois décodée, l’instruction est exécutée :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 001 504 IR
Acc 030
On commence un nouveau cycle. Le registre PC contient l’adresse de la prochaine instruction à exécuter. On charge donc cette instruction dans IR :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 001
IR 105
Acc 030
On incrémente de 1 le compteur ordinal PC :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 002 105 IR
Acc 30
L’instruction est ensuite décodée : Le chiffre le plus à gauche (1) indique qu’il s’agit d’une instruction servant à additionner au contenu du registre accumulateur Acc la valeur contenue à une certaine adresse mémoire. L’adresse est donnée par les deux derniers chiffres (ici 05).
Une fois décodée, l’instruction est exécutée :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 002
IR 105
Acc
130 (30+100)
On commence un nouveau cycle. Le registre PC contient l’adresse de la prochaine instruction à exécuter. On charge donc cette instruction dans IR :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 002 306 IR
Acc 130
On incrémente de 1 le compteur ordinal PC :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 003 306 IR
Acc 130
L’instruction est ensuite décodée : Le chiffre le plus à gauche (3) indique qu’il s’agit d’une instruction servant à stocker le contenu du registre accumulateur Acc à une certaine adresse mémoire.
L’adresse est donnée par les deux derniers chiffres (ici 06).
Une fois décodée, l’instruction est exécutée :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 130
PC 003 306 IR
Acc 130
Nouveau cycle : le registre PC contient l’adresse de la prochaine instruction à exécuter. On charge donc cette instruction dans IR :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 003
IR 000
Acc 130
On incrémente de 1 le compteur ordinal PC :
Mémoire
00 504 01 105 02 306 03 000 04 030 05 100 06 000
PC 004 000 IR
Acc 130
Le décodage de l’instruction 000 indique que la machine doit s’arrêter.
Le programme termine donc son exécution, et le résultat du programme se trouve à l’adresse 06 de la mémoire.
En résumé, ce programme sert à additionner le nombre se situant à l’adresse 04 au nombre se situant à l’adresse 05 et à ranger le résultat à l’adresse 06.
Exercice 6.1 Écrire un programme pour la machine LMC qui :
— lit deux nombres sur le périphérique d’entrée,
— soustrait le second nombre au premier,
— envoie le résultat sur le port de sortie.
Quelques remarques sur cet exercice :
— Les tâches décrites dans la liste ci-dessus sont indépendantes. Traitez-les spéramément, cela vous évitera de vous embrouiller.
— Pour lire un nombre sur le périphérique d’entrée (imaginez que c’est un clavier), consultez l’instruction 901 dans la table 1.
— Pensez que vous allez probablement devoir stocker temporairement les nombres lus sur sur le périphérique d’entrée dans la mémoire centrale. Cela implique que vous réserviez des cases mémoire à cet usage.
7 Instructions de branchement
Dans l’exemple et l’exercice précédent, l’exécution du programme se faiten séquence. On commence l’exécution à l’adresse zéro, puis on exécute l’instruction à l’adresse 1, puis à l’adresse 2, etc. On s’arrête lorsqu’on rencontre une instruction d’arrêt (000).
Rapidement on va se retrouver limités. Par exemple, il est impossible avec ces seules instructions de prendre une décision sur ce que doit faire le programme en fonction d’une certaine condition.
Pour cela, il faudrait pouvoirbriser la séquence, autrement dit indiquer au processeur que lors du cycle suivant il doit poursuivre son exécution à une adresse particulière de la mémoire que ne soit pas la suivante. C’est ce qu’on appelle un branchement.
Exemple 7.1 — Branchement inconditionnel. Un branchement inconditionnel permet de dérouter l’exécution d’un programme quoi qu’ils se passe. On le réalise à l’aide de l’instruction BRANCH (6xx). Voici un petit exemple (qui ne fait rien de spécial).
Adresse Contenu Assembleur Commentaires 00 604 BRA 03 saute à l’adresse 04
01 510 LDA 10 Copie la valeur située à l’adresse 10 dans le registre accumulateur
02 902 OUT Envoie le contenu de l’accumulateur sur le port de sortie (affiche la valeur 1)
03 000 HLT Arrête le fonctionnement
04 511 LDA 11 Copie la valeur située à l’adresse 11 dans le registre accumulateur
05 902 OUT Envoie le contenu de l’accumulateur sur le port de sortie (affiche la valeur 0)
06 000 HLT Arrête le fonctionnement
10 001
11 002
Notez au passage l’utilisation de la notation mnémonique pour ce programme. Pour nous autres humains c’est plus simple à lire, mais évidemment le processeur lui ne comprend que les nombres de la colonne « Contenu ». Cette notation symbolique s’appellelangage d’assemblage, ou assembleur.
La question est ici : qu’est-ce qui est envoyé sur le périphérique de sortie ? 1 ou 2 ? Simulons l’exécution de ce programme. L’état initial de la mémoire est le suivant.
Mémoire
00 604 01 510 02 902 03 000 04 511 05 902 06 000 ... ... 10 001 11 002
PC 000 000 IR
Acc 000
IN (port d’entrée) OUT (port de sortie)
On commence à exécuter. Le registre PC indique l’adresse de l’instruction à exécuter. On copie cette instruction dans IR, pyuis on incrémente le registre PC.
Mémoire
00 604 01 510 02 902 03 000 04 511 05 902 06 000 ... ... 10 001 11 002
PC 001 604 IR
Acc 000
IN (port d’entrée) OUT (port de sortie)
On décode ensuite l’instruction. C’est une instruction de type 6xx. Son effet est d’écrirela valeurxxdans le registrePC.
Mémoire
00 604 01 510 02 902 03 000 04 511 05 902 06 000 ... ... 10 001 11 002
PC 004
604 IR Acc 000
IN (port d’entrée) OUT (port de sortie)
Lors du cycle suivant on va donc charger dans le registre IR l’instruction se trouvant à l’adresse indiquée par PC, c’est à dire l’adresse 04 ! On incrémente ensuite PC (déroulement normal du cyle).
Mémoire
00 604 01 510 02 902 03 000 04 511 05 902 06 000 ... ... 10 001 11 002
PC 005
IR 511
Acc 000
IN (port d’entrée) OUT (port de sortie)
On décode l’instruction se trovuant dans IR : 511 signifie qu’on va copier dans le registre accumulateur la valeur contenue à l’adresse 11. Après exécution on a :
Mémoire
00 604 01 510 02 902 03 000 04 511 05 902 06 000 ... ... 10 001 11 002
PC 005
IR 511
Acc 002
IN (port d’entrée) OUT (port de sortie)
La suite de l’exécution se déroule normalement en séquence, et donc c’est bien la valeur 2 qui va être affichée.
Remarquez que les instructions situées aux adresses 01, 02 et 03ne seront jamais exécutées.
Avant d’aborder le branchement conditionnel (c’est-à-dire dépendant d’une certaine condition), revenons sur le registre d’état S. Celui de notre processeur est très simple : il contient un drapeau, c’est-à-dire une valeur particulière, noté NEG, signalant qu’une soustraction a fourni une valeur négative. Si le déroulement du programme ne rencontre pas cette situation, alors le drapeau n’est pas présent dans le registre d’état.
Je vous rappelle (voir la table 1) que l’instruction de soustraction, lorsqu’elle produit un résultat négatif, a deux effets :
1. Elle ne modifie pas la valeur de l’accumulateur ; 2. Elle arme le drapeau NEG dans le registre d’état S.
L’instruction BRP (8xx) va écrire la valeur xx dans PCuniquement si le grapeau NEG n’est pas armé dans le registre d’état. Voici un petit exemple.
Exemple 7.2 — Branchement conditionnel. Voici un petit programme utilisant le branche- ment conditionnel.
Adresse Contenu Mnémonique Commentaires
00 511 LDA 11 Copie la valeur située à l’adresse 11 dans le registre accumulateur
01 210 SUB 10 Soustrait la valeur située à l’adresse 10 à Acc et range le résultat dans Acc
02 806 BRP 06 copie 06 dans PC si le drapeau NEGn’est pas armé
03 510 LDA 10
04 902 OUT
05 000 HLT
06 511 LDA 11
07 902 OUT
08 000 HLT
10 001
11 002
Question : qu’est-ce qui est envoyé sur le périphérique de sortie ? 1 ou 2 ? Simulons l’exécution.
L’état initial de la machine est
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 000 000 IR
Acc 000
S
IN (port d’entrée) OUT (port de sortie)
On commence à exécuter. Le registre PC indique l’adresse de l’instruction à exécuter. On copie cette instruction dans IR, puis on incrémente le registre PC.
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 001 511 IR
Acc 000
S
IN (port d’entrée) OUT (port de sortie)
Décodage : l’instruction 511 copie la valeur située à l’adresse 11 dans ACC. On exécute :
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 001
IR 511
Acc 002
S
IN (port d’entrée) OUT (port de sortie)
Nouveau cycle : copie l’instruction située à l’adresse 1 dans IR, puis on incrémente PC :
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 002 210 IR
Acc 002
S
IN (port d’entrée) OUT (port de sortie)
Décodage : l’instruction 210 soustrait la valeur située à l’adresse 10 au contenu de Acc.
Elle range le résultat dans ACC si tout se passe bien. Si l’opération produit un nombre négatif, l’accumulateru est inchangé, et le drapeau NEG est armé dans le registre d’état S. On exécute :
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 002 210 IR
Acc 001
S
IN (port d’entrée) OUT (port de sortie)
2−1=1
Tout s’est bien déroulé (car 2−1=1). Donc le drapeau NEG n’est pas armé.
On commence un nouveau cycle : chargement dans IR de l’instruction désignée par PC, puis incrémentation de PC :
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 003 806 IR
Acc 001
S
IN (port d’entrée) OUT (port de sortie)
Décodage : 806 est une instruction debranchement conditionnel: si le drapeau NEGn’est pas armédans le registre S, copier la valeur xx dans le registre PC.
Exécution : ici le drapeau NEG n’est pas armé, donc on effectue la copie.
Mémoire
00 511 01 210 02 806 03 510 04 902 05 000 06 511 07 902 08 000 ... ... 10 001 11 002
PC 006
806 IR Acc 001
S
IN (port d’entrée) OUT (port de sortie)
Le nouveau cycle d’exécution va donc commencer à l’adresse 06. Vous avez maintenant suffisam- ment de connaissance de la machine LMC pour voir que c’est la valeur 2 qui va être envoyée sur le
périphérique de sortie.
Exercice 7.1 Écrire un programme pour la machine LMC qui :
— lit deux nombres sur le périphérique d’entrée,
— envoie la valeur 1 sur le port de sortie si le premier nombre est supérieur ou égal au second.
Dans le cas contraire il renverra zéro.
Y Observez la façon dont vous êtes amené à gérer la mémoire : une partie pour le programme, une partie pour les données (on ne doit pas mélanger les deux). C’est une des tâches fondamentales du système d’exploitation.
Exercice 7.2 Pour illustrer la remarque précédente, analysez l’exécution du programme suivant.
Que se passe-t-il ?
Dans la colonne en assembleur, on voit apparaitre une instruction nouvelle, qui n’en est pas une :DATA. Ce n’est pas une instruction du processeur, mais unedirectived’assemblage permettant de définir le contenu de l’adresse mémoire à laquelle elle se trouve.
Adresse Contenu Assembleur 00 504 LDA 04 01 105 ADD 05 02 303 STA 03
03 000 HLT
04 400 DATA 400 05 200 DATA 200
8 Correction des exercices
Solution de l’exercice 6.1 Voici une solution possible pour cet exercice : adresse contenu mnémonique commentaire
00 901 INP Lecture d’un nombre sur le port d’entrée 01 399 STA 99 Écrit le nombre lu à l’adresse 99
02 901 INP Lecture d’un nombre sur le port d’entrée 03 398 STA 98 Écrit le nombre lu à l’adresse 98
04 599 LDA 99 Charge la valeur située à l’adresse 99 dans Acc 05 298 SUB 98 Acc - valeur à l’adresse 98
06 902 OUT Affichage
07 000 HLT Arrêt
Quelques remarques sur ce programme :
— Remarquez la colonne contenant la notation mnémonique. Pour nous autres humains c’est plus simple à lire, mais évidemment le processeur lui ne comprend que les nombres de la colonne « contenu ». Cette notation symbolique s’appellelangage d’assemblage, ou assembleur.
— Prêtez attention à l’organisation de la mémoire : les adresses de 0 à 8 contiennent les instructions du programme. Les adresses 98 et 99 contiennent lesdonnées manipulées par le programme. On aurait pu choisir de stocker ces données aux adresses 8 et 9, qui sont libres. Toutefois, cela réclame de connaître à l’avance la taille du programme. En commençant à stocker à partir de la « fin » de la mémoire, on est à peu près certains, vu la simplicité du programme à écrire, qu’on utilisera pas ces adresses pour le programme.
Traçons l’exécution du programme : État initial de la machine
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000
PC 000 000 IR
Acc 000
Port d’entrée
—
Port de sortie
—
On lance maintenant l’exécution du programme. Le registre PC contient l’adresse de la prochaine instruction à exécuter. On charge donc cette instruction dans IR, et on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000
PC 001 901 IR
Acc 000
Port d’entrée
—
Port de sortie
—
On décode l’instruction : l’instruction 901 (INP) lit un nombre sur le port d’entrée (le périphérique d’entrée). Supposons que le nombre 45 soit disponible sur ce périphérique (un utilisateur a tapé 45 au clavier). Cette valeur va être placée dans Acc. Après exécution on a :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000
PC 001
IR 901
Acc 045
Port d’entrée 045
Port de sortie
—
On continue : chargement dans IR de l’instruction située à l’adresse désignée par PC, puis incrémentation de PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000
PC 002 399 IR
Acc 045
Port d’entrée 045
Port de sortie
—
Décodage de l’instruction dans IR : il s’agit d’une instruction de stockage (3xx,STA) de la valeur de Acc à une adresse mémoire, ici 99. On exécute :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 000 99 045
PC 004
IR 398
Acc 045
Port d’entrée 045
Port de sortie
—
On charge l’instruction située à l’adresse indiquée par PC, puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 000 99 045
PC 003
IR 901
Acc 045
Port d’entrée 045
Port de sortie
—
On décode l’instruction : l’instruction 901 (INP) lit un nombre sur le port d’entrée (le périphérique d’entrée). Supposons que le nombre 5 soit disponible sur ce périphérique (un utilisateur a tapé 5 au clavier). Cette valeur va être placée dans Acc. Après exécution on a :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 000 99 045
PC 003
IR 901
Acc 005
Port d’entrée 005
Port de sortie
—
On charge l’instruction située à l’adresse indiquée par PC, puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 000 99 045
PC 004
IR 398
Acc 005
Port d’entrée 005
Port de sortie
—
Décodage de l’instruction dans IR : il s’agit d’une instruction de stockage (3xx,STA) de la valeur de Acc à une adresse mémoire, ici 98. On exécute :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 005 99 045
PC 004 398 IR
Acc 005
Port d’entrée 005
Port de sortie
—
On charge l’instruction située à l’adresse indiquée par PC (004), puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 005 99 045
PC 005 599 IR
Acc 005
Port d’entrée 005
Port de sortie
—
Décodage de l’instruction dans IR : il s’agit d’une instruction de chargement (5xx,LDA) de la valeur contenue à une adresse mémoire — ici 99 — dans Acc. On exécute :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 005 99 045
PC 005 599 IR
Acc 045
Port d’entrée 005
Port de sortie
—
On charge l’instruction située à l’adresse indiquée par PC (005), puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 005 99 045
PC 006 298 IR
Acc 045
Port d’entrée 005
Port de sortie
—
Décodage de l’instruction dans IR : il s’agit d’une instruction de soustraction (2xx,SUB) de la valeur contenue à une adresse mémoire — ici 98 — à la valeur présente dans Acc. Le résultat est placé dans Acc. On exécute :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 902 07 000 ... ... 98 005 99 045
PC 006 298 IR
Acc 040
Port d’entrée 005
Port de sortie
— (45−5)
Solution de l’exercice 7.1 Voici une solution possible pour cet exercice : adresse contenu mnémonique commentaire
00 901 INP Lecture d’un nombre sur le port d’entrée 01 399 STA 99 Écrit le nombre lu à l’adresse 99
02 901 INP Lecture d’un nombre sur le port d’entrée 03 398 STA 98 Écrit le nombre lu à l’adresse 98
04 599 LDA 99 Copie la valeur située à l’adresse 99 dans Acc 05 298 SUB 98 Acc - valeur à l’adresse 98
06 810 BRP 10 Si le drapeau NEG n’esp pas armé, copier 10 dans PC 07 596 LDA 96 Copie la valeur située à l’adresse 96 (0) dans Acc 08 902 OUT Envoie la valeur dans Acc sur le périphérique de sortie 09 612 BRA 12 copie yy dans PC (pour aller à la fin du programme) 10 597 LDA 97 Copie la valeur située à l’adresse 97 (1) dans Acc 11 902 OUT Envoie la valeur dans Acc sur le périphérique de sortie
12 000 HLT Arrêt
. . .
96 000 valeur 0 (pour l’affichage)
97 001 valeur 1 (pour l’affichage)
98 000 stockage du premier nombre
99 000 stockage du deuxième nombre
Avant de simuler l’exécution du programme, remarquons que les adresses 00 à 05 sont identiques à celles de l’exercice 6.1 :
— Les instructions aux adresses 00 et 01 récupèrent un premier nombre sur le port d’entrée et le rangent à l’adresse 99.
— Les instructions aux adresses 02 et 03 récupèrent un second nombre sur le port d’entrée et le rangent à l’adresse 98.
— L’instruction à l’adresse 04 charge dans l’accumulateur le premier nombre
— L’instruction à l’adresse 05 réalise la soustraction premier nombre−deuxième nombre.
C’est précisément cette soustraction qui nous intéresse, puisque :
— si le premier nombre est supéreur ou égal au second, le résultat de la soustraction sera positif, et le drapeau NEG ne sera pas armé dans le registre S.
— si le premier nombre est inférieur au second, le résultat de la soustraction sera négatif, et le drapeau NEG sera armé dans le registre S.
Traçons l’exécution du programme. Nous allons partir de la situation où l’instruction à l’adresse 5 a été exécutée, en supposant que les nombres lus sur le port d’entrée étaient 45 pour le premier, et 5 pour le second (soit le même exemple que dans la correction précédente).
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 006 298 IR
Acc 040
S
IN (port d’entrée) OUT (port de sortie)
Quelques remarques sur cet état avant de poursuivre :
— Le registre PC contient 006 : on est prêt à exécuter l’instruction à l’adresse 6.
— Le registre IR contient 298 : c’est l’instruction qui vient juste d’être exécutée (la soustrac- tion).
— Le registre Acc contient 040 : c’est le résultat de la soustraction 40−45 qui vient d’être exécutée.
— Le registre d’état S est vide puisque la soustraction a produit un résultat positif.
On entame un nouveau cycle d’exécution : On copie donc dans IR la valeur située à l’adresse indiquée par PC, puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 007 810 IR
Acc 040
S
IN (port d’entrée) OUT (port de sortie)
Décodage : 810 (BRP 10)signifie que si le registre d’étatne contient pasle drapeau NEG, alors on copie la valeur 10 dans PC.
Exécution : dans notre cas, on constate que le drapeau NEG n’est pas présent dans le registre d’état S, donc on copie la valeur 10 dans PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 010
810 IR Acc 040
S
IN (port d’entrée) OUT (port de sortie)
Cycle suivant : On copie dans IR la valeur présente à l’adresse indiquée par PC (10), plus on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 011 597 IR
Acc 040
S
IN (port d’entrée) OUT (port de sortie)
Décodage : 597 (LDA 97) : copier la valeur présente à l’adresse 97 dans l’accumulateur.
Exécution :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 011
IR 597
Acc 001
S
IN (port d’entrée) OUT (port de sortie)
Cycle suivant : charger dans IR l’instruction située à l’adresse désignée par PC, puis incrémenter PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 012 902 IR
Acc 001
S
IN (port d’entrée) OUT (port de sortie)
Décodage : 902 (OUT) : copier la valeur présente dans Acc sur le périphérique de sortie.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 005 99 045
PC 012 902 IR
Acc 001
S
IN (port d’entrée) OUT (port de sortie) 001
L’instruction suivante arrêtera le programme. Le comportement attendu du programme s’est donc réalisé : étant donné que 45≥5 on a affiché 1.
Considérons maintenant le cas où le premier nombre est inférieur au second. Par exemple, imaginons que le premier nombre lu sur le périphérique d’entrée est 10 et le deuxième 30.
Supposons qu’on démarre la simulation après l’exécution de l’instruction située à l’adresse 05 (la soustraction). L’état de la machine est alors le suivant :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 006 298 IR
Acc 010
S NEG
IN (port d’entrée) OUT (port de sortie)
Quelques remarques avant d’entamer l’exécution :
— Le registre PC contient 006 : on est prêt à exécuter l’instruction à l’adresse 6.
— Le registre IR contient 298 : c’est l’instruction qui vient juste d’être exécutée (la soustrac- tion).
— Le registre Acc contient 010 : en effet, la soustraction 10−30 a donné un résultat négatif, donc Acc a été laissé tel qu’il était.
— Le registre d’état S contient le drapeau NEG car la soustraction a produit un résultat négatif.
Un nouveau cycle commence : on copie dans IR l’instruction située à l’adresse désignée par PC, puis on incrémente PC :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 007 810 IR
Acc 010
S NEG
IN (port d’entrée) OUT (port de sortie)
Décodage : 810 (BRP 10) : si le registre d’état S ne contient pas le drapeau NEG, copier la valeur 10 dans le registre PC.
Exécution : ici, le registre d’état NEG contient le drapeau NEG, donc on ne fait rien et on continue.
Un nouveau cycle commence donc : on copie dans IR l’instruction située à l’adresse désignée par PC, puis on incrémente PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 008 596 IR
Acc 010
S NEG
IN (port d’entrée) OUT (port de sortie)
Décodage : 596 (LDA 96) : copier dans l’accumulateur la valeur présente à l’adresse 96 (ici 000).
Exécution :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 008 596 IR
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie)
Cycle suivant : on copie dans IR l’instruction située à l’adresse désignée par PC, puis on incrémente PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 009 902 IR
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie)
Décodage : 902 (OUT) : copier la valeur contenue dans l’accumulateur sur le périphérique de sortie.
Exécution :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 009 902 IR
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie) 000
Cycle suivant : on copie dans IR l’instruction située à l’adresse désignée par PC, puis on incrémente PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 010 612 IR
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie) 000
Décodage : 612 (BRA 12) : copier la valeur 12 dans le registre PC.
Exécution :
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 012
IR 612
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie) 000
Cycle suivant : on copie dans IR l’instruction située à l’adresse désignée par PC, puis on incrémente PC.
Mémoire
00 901 01 399 02 901 03 398 04 599 05 298 06 810 07 596 08 902 09 612 10 597 11 902 12 000 ... ... 96 000 97 001 98 030 99 010
PC 013 000 IR
Acc 000
S NEG
IN (port d’entrée) OUT (port de sortie) 000
Décodage et exécution : arrêt du programme.
Le programme s’est donc bien comporté conformément à nos attentes : 10<30, le pro- gramme a donc envoyé la valeur 0 sur le périphérique de sortie.
Notez qu’à l’adresse 9, au lieu de réaliser un branchement inconditionnel vers l’adresse 12, on aurait aussi pu directement placer une instructionHLT(000). Cependant, et on en reparlera en programmation, il est toujours préférable d’avoir un unique point de fin dans un programme.