Aller au contenu

Travaux Pratiques - Simulation CPU

Afin de mettre en pratique ce que nous venons de voir, nous allons utiliser un simulateur développé par Peter L Higginson. Ce simulateur est basé sur une architecture de Von Neumann.

Ce simulateur, disponible à l'adresse http://www.peterhigginson.co.uk/AQA/, est composé d'une RAM et d'un CPU.

Attention

Il faut utiliser ce simulateur avec le navigateur chromium et pas avec Firefox.

Voici ce que vous devriez obtenir en vous rendant à l'adresse indiquée :

simulateur

  • A droite, on trouve la mémoire vive ("main memory").
  • Au centre, on trouve le microprocesseur.
  • A gauche on trouve la zone d'édition ("Assembly Language") : c'est dans cette zone que nous allons saisir nos programmes rédigés en assembleur.

Le CPU

Le CPU est placé dans la partie centrale du simulateur. Les trois blocs importants (en partant du haut) sont :

  • le bloc de registres ("Registers"). 13 registres (R0 à R12) sont disponibles, auquel s'ajoute le registre PC qui contient l'adresse mémoire de l'instruction en court d'exécution.
  • le bloc unité de commande ("Control Unit") qui contient l'instruction machine en cours d'exécution (au format hexadécimal).
  • le bloc unité arithmétique et logique ("Arithmetic and Logic Unit").

Nous ne nous intéresserons pas aux autres composants de la partie CPU.

Premier programme en assembleur

La partie de gauche permet de saisir des programmes en assembleur. Le langage d'assemblage du simulateur est le même que celui étudié dans les pages précédentes.

Mise en mémoire du programme

simulateur Dans la partie « éditeur » ("Assembly Language") saisissez les lignes de codes suivantes puis cliquez sur le bouton [Submit] :

MOV R0,#42
STR R0,150
HALT

Vous devriez voir apparaitre des nombres "étranges" dans les cellules mémoires d'adresses 000, 001 et 002 : simulateur

L'assembleur a converti les 3 lignes de notre programme en instructions machine :

  • la première instruction machine est stockée à l'adresse mémoire 000 (elle correspond à MOV R0,#42 en assembleur),
  • la deuxième instruction est stockée à l'adresse 001 (elle correspond à STR R0,150 en assembleur)
  • et la troisième à l'adresse 002 (elle correspond à HALT en assembleur).

Pour avoir une idée des véritables instructions machines, vous devez repasser à un affichage en binaire à l'aide du bouton et choisir « binary » dans le menu déroulant. L'affichage de la mémoire principale à l'écran devient : simulateur

  • l'instruction machine 11100011 10100000 00000000 00101010 correspond au code assembleur MOV R0,#42
  • l'instruction machine 11100101 10001111 00000010 01001100 correspond au code assembleur STR R0,150
  • l'instruction machine 11101111 00000000 00000000 00000000 correspond au code assembleur HALT

Exécution du programme

Pour exécuter le programme, il suffit maintenant de cliquer sur le bouton [RUN].
Vous allez voir le CPU « travailler » en direct grâce à de petites animations.

  • Si cela va trop vite (ou trop doucement), vous pouvez régler la vitesse de simulation à l'aide des boutons [<<] et [>>].
  • Un appui sur le bouton [STOP] met en pause la simulation. La simulation reprend là où elle s'était arrêtée si vous rappuyez une deuxième fois sur ce même bouton [STOP].
  • Un appui sur le bouton [Step] permet une lecture instruction par instruction.

Une fois la simulation terminée, vous pouvez constater que la cellule mémoire d'adresse 150 contient bien le nombre 42 (en base 10). Vous pouvez aussi constater que le registre R0 a bien stocké le nombre 42.

Attention

Pour relancer la simulation, il est nécessaire d'appuyer sur le bouton [RESET] afin de remettre à zéro les registres R0 à R12, ainsi que le registre PC (il faut que l'unité de commande pointe de nouveau sur l'instruction située à l'adresse mémoire 000).
La mémoire n'est pas modifiée par un appui sur le bouton [RESET]. Pour remettre la mémoire à 0, il faut cliquer sur le bouton [OPTIONS] et choisir [clr memory]. Si vous remettez votre mémoire à 0, il faudra alors cliquer sur le bouton [ASSEMBLE] avant de pouvoir exécuter de nouveau votre programme.

TPE06.11

Modifiez le programme précédent pour qu'à la fin de l'exécution on trouve le nombre 54 à l'adresse mémoire 50.
Pour cela, utilisez le registre R1 à la place du registre R0 puis tTestez vos modifications en exécutant la simulation.

Une solution

MOV R1,#54 STR R1,50 HALT

TPE06.12

Exécutez le programme de l'exercice E08.53 (les indentations ne seront pas interprétées, elles servent à donner plus de lisibilité au code) :

   MOV R0, #4
   STR R0,30
   MOV R0, #8
   STR R0,75
   LDR R0,30
   CMP R0, #10
   BNE else
   MOV R0, #9
   STR R0,75
   B endif
else:
   LDR R0,30
   ADD R0, R0, #1
   STR R0,30
endif:
   MOV R0, #6
   STR R0,23
   HALT