Examen d’Architecture des Ordinateurs Ecole Polytechnique
2009–2010
– L’examen dure 3 heures.
– Le sujet comporte 7 pages dont 2 pages de rappels sur le LC-2.
– Tous documents autorisés.
– Le barème est donné à titre indicatif, il vous sert surtout à évaluer le poids respectif des exercices ; la somme des points est 25.
– Il est impératif de commenter vos programmes ; la plupart des lignes/instructions doivent être suivies d’un commentaire permettant de comprendre leur rôle.
– Il est impératif de justifier toutes vos réponses.
Exercice 1 - Interruptions (15 points)
La plupart des processeurs intègrent la capacité de gérer des interruptions : à la suite d’un signal, le processeur peut interrompre l’exécution du programme immédiatement après la fin de l’exécution de l’instruction courante.
Il doit alors sauver l’état courant du processeur, puis démarrer une routine correspondant à l’interruption. Dans cet exercice, on va examiner ce qui se produit lors d’une interruption dans le LC2, et en particulier les problèmes liés à la sauvegarde de l’état du processeur. L’état du processeur à sauvegarder est défini par : le contenu des registres, le PC et les registres NZP.
Question 1.1
Donner la liste des instructions assembleur qui ne modifient pas la valeur des bits NZP.
Réponse
BR, JMP, JSR, JMPR, JSRR, LEA, ST, STR, RET, TRAP
Question 1.2
Pour le moment, on va supposer que l’on interdit d’utiliser R0 pour stocker des valeurs, on l’utilise seulement pour pouvoir sauvegarder l’état de NZP. Quelle information suggérez-vous de sauvegarder dans R0 afin de rendre aussi simple que possible la restauration des bits NZP ? Détaillez votre réponse.
Réponse
Pour restaurer facilement les valeurs des bits NZP, le plus simple est de sauvegarder un seul mot qui, une fois chargée par LD (qui modifie NZP), ou additionné à 0 (opération neutre mais qui modifie NZP) positionnera automatiquement NZP à la bonne valeur. Cette solution est préférable à la sauvegarde individuelle des bits NZP.
Comme les bits NZP sont mutuellement exclusifs, on peut par exemple procéder ainsi : – Si N=1, sauver la valeur 10...0;
– Si P=1, sauver la valeur 0...01; – Si Z=1, sauver la valeur 0...0;
Question 1.3
Ecrivez maintenant une séquence d’instructions assembleur LC2 qui implémente la sauvegarde de NZP que vous avez suggérée. Cette séquence peut être appelée après toute instruction d’un programme, mais, pour le moment, on ne se préoccupera pas de la gestion de la pile.
Réponse
BRpz LABELPZ ; test de NZP LD R0, VALN ; ici NZP=100 JMP LABELEND
LABELPZ BRp LABELZ ; test de NZP LD R0, VALP ; ici NZP=001
1
2 JMP LABELEND
LABELZ LD R0, VALZ ; ici NZP=010 LABELEND
VALN .FILL b1000000000000000 VALP .FILL b0000000000000001 VALZ .FILL b0000000000000000
Question 1.4
Ecrivez maintenant une séquence d’instructions assembleur pour restaurer les bits NZP en supposant que R0 contient l’information que vous avez décrite à la Question 1.2.
Réponse
ADD R0, R0, #0 ; change les bits NZP en fonction de la valeur de R0
Question 1.5
FIG. 1 – Eléments sauvegardés dans la pile.
On suppose maintenant qu’on dispose d’une pile fonctionnant comme celle vue dans le TD6 (et plus simple que celle vue en cours) et réexpliquée ci-après : il n’y a pas de pointeur de contexte, seulement un pointeur de pile stocké dans R6 ; R6 pointe sur la dernière case allouée de la pile ; pour faire une allocation on incrémente R6. A chaque interruption, l’ordre des informations sauvegardées sur la pile est celle décrite dans la Figure 1. Le PC est d’abord sauvegardé sur la pile de façon matérielle (aucune instruction assembleur n’est utilisée pour cela), puis l’état défini par NZP et les registres sont sauvegardés par une séquence d’instructions assembleur. On rappelle que pour sauvegarder un registre, par exemple le registre R3, on écrit le code suivant :
ADD R6, R6, #1 STR R3, R6, #0
Pourquoi faut-il faire l’allocation de la pile (matérialisée par l’incrémentation de R6) avant la sauvegarde du registre ? Détaillez votre réponse avec un scénario d’exécution précis où, en cas d’allocation après la sauvegarde, l’exécution peut devenir fonctionnellement incorrecte.
Réponse
Supposons que l’on fasse l’inverse :
STR R3, R6, #1 ADD R6, R6, #1
Si une interruption a lieu après ST R, mais avant ADD, la seconde interruption va utiliser la case de la pile destinée à R3 dès la première allocation, et donc remplacer la valeur sauvegardée par une autre. A la fin de la première interruption, R3 sera donc restauré avec une valeur incorrecte.
Question 1.6
On suppose maintenant qu’une fois une interruption déclenchée, le processeur refuse toute nouvelle interrup- tion avant la fin de la première l’interruption. En utilisant le code écrit à la Question 1.3, écrivez la séquence d’instructions complète de sauvegarde de l’état NZP sur la pile.
Réponse
BRpz LABELPZ ; test de NZP LD R0, VALN ; ici NZP=100 JMP LABELEND
LABELPZ BRp LABELZ ; test de NZP LD R0, VALP ; ici NZP=001
JMP LABELEND
3 LABELZ LD R0, VALZ ; ici NZP=010
LABELEND
ADD R6, R6, #1 ; allocation de la pile seulement maintenant, sinon NZP sont modifiés par cette instruction
STR R0, R6, #0 ; VALN .FILL b1000000000000000 VALP .FILL b0000000000000001
VALZ .FILL b0000000000000000
Question 1.7
Ecrivez maintenant la séquence d’instructions complète de restauration des bits NZP à partir de l’information sauvegardée sur la pile.
Réponse
Il suffit d’écrire
ADD R6, R6, #-1 ; désallocation de la pile avant, sinon NZP sont modifiés par cette instruction
LDR R0, R6, #1
Question 1.8
On suppose maintenant que R0 n’est plus un registre dédié à la sauvegarde de l’état NZP. Peut-on toujours écrire une séquence d’instructions pour sauvegarder l’état NZP (si oui, l’écrire) ? Peut-on toujours écrire une séquence d’instructions pour restaurer les bits NZP (si oui, l’écrire) ? Justifiez précisément votre réponse.
Réponse
Il faut à la fois sauvegarder R0 avant de l’utiliser pour trouver l’état NZP (ou n’importe quel autre registre), et en même temps, ne pas modifier NZP (donc ne pas faire d’allocation dans la pile). C’est possible car ST R ne modifie pas NZP.
; attention, l’allocation n’est pas encore effectuée, R6 ne pointe pas sur la case de NZP, mais sur la case précédente (celle du PC)
STR R0, R6, #2 ; sauvegarde de R0, ne modifie pas NZP BRpz LABELPZ ; test de NZP
LD R0, VALN ; ici NZP=100 JMP LABELEND
LABELPZ BRp LABELZ ; test de NZP LD R0, VALP ; ici NZP=001
JMP LABELEND
LABELZ LD R0, VALZ ; ici NZP=010 LABELEND
STR R0, R6, #1 ; sauvegarde de NZP
ADD R6, R6, #2 ; allocation de la pile après, sinon NZP sont modifiés par cette instruction
VALN .FILL b1000000000000000 VALP .FILL b0000000000000001 VALZ .FILL b0000000000000000
Restauration : ce n’est pas possible : si on restaure d’abord NZP, on change NZP en restaurant R0 ; si on restaure d’abord R0, on change R0 en restaurant NZP.
Question 1.9
On suppose à nouveau que R0 est un registre dédié à la sauvegarde de l’état NZP. Si on autorise maintenant les interruptions imbriquées (une interruption peut se déclencher alors qu’on est en train de traiter une précédente interruption), peut-on écrire une séquence d’instructions pour sauvegarder l’état NZP (et si oui, l’écrire) ? Pour restaurer l’état NZP (et si oui, l’écrire) ? Justifiez précisément votre réponse.
Réponse
Pour la sauvegarde, c’est impossible si on veut juste ajouter la sauvegarde de R0 au début du programme, parce qu’il faut d’abord allouer la pile avec ADDR6,R6,#1, ce qui modifie NZP. En revanche, si on modifie le programme pour faire l’allocation après les tests NZP, mais avant d’utiliser R0, c’est possible ; il y a une complication supplémentaire, on doit utiliser un registre R1 pour accéder en arrière (offset négatif) à la pile, sans désallouer la pile (sans modification de R6). Le code d’allocation de pile doit en plus être dupliqué.
BRpz LABELPZ ; test de NZP
; ici, la valeur de NZP est connue
ADD R6, R6, #3 ; allocation pour NZP, R0, R1 STR R1, R6, #0 ; sauvegarde de R1
4 ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où R0 doit être sauvegardé
STR R0, R1, #0 ; sauvegarde de R0
ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où NZP doit être sauvegardé LD R0, VALN ; ici NZP=100
JMP LABELEND
LABELPZ BRp LABELZ ; test de NZP
; ici, la valeur de NZP est connue
ADD R6, R6, #3 ; allocation pour NZP, R0, R1 STR R1, R6, #0 ; sauvegarde de R1
ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où R0 doit être sauvegardé STR R0, R1, #0 ; sauvegarde de R0
ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où NZP doit être sauvegardé LD R0, VALP ; ici NZP=001
JMP LABELEND LABELZ ; NZP = Z
; ici, la valeur de NZP est connue
ADD R6, R6, #3 ; allocation pour NZP, R0, R1 STR R1, R6, #0 ; sauvegarde de R1
ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où R0 doit être sauvegardé STR R0, R1, #0 ; sauvegarde de R0
ADD R1, R6, #-1 ; R1 pointe sur l’emplacement où NZP doit être sauvegardé LD R0, VALZ ; ici NZP=010
LABELEND
STR R0, R1, #1 ; sauvegarde de NZP VALN .FILL b1000000000000000 VALP .FILL b0000000000000001 VALZ .FILL b0000000000000000
Même problème pour la restauration (on doit désallouer la pile en dernier).
Question 1.10
FIG. 2 – Registre d’interruption.
On suppose toujours que R0 est un registre dédié à la sauvegarde de l’état NZP. On veut maintenant étudier le support matériel nécessaire pour la gestion des interruptions ; pour le moment, on suppose toujours que seul le PC est sauvegardé de façon matérielle. L’adresse de la routine d’interruption est fournie par un registre spécial INT R (Interrupt Register) directement connecté au bus par le biais d’un tri-state contrôlé par un signal GateINT R, voir Figure 2. Le multiplexeur SR2MX devant l’entrée 2 de l’ALU, et initialement contrôlé par le bit 5 de l’instruction, est maintenant un multiplexeur à 4 entrées, contrôlé par le bit 5 et un signal StackMX ; les deux entrées supplémen- taires du multiplexeur (10 et 11 où le premier bit correspond à StackMX ) sont câblées à+1 et−1 respectivement.
Enfin, l’entrée 10 de SR1MX est câblée à la valeur 6, ainsi que l’entrée 10 de DRMX .
Décrivez la séquence d’activation des signaux de contrôle depuis la fin de l’exécution de l’instruction courante jusqu’à ce que la première instruction de la routine d’interruption commence à s’exécuter. On suppose dorénavant que chaque entrée de la pile est allouée avant d’être utilisée (et désallouée une fois qu’elle n’est plus utile). On décrira cette séquence en utilisant un format similaire à celui de la Table 1. Au minimum, combien de cycles sont nécessaires pour exécuter cette séquence ?
Réponse
SR1MX=10,SR2MX=10,ALU K=00,GateALU=1,
DRMX=10,LD.MAR=1,LD.REG=1 R6+1→R6,R6+1→MAR; allocation pour PC GatePC=1,LD.MDR=1 PC→MDR
R.W=1,GateINT R=1,PCMX=01,LD.PC=1 ecriture memoire,INT R→PC,debut routine interruption Il faut au minimum 3 cycles pour exécuter cette séquence.
Question 1.11
On veut maintenant ajouter deux modes spéciaux pour l’instruction ADD : ADD+1 et ADD−1 qui permettent d’ajouter et soustraire 1 à tout registre, sans changer l’état des bits NZP. On va notamment utiliser ces modes pour le registre R6 et la pile. Proposez une modification du format de l’instruction ADD pour implémenter ces modes.
5
Réponse
Pour allouer et désallouer la pile, on doit incrémenter ou décrementer la pile de 1. A priori, on veut donc utiliser le mode
“immédiat” de l’instruction ADD, mais dans ce mode, aucun bit n’est libre dans l’opcode pour spécifier le mode. On va donc partir du mode registre-registre et utiliser le fait que les valeurs+1et−1sont câblées dans SR2MX. Les bits 3 et 4 sont inutilisés dans le mode registre-registre. On se sert du bit 4 pour spécifier le mode spécial (bits 5 et 4 à 1 signifient mode spécial), et on n’utilise pas le deuxième registre, on utilise seulement le bit 0 : 0→+1, 1→ −1.
Question 1.12
Décrivez la séquence complète de contrôle de l’instruction ADD+1 avec ce mode spécial.
Réponse
PC→PC+1,LD.PC=1,GatePC=1,LD.MAR=1 chargement instruction MIO.EN=1,LD.MDR=1
GateMDR=1,LD.IR=1
SR1MX=01,SR2MX=10,ALU K=00,GateALU=1,DRMX=00,LD.REG=1 Rx+1→Rx
Question 1.13
Ecrivez maintenant une séquence d’instructions assembleur pour sauvegarder l’état défini par NZP sur la pile, et une autre pour restaurer les bits NZP, et qui tolèrent les interruptions imbriquées.
Réponse
Sauvegarde : il faut sauvegarder R0 car il est utilisé pour définir NZP, donc si une interruption survient pendant la routine de calcul de NZP, la valeur calculée peut devenir fausse après la fin de l’interruption imbriquée.
ADD+1 R6, R6 ; allocation pour sauvegarder NZP ADD+1 R6, R6 ; allocation pour sauvegarder R0 STR R0, R6, #0 ;
ADD+1 R6, R6 ; allocation pour sauvegarder R1 STR R1, R6, #0 ;
BRpz LABELPZ ; test de NZP LD R0, VALN ; ici NZP=100 JMP LABELEND
LABELPZ BRp LABELZ ; test de NZP LD R0, VALP ; ici NZP=001
JMP LABELEND
LABELZ LD R0, VALZ ; ici NZP=010 LABELEND
ADD R1, R6, #-2 ; R1 pointe sur l’emplacement de NZP STR R0, R1, #0 ; sauvegarde de NZP
VALN .FILL b1000000000000000 VALP .FILL b0000000000000001 VALZ .FILL b0000000000000000
Restauration :
LDR R1, R6, #0 ; restauration de R1 ADD-1 R6, R6 ; désallocation de R1 LDR R0, R6, #0 ; restauration de R0 ADD-1 R6, R6 ; désallocation de R0
LDR R0, R6, #0 ; restauration de NZP ; écrase R0, mais celui-ci est dédié au calcul de NZP ;
ADD-1 R6, R6 ; désallocation de NZP
Question 1.14
On suppose à nouveau que R0 n’est pas dédié à la sauvegarde de NZP. Avec le support matériel ci-dessus, peut-on écrire des séquences d’instructions pour sauvergarder et pour restaurer NZP (si oui, les écrire). Si vous n’y parvenez pas, proposez une autre modification du jeu d’instructions pour le faire ; détaillez son implémentation, et écrivez les séquences d’instructions correspondantes.
Réponse
On peut écrire la sauvegarde, mais c’est plus complexe parce qu’il faut également sauver R0. Comme NZP doit être en premier dans la pile, on doit sauvegarder un deuxième registre, e.g., R1, qu’on va utiliser ensuite comme pointeur de pile temporaire pour stocker NZP après que le pointeur de pile ait été déplacé sur NZP.
Sauvegarde : même code qu’à la question précédente.
Restauration : ce n’est pas possible, le problème est le même qu’avant : soit on restaure d’abord R0 et NZP écrase R0, soit on restaure d’abord NZP et ensuite la restauration de R0 avec LD écrase NZP.
6 On peut ajouter un autre mode à LDR, baptisé LDRnw (no write), qui ne sauvegarde pas le résultat dans le registre desti- nation mais modifie bien NZP. Il n’y a pas de bit libre dans le format de LDR, aussi, on est obligés de recourir à une pratique inélégante et utiliser une instruction complètement différente. Par exemple, comme le ADD a encore le bit 3 qui est inutilisé, on va considérer qu’un ADD dont les bits 5 et 3 sont activés est en fait un LDRnw. On aurait également pu utiliser JMP/JSRdont les bits 9 et 10 sont inutilisés. La séquence de contrôle de LDRnw est assez évidente (pas d’écriture dans le banc de registres).
La séquence d’instructions de sauvegarde est la même que ci-dessus, et la séquence de restauration est indiquée ci-dessous : on l’utilise pour restaurer NZP sans affecter le registre R0 qui n’a aucun rôle dans LDRnw.
LDR R1, R6, #0 ; restauration de R1 ADD-1 R6, R6 ; désallocation de R1 LDR R0, R6, #0 ; restauration de R0 ADD-1 R6, R6 ; désallocation de R0 LDRnw R0, R6, #0 ; restauration de R0 ADD-1 R6, R6 ; désallocation de R0
Question 1.15
On veut maintenant effectuer de façon matérielle la sauvegarde de l’état défini par NZP sur la pile, sans utiliser de séquences d’instructions assembleur. Expliquez comment modifier l’architecture du LC2 pour que ce soit possible ; on privilégiera des modifications simples. Décrivez la séquence complète de contrôle nécessaire pour la sauvegarde de l’état défini par NZP. Même question pour la restauration des bits NZP.
Réponse
Il faut simplement crééer une connection entre NZP (introduction de GateNZP) et le bus avec une extension à 0 (bus 16 bits, NZP correspond à 3 bits). On sauvegarde ensuite NZP en mémoire à l’emplacement pointé par R6.
SR1MX=10,SR2MX=01,ALU K=00,GateALU=1,
DRMX=10,LD.REG=1,LD.MAR=1 R6+1→R6,MAR GateNZP=1,LD.MDR=1,R.W=1 NZP→MDR
R.W=1 ecriture memoire
7
Exercice 2 - DMA (10 points)
FIG. 3 – Principaux composants et signaux du DMA.
Un composant DMA (Direct Memory Access) a notamment pour but de transférer un flux de données, à des adresses consécutives, depuis la mémoire. Un tel composant est utilisé dans les PCs mais aussi dans les systèmes embarqués. On va étudier la conception détaillée d’un DMA. Notre DMA sera composé d’une FIFO (elle-même composée de 4 registres de 8 bits (1 octet) chacun, numérotés de 0 à 3) ; FIFO signifie First In First Out : les données sortent dans l’ordre dans lequel elles arrivent. Cette FIFO reçoit ses données depuis la mémoire et les envoie à un circuit, voir Figure 3. Bien que l’on parle de “FIFO”, les données ne bougent pas une fois stockées dans le tampon : le haut de la FIFO est matérialisé par un index, qui se déplace d’une entrée de la FIFO à l’entrée suivante au fur et à mesure qu’on lit les données dans le tampon, créant l’illusion d’un fonctionnement en FIFO.
Plus exactement, il y aura trois index : un index indiquant la donnée que le circuit doit consommer, un index indiquant l’emplacement pour lequel on va demander une nouvelle adresse à la mémoire, et un index indiquant l’emplacement dans lequel on doit stocker la donnée revenant de la mémoire.
Pour implémenter ce DMA, on pourra utiliser les éléments suivants : les portes logiques élémentaires (AND, OR, NOT), des additionneurs n bits (précisez n à chaque utilisation), des multiplexeurs 2n→1 (idem, précisez n), et des registres n bits (idem, précisez n) ; on disposera aussi de signaux câblés à 0 et 1. Outre leur entrée et leur sortie, chaque registre dispose d’un signal w qui indique si le registre doit écrire la valeur en entrée. Tous les registres sont déjà connectés à l’horloge (connection matérialisée par un triangle dans la figure), on ne peut intercaler aucune porte logique entre un registre et le signal d’horloge. Au démarrage du DMA, on active un signal reset qui remet à 0 le contenu de tous les registres.
On suppose que le DMA commence à charger les octets à partir de l’adresse 0 ; chaque adresse de la mémoire correspond à un octet ; on ne se préoccupe pas du nombre d’octets à charger.
Le circuit qui utilise les données/octets reçoit une valeur IN sur 8 bits et un signal ready depuis le DMA qui indique que la donnée suivante est disponible, et envoie un signal next pour signifier au DMA qu’il peut consommer une autre donnée (ce signal peut être envoyé en même temps qu’une donnée est consommée, ou plus tard si le circuit est bloqué), voir Figure 3. La mémoire reçoit, depuis le DMA, un signal load qui vaut 1 pour indiquer qu’il faut charger la donnée à l’adresse addr (16 bits) ; la mémoire envoie le signal write au DMA et la donnée en MEM lorsqu’elle est disponible.
Le DMA comporte, outre la FIFO, un tableau de registres 1 bit (un par entrée de la FIFO) ; lorsque ce bit vaut 1, cela signifie que la donnée dans l’élément correspondant de la FIFO est disponible (a été chargé depuis la
8 mémoire) et n’a pas encore été consommé par le circuit. Ce tableau est appelé Valid.
On prendra soin de respecter scrupuleusement les notations de la Figure 3.
Question 2.1
Pour implémenter les différents index, on a besoin de réaliser un circuit qui incrémente une valeur sur n bits à chaque cycle où un signal inc (incrémentation) est activé. Ce circuit fournit 2nbits, numérotés de 0 à 2n−1, qui valent tous 0 sauf le bit dont le numéro correspond à la valeur stockée sur n bits. Faire un schéma complet et précis de ce circuit à l’aide des composants et signaux de l’énoncé.
Réponse
FIG. 4 – DMA.
Voir Figure 4.
Question 2.2
Faire le schéma complet du circuit connectant la sortie des registres de la FIFO à l’entrée IN du circuit, ainsi que la sortie du tableau Valid au port ready du circuit. On détaillera précisément tous les composants et signaux utilisés, ainsi que leurs connections, et on prendra soin d’écrire en plus, séparément, les expressions logiques des différents signaux. On expliquera clairement le raisonnement suivi.
Réponse
Voir Figure 4.
Question 2.3
Même question pour le circuit calculant l’adresse de la prochaine instruction à charger, ainsi que le circuit connectant le circuit de calcul d’adresse et le tableau Valid au signal load de la mémoire.
Réponse
Voir Figure 4.
Question 2.4
Même question pour le circuit connectant la sortie de la mémoire (signaux MEM et write) aux registres de la FIFO et au tableau Valid.
Réponse
Voir Figure 4.
9
Rappels sur le LC-2
Dans cette section, on rappelle le jeu d’instructions du LC-2, voir Figure 6, et l’architecture du LC-2, voir Figure 5.
+1 2
IR LD.IR
R PCMX LD.PC
MARMX 2
+ ZEXT
ZEXT
@
MDR MAR
R.W
KBDR KBSR
CRTDR CRTSR 2 INMUX
LD.MAR
MIO.EN GateMDR
MEM.EN LD.MDR
Input Output
MIO.EN
GatePC
R7 R0
ALU OUT
SR2
OUT SR1
2 ALUK
GateALU SR1
SR2
SEXT
LD.REG DR
SR1MX DRMX
2
2
des
bus 16 bits
contrôle adresses mémoire
adressable sur 16 bits
N Z P LD.CC combinatoire combinatoire
BEN LD.BEN SR2MX contrôle microprogrammé BEN
GateMARMX
PC
CarryOut CarryIn
16 [8 :0]
16 [15 :9]
[5 :0]
[7 :0]
16 16
16 16
3
3 3
16 16
[4 :0]
[5]
[8 :6]
[11 :9]
[11 :9]
[15 :11]
[0 :2]
FIG. 5 – Schéma du LC-2 Note : les circuitsPC,IR,MAR,MDR,BEN,N,ZetPsont des registres.
Le rôle des signaux de contrôle de la figure 5 est explicité dans la liste suivante.
– LD.MAR/1, LD.MDR/1, LD.IR/1, LD.REG/1, LD.CC/1et LD.PC/1commandent l’écriture dans les divers registres du LC-2.
– LD.BEN/1commande l’écriture dans le registre BEN (branch enable) ; ce registre vaut 1 lorsque le branche- ment doit être pris (si l’instruction courante est un branchement conditionnel).
– GatePC/1, GateMDR/1, GateALU/1et GateMARMX/1commandent les accès en écriture sur le bus.
– MIO.EN/1doit être mis à 1 lorsque l’on souhaite accéder à la mémoire ou aux I/O, en lecture ou en écriture.
– R.W/1est mis à 0 pour une lecture et 1 pour une écriture en mémoire.
– ALUK/2: 00 pourADD, 01 pourAND, 10 pourNOT, 11 pour faire « traverser » l’entrée 1 sans calcul.
– PCMX/2sélectionne l’une des quatre entrées du multiplexeur : de droite à gauche, 00, 01, 10 et 11.
– MARMX/2 sélectionne l’une des trois entrées du multiplexeur : de gauche à droite, 00, 01 et 10 (11 est inutilisé).
10 – SR1MX/2sélectionne l’une des quatre entrées du multiplexeur : de haut en bas, 00 et 01 (10 et 11 ne sont
pas utilisés).
– DRMX/2sélectionne le registre destination (signal DR) : IR[11 : 9]pour 00, IR[8 : 6]pour 01 (10 et 11 ne sont pas utilisés).
– SR2MX/1est à part : ce signal détermine si la deuxième opérande vient du banc des registres ou du champ immédiat, il est par construction égal au bit 5 du registre d’instruction IR et n’intervient pas dans la micro- programmation.
PC→PC+1,LD.PC=1,GatePC=1,LD.MAR=1 chargement instruction MIO.EN=1,LD.MDR=1 instruction dans MDR
GateMDR=1,LD.IR=1 instruction dans IR PCMX=11,LD.PC=1 @→PC
TAB. 1 – Exemple de séquence de contrôle pour l’instruction JMP.
On rappelle également la liste des instructions du LC-2 (dans sa version simplifiée) en Figure 6.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADD DR, SR1, SR2
(DR ← SR1 + SR2) 0 0 0 1 DR SR1 0 0 0 SR2
ADD DR, SR1, imm5
(DR ← SR1 + SEXT(imm5)) 0 0 0 1 DR SR1 1 imm5 : immédiat 5-bits signé AND DR, SR1, SR2
(DR ← AND(SR1, SR2)) 0 1 0 1 DR SR1 0 0 0 SR2
AND DR, SR1, imm5
(DR ← AND(SR1, SEXT(imm5))) 0 1 0 1 DR SR1 1 imm5 : immédiat 5-bits signé NOT DR, SR
(DR ← NOT(SR)) 1 0 0 1 DR SR 1 1 1 1 1 1
BRnzp label (PC = PC[15:9]@offset9
ifn.N+z.Z+p.P) 0 0 0 0 n z p offset 9-bits non signé dans la page courante JMP label
(PC = PC[15:9]@offset9) 0 1 0 0 0 0 0 offset 9-bits non signé dans la page courante JSR label
(R7 ← PCand
PC = PC[15:9]@offset9) 0 1 0 0 1 0 0 offset 9-bits non signé dans la page courante JMPR indexed address
(PC = BaseR + ZEXT(offset6)) 1 1 0 0 0 0 0 BaseR index 6-bits non signé JSR indexed address
(R7 ← PCand
PC = BaseR + ZEXT(offset6)) 1 1 0 0 1 0 0 BaseR index 6-bits non signé LEA DR, label
(DR ← PC[15:9]@offset9) 1 1 1 0 DR offset 9-bits non signé dans la page courante LD DR, label
(DR ← MEM(PC[15:9]@offset9)) 0 0 1 0 DR offset 9-bits non signé dans la page courante LDR DR, indexed address
(DR ← MEM(BaseR + ZEXT(offset6))) 0 1 1 0 DR BaseR index 6-bits non signé ST SR, label
(SR → MEM(PC[15:9]@offset9)) 0 0 1 1 SR offset 9-bits non signé dans la page courante STR SR, indexed address
(SR → MEM(BaseR + ZEXT(offset6))) 0 1 1 1 SR BaseR index 6-bits non signé
(PC ← RETR7) 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
FIG. 6 – Format des instructions du LC-2