3. Étape 3 : Un automate avec accumulateur et indirection

3.1 Indirection

Imaginez qu’on souhaite séparer le code des données, pour :

  • faire tourner un même code sur des données différentes (sans le dupliquer pour chaque set de donnée...)
  • faire tourner différents codes sur des mêmes données (sans dupliquer les sets de données...)
  • faire tourner un code sur des données qui ne sont pas connues avant l’exécution du programme (du genre, le début du programme demande à l’utilisateur d’entrer des valeurs...)

Pour le moment, notre processeur ne sait pas faire : on doit connaître les données au moment du pré-chargement de la RAM avec le code...

Il faudrait disposer d’instructions de manipulation du contenu de la RAM à des endroits arbitraires (on ne modifierait que des données, hein, pas le code...) Cela permettrait d’aller modifier les zones où se trouvent les opérandes. Mais c’est peut-être un peu compliqué d’avoir à modifier plein de zones éparses.

Pour être plus propre, on pourrait séparer le code des données. On aurait, en RAM, une zone avec les instructions et une zone avec les données. Il suffirait juste d’aller modifier la zone des données, et d’exécuter le code générique qui saurait, pour chaque instruction, où trouver les bons opérandes.

Pour cela, on modifie (toutes) les instructions de la façon suivante : au lieu d’avoir en RAM deux octets instruction - opérande, on aura plutôt instruction - adresse de l’opérande.

Par exemple, pour effectuer “3 + 4, 3 − 1” on pourra voir une organisation du genre (voir tableau 1.2):

Tableau 1.2: Organisation de la mémoire, avant éxécution du programme
adresse type du mot stocké exemple zone
0 instruction load  
1 adresse de l’opérande 100  
2 instruction +  
3 adresse de l’opérande 101  
4 instruction store  
5 adresse de l’opérande 103  
6 instruction load zone de code
7 adresse de l’opérande 100  
8 instruction -  
9 adresse de l’opérande 102  
10 instruction store  
11 adresse de l’opérande 104  
 
100 donnée 3  
101 donnée 4  
102 donnée 1 zone de données
103 donnée X  
104 donnée X  
 

Après l’exécution du code, on aura ceci en RAM (voir tableau 1.3)

Tableau 1.3: Organisation de la mémoire, après exécution du programme
adresse type du mot stocké exemple zone
0 instruction load  
1 adresse de l’opérande 100  
2 instruction +  
3 adresse de l’opérande 101  
4 instruction store  
5 adresse de l’opérande 103  
6 instruction load zone de code
7 adresse de l’opérande 100  
8 instruction -  
9 adresse de l’opérande 102  
10 instruction store  
11 adresse de l’opérande 104  
 
100 donnée 3  
101 donnée 4  
102 donnée 1 zone de données
103 donnée 7  
104 donnée 2  
 

Remarque : d’habitude on sépare même la zone de données en deux, celles qui sont connues à l’écriture du programme, et les autres (celles qui sont modifiées par le programme)...

Question 5: Proposer une modification de l’automate pour que les instructions travaillent avec des adresses d’opérandes...