You are on page 1of 18

Examen dArchitecture des Ordinateurs

Majeure 1 Polytechnique Lundi 10 Dcembre 2001


Lexamen dure 3 heures. Le sujet comporte 7 pages dont 3 pages de rappels sur le LC-2 et la microprogrammation. Tous documents autoriss. Le barme est donn titre indicatif, il sert surtout valuer le poids respectif des sections ; tel quel, lexamen est not sur 40. Lexamen contient un problme et un exercice. Dans le problme, les questions 1 et 2 peuvent tre traites indpendamment, mais il est recommand de bien comprendre le fonctionnement des instructions PUSH et POP avant daborder la question 2. Il est impratif de commenter les programmes en assembleur et les microprogrammes ; normalement, presque chaque instruction ou microinstruction doit tre suivie dun commentaire. Les corrections sont dans les cadres en dessous des questions.

Problme. Pile et LC-2 (30 points)


On considre le processeur LC-2 vu en cours et en TD ; la structure du LC-2 et le jeu dinstructions sont rappels en Annexe. Dans ce processeur on veut rajouter des instructions destines faciliter lutilisation dune pile, que lon utilisera pour le stockage de donnes temporaires quelconques (destines au calcul, aux appels de procdures,...). Dans une telle pile, on ne peut accder quau dernier lment (ici, on visualisera une pile dont le dernier lment est situ au bas de la pile). On dispose de deux nouvelles instructions pour utiliser cette pile : PUSH Rs et POP Rd : leffet de PUSH Rs est dajouter le contenu du registre Rs au bas de la pile ; le registre Rs nest pas modifi. leffet de POP Rd est de placer la donne situe dans le dernier lment de la pile dans le registre Rd et denlever cette donne de la pile. Le format et lopcode des instructions PUSH et POP sont indiqus ci-dessous : Bit PUSH POP 15 14 13 1011 1010 12 11 10 Rs1 Rd 9 8 1 1 7 0 0 6 1 1 5 1 1 4 0 1 3 0 1 2 0 1 1 0 1 0 1 1

Voici un exemple de fonctionnement dune pile 4 lments de 16 bits chacun (les valeurs sont donnes en hexadcimal): 0000 0000 0000 0000 0000 0000 0000 0A2F Etat aprs PUSH R1 (R1 contient 0A2F) 0000 0000 0A2F 19C3 Etat aprs PUSH R2 (R2 contient 19C3) 0000 0000 0000 0A2F Etat aprs POP R3 (R3 contient alors 19C3)

Etat initial

Dans lexemple ci-dessus, on dplace les donnes dans la pile afin de donner lintuition du fonctionnement de la pile ; en pratique et selon les implmentations de la pile, les donnes sont fixes (les donnes sont stockes en mmoire) ou se dplacent effectivement (il existe un composant matriel sur le processeur reprsentant la pile); ce point est sans importance pour la question 1, il sera abord en dtail la question 2. On suppose maintenant que le LC-2 dispose des instructions PUSH et POP et dune implmentation de la pile. Dans la section 1 on utilise cette pile pour la programmation en assembleur, et dans la question 2 on tudie les modifications apporter larchitecture pour implmenter la pile.

1. Utilisation de la pile (15 points)


Dans cette section, on ne se proccupe pas de la taille de la pile que lon suppose suffisamment grande pour tous les programmes ci-dessous. Comme la pile sert de zone de stockage, elle permet souvent de rduire le nombre de registres ncessaires dans une architecture ; dans certaines architectures, il peut ny avoir pratiquement aucun -1-

registre, on nutilise alors que la pile ; cest pourquoi, dans plusieurs questions, on restreint volontairement le nombre de registres dont on peut disposer. Dans toutes les questions, on suppose quinitialement tous les lments de la pile contiennent la valeur hexadcimale 0000. De manire gnrale, on privilgie ici la compacit (et la lisibilit) du programme sur le temps dexcution : on prfre un programme comportant peu dinstructions un programme plus rapide mais comportant plus dinstructions. 1.1 En utilisant un seul registre (le registre R0), les instructions de gestion de la pile dcrites ci-dessus et les instructions arithmtiques et logiques du LC-2, modifier la pile pour que ses 4 derniers lments aient les valeurs dcimales suivantes : .... 28 56 8 -9 On veillera minimiser le nombre dinstructions ncessaires au remplissage de la pile. AND R0, ADD R0, ADD R0, PUSH R0 ADD R0, PUSH R0 AND R0, PUSH R0 NOT R0, PUSH R0 R0, #0 R0, #15 R0, #13 R0, R0 R0, #15 R0 ; R0=0 ; R0=15 ; R0=28 ; R0=56 ; R0=8 ; R0=-9

1.2 On veut crire un programme qui effectue la division entire de b par a, a et b tant deux nombres reprsents sur 16 bits et tels que 0 < a, b < 215. On suppose que a et b sont respectivement stocks dans les registres R0 et R1. 1.2.1 Proposer un algorithme, et le prsenter sous forme dorganigramme. Il existe un algorithme symtrique celui vu en cours pour la multiplication, mais on conseille ici dutiliser un algorithme plus lmentaire, dont le temps dexcution peut ventuellement tre plus long. Ecrire le programme assembleur LC-2 correspondant. En fin de programme, le quotient sera stock dans R0 et le reste dans R1. On implmente lalgorithme de division en comptant combien de fois on peut soustraire a b. quotient = 0 reste < diviseur ? FIN reste = reste diviseur quotient++ aller BOUCLE

BOUCLE OUI NON

.ORIG x3000 AND R2, R2, #0 ; quotient=0 BOUCLE NOT R3, R0 ; R3=-diviseur ADD R3, R3, #1 ; ADD R3, R1, R3 ; R3=reste-diviseur BRn FIN ADD R1, R3, #0 ; reste=reste-diviseur ADD R2, R2, #1 ; quotient++ JMP BOUCLE FIN ADD R0, R2, #0 ; R0=quotient .END 1.2.2 Ecrire une nouvelle version de ce programme en nutilisant que les registres R0, R1, R2 et R3 (on nutilise ni la mmoire, ni la pile). -2-

Cette question registres. 1.2.3

concerne

les

programmes

du

1.2.1

comportant

plus

de

Ecrire nouveau le programme en nutilisant que les registres R0, R1, R2 et la pile. En fin de programme, le quotient sera dans R0 et le reste dans R1.

Une solution : .ORIG x3000 AND R2, R2, PUSH R2 NOT R2, R0 ADD R2, R2, ADD R2, R1, BRn FIN ADD R1, R2, POP R2 ADD R2, R2, PUSH R2 JMP BOUCLE POP R0 .END

#0

BOUCLE

#1 R2 #0 #1

; ; ; ; ; ; ; ; ;

quotient=0 quotient sauvegard sur la pile R2=diviseur R2=reste-diviseur reste=reste-diviseur Rcupration du quotient quotient++ Sauvegarde du quotient

FIN

; R0=quotient

1.3 On a vu en cours que les appels de procdure, une fois cods en assembleur LC-2, utilisent une pile de contextes. Dans le LC-2, on gre normalement les contextes laide dinstructions mmoire (LD, ST, LDR, STR). On veut maintenant utiliser les instructions PUSH et POP pour grer les contextes. On suppose ici que lon na pas de variables locales. Dans cette question, les seules zones de stockage dont lon dispose sont les registres et la pile, on nutilise pas les instructions mmoire du LC-2. 1.3.1 Par rapport au contexte dcrit en cours, quelle information est-il maintenant inutile de garder dans le contexte sil est gr laide des instructions PUSH et POP ? Expliquer brivement pourquoi. En labsence dinstructions de gestion de la pile, la position en mmoire des contextes du LC-2 est indique par un pointeur stock dans R6. Ce pointeur indique le dbut du contexte courant. Avec PUSH et POP, il nest plus ncessaire dindiquer explicitement la position en mmoire du contexte, le dernier lment de la pile va correspondre au dernier lment du contexte courant, cest un pointeur implicite sur le contexte courant. 1.3.2 Si lon ne dispose que des instructions PUSH et POP, peut-on utiliser la pile pour le passage de paramtres la procdure appele ? Expliquer brivement pourquoi. Mme question pour le passage du rsultat la procdure appelante. Passage de paramtres : supposons que lon place un paramtre sur la pile laide dun PUSH dans la procdure appelante ; en dbut de procdure appele, on doit sauver les registres utiliss sur la pile (ils font partie du contexte de la procdure appele) avant toute opration sur les registres ; on ne pourra donc accder aux paramtres qui se situeront, dans la pile, au-dessus des registres sauvs. Si la procdure appele ne modifie aucun registre, le passage de paramtres est possible. Cependant, si la sauvegarde des registres est effectue dans la procdure appelante, il est possible dutiliser la pile pour passer les paramtres Passage de rsultat : le raisonnement est similaire ; en fin de procdure appele, on doit restaurer les registres modifis avec linstruction POP avant de retourner la procdure appelante ; le rsultat tant ncessairement dans un registre modifi, la restauration va craser ce rsultat ; inversement, si lon sauve le rsultat sur la pile avant la restauration des registres, on ne pourra accder aux valeurs des registres restaurer. Cependant, si la sauvegarde des registres est effectue dans la procdure appelante, il est possible dutiliser la pile pour renvoyer le rsultat. -3-

1.3.3

On veut effectuer le calcul suivant : ((a / b + c) / d) en utilisant des divisions entires. Ecrire le programme correspondant en utilisant la procdure de division entire de la question 1.2. Initialement, a, b, c, d sont respectivement dans les registres R0, R1, R2, R3. On passe les paramtres la procdure appele directement par les registres R0 et R1, et cette procdure renvoie directement le rsultat par les registres R0 et R1 comme indiqu la question 1.2.1. En fin de programme, le rsultat devra tre dans R0. Distinguer la procdure appelante et la procdure appele ; indiquer clairement les instructions rajouter dans le programme de division entire de la question 1.2.2 (ou 1.2.1 si vous navez pas fait le 1.2.2) pour le transformer en procdure. Dans la procdure appelante, on ne pourra utiliser que les registres R0, R1, R2, R3 et la pile.

Procdure appele : On utilise la procdure du 1.2.2 : DIV PUSH R2 PUSH R3 ; sauvegarde des registres R2 et R3 ; ; ; ; ; ; Il nest pas ncessaire de sauver ladresse de retour contenue dans R7 quotient=0 R3=diviseur R3=reste-diviseur

BOUCLE

FIN

AND NOT ADD ADD BRn ADD ADD JMP ADD POP POP

R2, R2, R3, R0 R3, R3, R3, R1, FIN R1, R3, R2, R2, BOUCLE R0, R2, R3 R2

#0 #1 R3 #0 #1 #0

; reste=reste-diviseur ; quotient++ ; R0=quotient ; Restauration des registres dans lordre inverse ; de la sauvegarde

Procdure appelante : Dans la question 1.2, on effectue la division de b par a, ici on effectue dabord la division de a par b, il faut donc intervertir les valeurs des registres R0 et R1 avant dappeler la procdure de division ; comme les registres R2 et R3 sont utiliss, il faut passer par la pile pour intervertir R0 et R1. .ORIG x3000 PUSH R1 PUSH R0 POP R1 POP R0 JSR DIV ADD R1, R0, R2 ADD R0, R3, #0 JSR DIV .END

; Sauvegarde de R0 et R1 pour interversion ; Interversion

; R1=(a/b+c), R0 contient le rsultat ; R0=d ; Le rsultat est dans R0

1.4 On veut maintenant raliser un programme en assembleur qui effectue la conversion en base b dun nombre A (A et b sont des entiers strictement positifs). On veut effectuer cette conversion en utilisant une succession de divisions entires. 1.4.1 Ecrire un algorithme de conversion qui utilise la division entire. On prsentera cet algorithme sous forme dorganigramme.

-4-

On utilise une succession de divisions entires : A = q0 x b + r0 q0 = q1 x b + r 1 q1 = q2 x b + r 2 ... arrt lorsque qn=0 ; le nombre en base b est rnrn-1...r1r0 quotient=A diviseur=b quotient < b ? FIN, le quotient est le dernier chiffre (poids fort) reste = RESTE(quotient/b) quotient = QUOTIENT(quotient/b) reste est le nouveau chiffre aller BOUCLE Initialement, A est stock dans le registre R1 et b dans le registre R0. Ecrire le programme de conversion en utilisant le programme de division entire de la question 1.2. Le programme de division entire de la question 1.2 sera considr comme une procdure appele par le programme de conversion ; on utilise les hypothses de la question 1.3 pour le passage des paramtres et la rcupration des rsultats de la procdure de division entire. En fin de programme, le rsultat sera stock dans la pile avec un chiffre par lment de la pile et le chiffre le plus significatif (par exemple le bit de poids fort si b=2) sera situ en bas de la pile. Dans la procdure appelante, on ne pourra utiliser que les registres R0, R1, R2, R3 et la pile. .ORIG x3000 ADD R2, R0, JSR DIV PUSH R1 ADD R1, R0, ADD R0, R2, ADD R1, R1, BRp BOUCLE .END

BOUCLE OUI NON

1.4.2

#0

BOUCLE

; b dans R2 ; le reste est dans R1, le quotient dans R0 ; quotient dans R1 ; b dans R0 ; quotient != 0 ?

#0 #0 #0

1.4.3

Mme question en nutilisant que les registres R0, R1, R2 et la pile dans la procdure appelante. Peut-on crire la procdure appelante avec seulement R0, R1 et la pile ?

Pour la premire partie de la question, voir question 1.4.2 Pas de solution avec 2 registres ( dmontrer).

2. Implmentation de la pile (15 points)


On utilise le processeur LC-2 vu en cours et en TD. Tout comme en TD, le LC-2 dispose dun contrle

Haut de la pile

Registre
16 WriteStack

Registre
16
0 1

Registre
16
0 1

DIR

Bas de la pile

16

Registre
0 1

16

GateStack 16

LatchStack

-5-

Latch

Bus

microprogramm, et on utilise le microsquenceur vu en TD et rappel en annexe; il est impratif dutiliser la syntaxe des microinstructions spcifie en annexe (ne pas crire les microinstructions en binaire). Dans le LC-2, le signal de contrle DRMX a t modifi. Enfin, en ce qui concerne la dure des tapes, on prcise ici que lcriture dans un registre ncessite un cycle ; on considrera galement que le passage travers le bus suivi de lcriture dans un latch ou un registre ncessite un cycle ; enfin, on ngligera le temps ncessaire la traverse de lALU sans effectuer de calcul. Dune manire gnrale, on considrera quil nest pas vital de minimiser la dure dune instruction et donc le nombre dtapes, mme sil faut viter un nombre excessivement grand dtapes. Figure 1. Implmentation de la pile. 2.1 Pile dans un composant ddi. Dans cette question, on veut ajouter au processeur LC-2 une vritable pile matrielle, implmente sous la forme dune succession de 4 registres 16-bits, comme indiqu Figure 1. Le circuit de la pile possde 4 signaux de contrle : WriteStack qui indique que lon modifie le contenu de la pile (WriteStack=0 pas de modification, WriteStack=1 en cas de modification) ; le signal WriteStack commande lcriture dans les registres de la pile. DIR qui indique le sens de progression des lments dans la pile (DIR=0 pour une progression vers le bas, DIR=1 pour une progression vers le haut) ; GateStack qui contrle des tristates reliant la sortie du dernier lment de la pile au bus (GateStack=0 lorsquil ny a pas de connexion au bus, GateStack=1 lorsquil y a connexion) ; LatchStack qui commande lcriture dans un latch reli au dernier lment de la pile ; ce latch stocke la valeur provenant du bus et placer dans la pile (si LatchStack=0 pas dcriture, si LackStack=1 on crit dans le latch). On suppose que lon a ajout ces signaux de contrle dans le champ Signaux des microinstructions. 2.1.1 On veut dfinir le microprogramme de contrle correspondant linstruction POP. Donner les diffrentes tapes de lexcution de linstruction POP en prcisant les signaux de contrle activer. Il est inutile de donner la valeur de tous les signaux de contrle chaque tape, seuls les signaux intervenant dans une tape seront mentionns. 2.1.2 Ecrire le microprogramme de contrle pour linstruction POP (on ne se proccupera pas des autres instructions assembleur LC-2 ; on crit le microprogramme en supposant quil ny a quune seule instruction assembleur dans le LC-2). Adresse 0 1 2 3 4 5 2.1.3 Nom MS MS MS MS MS BI Condition Adresse 0 Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1 GateStack=1, LD.REG=1, LD.CC=1, DRMX=0 DIR=0, WriteStack=1

PCMAR ; PC+1PC MmoireMDR MDRIR Dernier lment pileDR Dcalage pile vers le bas Retour au dbut

Reprendre la question 2.1.2 pour linstruction PUSH, en indiquant en commentaire de chaque microinstruction ltape laquelle elle correspond. Nom MS MS MS MS MS Condition Adresse Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1 SR1MUX=00 ALUK=11, GateALU=1, LatchStack=1 DIR=1, WriteStack=1

Adresse 0 1 2 3 4

PCMAR ; PC+1PC MmoireMDR MDRIR Lecture Rs1 Rs1Latch pile (par lALU) Dcalage pile vers le haut et empilement de la donne contenue dans le latch de la pile Retour au dbut

5 6

MS BI

-6-

2.1.4

Ecrire le microprogramme de contrle du LC-2 en supposant quil ne contient que deux instructions : POP et PUSH. Nom MS MS MS Condition Adresse Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1

Adresse 0 1 2

PCMAR ; PC+1PC MmoireMDR MDRIR Test sur opcode pour diffrencier PUSH et POP (dans le LC-2 le test est plac aprs la phase 3, ici, on essaie de factoriser au maximum les tapes)

BC

I12

4 5 6 7 8

MS MS BI MS MS

0 -

GateStack=1, LD.REG=1, LD.CC=1, DRMX=0 DIR=0, WriteStack=1

Dbut POP Dernier lment pileDR Dcalage pile vers le bas Fin POP Retour au dbut Dbut PUSH Lecture Rs1 Rs1Latch pile (par lALU) Dcalage pile vers le haut et empilement de la donne contenue dans le latch de la pile Fin PUSH Retour au dbut

SR1MUX=00 ALUK=11, GateALU=1, LatchStack=1 DIR=1, WriteStack=1

MS

10 2.1.5

BI

On suppose que le registre R0 contient la valeur hexadcimale 000A, R1 la valeur 000B, R2 la valeur 000C, R3 la valeur 000D et R4 la valeur 000E. Donner le contenu de la pile de la Figure 1 aprs la squence : PUSH R0, PUSH R1, PUSH R2, PUSH R3, PUSH R4. On excute ensuite POP R0. Donner le contenu de la pile de la Figure 1. On excute encore une fois POP R0. Donner nouveau le contenu de la pile. 000B 000C 000D 000E 000C 000B 000C 000D Aprs POP R0 000B 000C 000B 000C Aprs un nouveau POP R0

Aprs PUSH R0, PUSH R1, PUSH R2, PUSH R3, PUSH R4, 000A a disparu

Labsence de multiplexeur en entre de llment haut de la pile (le 4me lment partir du bas) fait que le 3me lment de la pile est systmatiquement inject vers le haut, mme en cas de POP, i.e., mme lorsque la pile est dcale vers le bas. 2.1.6 On suppose qu ltat initial, tous les lments de la pile contiennent la valeur hexadcimale 0000. On veut quun lment vide de la pile contienne toujours la valeur 0000. Comment modifier limplmentation de la pile de la Figure 1 pour que ce soit le cas ? Rpondre notamment avec un schma correspondant une version modifie de la Figure 1. Cette modification de la pile ne sera pas utilise dans le reste de lnonc.

-7-

Il faut placer un multiplexeur en entre du 4me lment, comme pour les autres lments de la pile. En cas de POP (DIR=0), il faut fournir en entre la valeur 0 (0000000000000000 en binaire).
0000000000000000

16

Registre
Haut de la pile 0 1

16 WriteStack

Registre
16
0 1

Registre
16
0 1

DIR

Bas de la pile

16

Registre
0 1

16

GateStack 16

LatchStack

Latch

Bus

2.2 Pile en mmoire. Dans cette question, on suppose que la pile est stocke dans une zone de la mmoire principale. Il nexiste pas de composant spcifique dans le LC-2 matrialisant la pile, contrairement la question prcdente. En cas de PUSH et POP, on ne dplace pas les donnes en mmoire, on se contente de dplacer un pointeur de pile. Ce pointeur indique ladresse en mmoire du dernier lment de la pile (le bas de la pile). On va considrer que le registre R5 contient ce pointeur de pile (attention, le rle du registre R5 nest pas exactement le mme que celui vu en cours pour le registre R6 et la pile des contextes, il sagit de deux notions diffrentes). On prcise que le pointeur de pile se dplace dans le sens des adresses croissantes au fur et mesure que lon ajoute des lments la pile. 2.2.1 Indiquer brivement les atouts et les inconvnients de cette implmentation de la pile par rapport celle de la question 2.1. Principal inconvnient : - Accs plus lent (requte la mmoire) Principal atout : - Grande taille (nombreux appels de oprandes de calcul) 2.2.2

procdure

imbriqus,

nombreuses

Reprendre la question 2.1.2 avec cette implmentation de la pile.

-8-

Adresse 0

Nom MS

Condition -

Adresse -

1 2

MS MS

Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1

PCMAR ; PC+1PC

MmoireMDR MDRIR Lecture R5, immdiat (les bits 8 6 contiennent 101, soit la valeur 5 ; les bits 4 0 contiennent 11111 soit la valeur -1 en complment 2 sur 5 bits ; le bit 5 est 1, donc limmdiat est slectionn plutt que SR2 ; limmdiat est envoy sur le 2me port ALU et utilis ltape 7) R5MAR par ALU MmoireMDR

MS

SR1MX=01

4 5

MS MS

6 7 8 9 2.2.3

MS MS MS BI

ALUK=11, GateALU=1, LD.MAR=1 R.W=0, LD.MDR=1 GateMDR=1, LD.REG=1, LD.CC=1, DRMX=0 ALUK=00 GateALU=1, LD.REG=1, DRMUX=1

MDRDR R5 + (-1) R5-1R5 Retour au dbut

Reprendre la question 2.1.3 avec cette implmentation de la pile.

Pour linstruction PUSH, il faut prendre garde dplacer le pointeur de pile avant dcrire dans la pile, car R5 pointe sur le dernier lment de la pile, donc sur un lment occup, et il faut dabord le dplacer sur un lment libre.

-9-

Adresse 0

Nom MS

Condition -

Adresse -

1 2 3

MS MS MS

Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1 SR1MX=01

PCMAR ; PC+1PC

MmoireMDR MDRIR Lecture R5, immdiat (00001 spcifi dans bits 4 0 de linstruction PUSH) R5+1 (R5+immdiat) ; on doit faire R5+1 avant laccs la mmoire car R5 pointe sur le dernier lment de la pile, donc un emplacement occup, et il faut lamener sur le premier emplacement libre R5+1R5 R5MAR par ALU ; on rcupre R5 depuis le banc de registres (on a toujours SR1MX=01), donc la nouvelle valeur de R5 qui pointe maintenant sur le premier emplacement libre de la pile Lecture Rs1 Rs1MDR (le conflit de ressources sur le port SR1 du banc de registres et sur le bus empche lenvoi simultan de ladresse et de la donne dans MAR et MDR, do ltape 5) Ecriture Mmoire Retour au dbut

MS

ALUK=00

MS

GateALU=1, LD.REG=1, DRMUX=1 ALUK=11, GateALU=1, LD.MAR=1 SR1MX=00 ALUK=11, GateALU=1, LD.MDR=1 R.W=1

MS

MS

MS

9 10

MS BI

2.3 Pile = Composant ddi + Mmoire. On considre nouveau que lon dispose du composant matriel de la Figure 1. En outre, en cas de dpassement de la capacit de la pile matrielle, on veut que llment en excs soit envoy la mmoire. On suppose donc que la mmoire contient une pile annexe qui prolonge la pile matrielle. Comme dans la question 2.2, le pointeur de cette pile annexe est R5 ; il contient ladresse en mmoire de llment situ au bas de cette pile annexe (le dernier lment de la pile) ; on prcise enfin que ladresse en mmoire du premier lment de la pile annexe est 0000, et que la pile annexe ne peut contenir plus de 1024 lments (mais on ne se proccupera pas de la gestion du dpassement de capacit de la pile annexe). On dispose dun signal de condition supplmentaire StackFull qui vaut 1 lorsque la pile matrielle est pleine (lorsque les 4 lments sont utiliss). 2.3.1 Quel lment de la pile matrielle faut-il envoyer la mmoire en cas de dpassement de capacit de la pile matrielle (lment en excs) ? Quand est-il ncessaire de tester si la pile annexe est vide ? Expliquer comment tester si la pile annexe est vide.

- 10 -

Llment en excs est celui situ en haut de la pile matrielle. Il faut tester si la pile annexe est vide en cas de POP : si la pile annexe nest pas vide, il faut ramener le dernier lment de la pile annexe dans le premier lment (en haut) de la pile matrielle, et dpiler la pile annexe dun lment. R5 pointe sur le dernier lment de la pile. On prcise que ladresse en mmoire du premier lment de la pile est 0000. Par consquent, si la pile ne contient quun seul lment, R5=0000. Si la pile est vide, R5 est donc gal FFFF. Il faut donc tester si R5 est gal FFFF. Comme la pile ne peut contenir plus de 1024 lments, on ne peut avoir le cas ambigu o la pile nest pas vide et R5=FFFF (de toute faon, R5=FFFF signifie que la pile annexe remplit toute la mmoire ; ce cas est absurde car il signifie ncessairement que la pile a cras le programme) Pour effectuer ce test, on lit R5 sur le port SR1 du banc de registres, et on positionne lALU sur lopration NOT. Si R5=FFFF, le rsultat de lALU est gal 0000. Daprs la description du microsquenceur, le bit z est un bit de condition. Donc si le bit z est 1, on sait que R5 est gal 0. 2.3.2 Indiquer comment modifier le schma de la Figure 1 pour permettre le mcanisme de pile annexe. Encore une fois, on privilgiera des modifications simples de larchitecture dcrite dans la Figure 1.

POP : si la pile annexe nest pas vide, on doit amener le dernier lment de la pile annexe dans le latch, puis dcaler la pile matrielle vers le bas, en plaant llment dans le latch en haut de la pile annexe. Les modifications matrielles ncessaires pour POP sont donc : (1) un multiplexeur en entre de llment haut de la pile, (2) un chemin du latch au multiplexeur. PUSH : Le raisonnement est similaire. Si la pile matrielle est pleine (signal de condition StackFull), il faut envoyer llment haut de la pile matrielle dans la pile annexe. Il faut donc un chemin de llment haut vers le bus, do le multiplexeur plac avant GateStack.

Haut de la pile

Registre
16
0 1

DIR 16 WriteStack

Registre
16
0 1

16

Registre
16
Bas de la pile 0 1

DIR

16 DIR
1 0

Registre
0 1

16

GateStack 16

LatchStack

Latch

Bus

2.3.3

Reprendre les questions 2.1.2 et 2.1.3 avec cette implmentation de la pile. - 11 -

POP : On teste si la pile annexe est vide ; si ce nest pas le cas, il faut ramener le dernier lment de la pile annexe en haut de la pile matrielle, dcaler vers le bas la pile matrielle, puis modifier le pointeur de la pile annexe contenu dans R5. On peut galement acclrer linstruction en testant StackFull avant de tester si la pile annexe est vide ; si StackFull nest pas 1, il est inutile de tester si la pile annexe est vide ; il sagit seulement dune optimisation et ce nest pas non plus la solution retenue ci-dessous. Adresse 0 1 2 3 4 5 Nom MS MS MS MS MS MS Condition Adresse Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1 SR1MX=01 ALUK=10 GateALU=1, LD.CC=1

PCMAR ; PC+1PC MmoireMDR MDRIR Dbut test pour savoir si pile annexe vide Lecture R5 ALU effectue NOT Calcul de CC, notamment de z Si z=1, la pile annexe est vide, il nest pas ncessaire de la dcaler ; Aller au dcalage de la pile matrielle Dcalage pile annexe : Lecture R5 R5MAR par ALU MmoireMDR MDRLatch de la pile R5 + (-1) Fin dcalage de la pile annexe R5-1R5 Dcalage pile matrielle (idem 2.1) : Dcalage pile vers le bas (llment contenu dans le latch passe dans llment haut de la pile ; cest utile si la pile annexe ntait pas vide) PileDR Retour au dbut

BC

13

7 8 9 10 11 12

MS MS MS MS MS MS

SR1MX=01 ALUK=11, GateALU=1, LD.MAR=1 R.W=0, LD.MDR=1 GateMDR=1, LatchStack=1, ALUK=00 GateALU=1, LD.REG=1, DRMUX=1

13

MS

DIR=0, WriteStack=1

14 15 PUSH :

MS BI

GateStack=1, LD.REG=1, LD.CC=1, DRMX=0

Ici, il faut ncessairement tester si StackFull=1 avant de dcaler la pile matrielle vers le haut. Si StackFull=0, il suffit de dcaler la pile matrielle. Si StackFull=1, il faut dabord envoyer le haut de la pile matrielle dans la pile annexe, puis dcaler la pile matrielle.

- 12 -

Adresse 0 1 2 3 4

Nom MS MS MS BC BI

Condition StackFull -

Adresse 5 11

Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1

PCMAR ; PC+1PC MmoireMDR MDRIR Test pour savoir si pile matrielle pleine Aller directement dcalage pile matrielle Vider le haut de la pile matrielle dans la pile annexe Lecture R5, immdiat R5+1 (R5+immdiat) R5+1R5 R5MAR par ALU

5 6 7 8

MS MS MS MS

SR1MX=01 ALUK=00 GateALU=1, LD.REG=1, DRMUX=1 ALUK=11, GateALU=1, LD.MAR=1 DIR=1, GateStack=1, LD.MDR=1 R.W=1 SR1MUX=00 ALUK=11, GateALU=1, LatchStack=1 DIR=1, WriteStack=1

9 10 11

MS MS

Haut de la pileMDR Ecriture Mmoire Dcaler la pile matrielle vers le haut (idem 2.1) Lecture Rs1 Rs1Pile (par lALU) Dcalage pile vers le haut et empilement de la donne contenue dans LatchStack Retour au dbut

12

MS

13 14 2.3.4

MS BI

Indiquer comment modifier le schma de la question Erreur ! Source du renvoi introuvable. pour gnrer le signal de condition StackFull.

Il faut que le signal soit 1 lorsque llment du haut de la pile est utilis. On ajoute un registre 1-bit chaque tage de la pile. Le signal StackFull est fourni par le registre 1-bit de llment haut de la pile. Ces registres 1-bit sont connects comme les registres contenant les donnes de la pile, excepts llment du haut et celui du bas ; pour ces deux lments, on sinspire de la question 2.1.6. Llment du bas reoit 1 en entre chaque PUSH (lorsque DIR=1) ; celui du haut doit recevoir 0 chaque POP sauf si la pile annexe nest pas vide (auquel cas, il doit recevoir 1). On le relie un nouveau latch 1-bit situ ct du latch de la pile ; lcriture dans ce latch 1-bit est contrl par un signal LatchStack2, et ce latch reoit en entre la ngation de la sortie du registre 1-bit de condition z. Le signal LatchStack2 doit tre activ ltape 6 de linstruction POP (aprs stockage du rsultat dans le registre 1-bit z), au moment du test de z. Ainsi, si la pile annexe est vide, ce latch 1-bit va recevoir 0, et aprs dcalage de la pile matrielle, le signal StackFull vaudra 0 galement. Rciproquement, si la pile annexe nest pas vide, ce latch va recevoir 1 et StackFull continuera valoir 1. Pour les instructions PUSH, on fait progressivement monter la valeur 1 partir de llment bas de la pile.

- 13 -

StackFull

Haut de la pile

Registre
16 17 17
0 1

DIR WriteStack

Registre
17
0 1

16

Registre
17
Bas de la pile 0 1

DIR

16 DIR
1 0

Registre
0 1

1 1

LatchStack2

GateStack 16

17 LatchStack

Latch

Bus

Exercice. Processeur SISC : Single Instruction Set Computer (10 points)


On considre un jeu dinstructions ne contenant qu'une seule instruction: SBN A,B,S, o SBN signifie Substract and Branch if Negative (Soustrait et Saute si Ngatif). L'instruction effectue l'opration suivante: Mem(A) = Mem(A) - Mem(B), et o si (Mem(A) < 0) PC = PC + S ; o sinon PC = PC + 1 (saut l'instruction suivante) ; o Mem(A) correspond au contenu de la mmoire ladresse A, et PC au compteur de programme ; le test est effectu aprs la soustraction ; on suppose que la largeur de la mmoire est telle quune adresse mmoire correspond une donne ou une instruction ; on ne se proccupe pas non plus de la taille du mot que lon suppose suffisamment grand pour les calculs ; enfin, on considre quun programme se termine quand sa dernire instruction est excute. On suppose que Mem(0)=1, et on peut utiliser les adresses 1 9 pour stocker des valeurs temporaires. Dans les questions suivantes, on suppose que 10 A, B, C 20. 1. Ecrire le programme permettant d'effectuer Mem(A) 0. SBN A,A,1 2. ; Mem(A)=Mem(A)-Mem(A)=0

Ecrire le programme permettant deffectuer Mem(A) Mem(B). SBN SBN SBN SBN A,A,1 1,1,1 1,B,1 A,1,1 ; ; ; ; Mem(A)=0 Mem(1)=0 Mem(1)=-Mem(B) Mem(A)=-Mem(1)=Mem(B)

3.

Ecrire le programme permettant deffectuer Mem(A) 3. - 14 -

SBN SBN SBN SBN SBN SBN 4.

A,A,1 1,1,1 1,0,1 1,0,1 1,0,1 A,1,1

; ; ; ; ; ;

Mem(A)=0 Mem(1)=0 Mem(1)=-Mem(0)=-1 Mem(1)=Mem(1)-Mem(0)=-2 Mem(1)=Mem(1)-Mem(0)=-3 Mem(A)=-Mem(1)=3

Ecrire le programme permettant deffectuer Mem(A) Mem(B) + Mem(C). SBN SBN SBN SBN SBN SBN SBN A,A,1 1,1,1 1,B,1 2,2,1 2,C,1 A,1,1 A,2,1 ; ; ; ; ; ; ; Mem(A)=0 Mem(1)=0 Mem(1)=-Mem(B) Mem(2)=0 Mem(2)=-Mem(C) Mem(A)=-Mem(1)=Mem(B) Mem(A)=Mem(B)-Mem(2)=Mem(B)+Mem(C)

5.

Ecrire le programme permettant deffectuer Mem(A) Mem(B) x Mem(C) en supposant que 0Mem(B).

On additionne Mem(B) fois Mem(C) Mem(A). SBN SBN SBN SBN SBN SBN SBN SBN SBN SBN A,A,1 ; 1,1,1 ; 1,C,1 ; 3,3,1 ; 2,2,1 ; 2,B,ADD; 3,0,FIN; A,1,1 ; B,0,1 ; 3,0,BCL; Mem(A)=0 Mem(1)=0 Mem(1)=-Mem(C) Mem(3)=0 Mem(2)=0 Mem(2)=-Mem(B), -Mem(B)<0 ? ( Mem(B)>0 ?) Aller FIN (branchement inconditionnel) Mem(A)=Mem(A)-Mem(1)=Mem(A)+Mem(C) Mem(B)=Mem(B)-1 Aller BCL (branchement inconditionnel)

BCL

ADD

FIN

- 15 -

Annexe
Les informations ci-dessous ont t vues en TD, excepte la syntaxe des microinstructions ; on rappelle que le signal DRMX a t modifi. On rappelle le format et la signification des principales instructions du LC-2 : Bit : ADD ADD AND AND BR 15 14 13 12 11 10 Rd Rd Rd Rd n z p 9 8 7 Rs1 Rs1 Rs1 Rs1 6 5 0 1 0 1 4 00 3 2 1 Rs2 0

Syntaxe assembleur Signification ADD Rd, Rs1, Rs2 RdRs1+Rs2 ADD Rd, Rs1, immdiat RdRs1+SEXT(immdiat) AND Rd, Rs1, Rs2 RdET(Rs1,Rs2) AND Rd, Rs1, immdiat RdET(Rs1,SEXT(immdiat)) BRnzp label ou immdiat Saut si OU(ET(n,N),ET(z,Z),ET(p,P))=1 adresse=PC[15:9]@ZEXT(immdiat) PCadresse JMP/JSR label ou immdiat Si L=1 (JSR) R7PC adresse=PC[15:9]@ZEXT(immdiat) PCadresse JMPR/JSRR label ou immdiat Si L=1 (JSRR) R7PC adresse=Rs1+ZEXT(immdiat) PCadresse LD Rd, label ou immdiat adresse=PC[15:9]@ZEXT(immdiat) RdMmoire(adresse) LDR Rd, Rs1, immdiat adresse=Rs1+ZEXT(immdiat) RdMmoire(adresse) LEA Rd, label ou immdiat Rd PC[15:9]@ZEXT(immdiat) NOT Rd, Rs1 RdNOT(Rs1) RET PCR7 ST Rs1, label ou immdiat adresse=PC[15:9]@ZEXT(immdiat) Rs1Mmoire(adresse) STR Rs1, Rs2, immdiat adresse=Rs2+ZEXT(immdiat) Rs1Mmoire(adresse)

0001 0001 0101 0101 0000

immdiat 00 Rs2

immdiat

immdiat

JMP/JSR

0100

00

immdiat

JMPR/JSRR

1100

00

Rs1

immdiat

LD LDR LEA NOT RET ST STR

0010 0110 1110 1001 1101 0011 0111

Rd Rd Rd Rd Rs1 Rs1

immdiat immdiat immdiat 111111

000000000000 Rs1 Rs1 Rs2 immdiat immdiat

o SEXT signifie Signed Extension (extension signe 16 bits en complment 2), et ZEXT signifie Zero Extension (extension non signe 16 bits) , @ est loprateur de concatnation (de deux champs de bits), IR[x:y] dnote les bits x y du registre instruction (IR).

- 16 -

On rappelle la structure du LC-2 et le rle des signaux de contrle :

- LD.MAR, LD.MDR, LD.IR, LD.REG, LD.CC, et LD.PC commandent lcriture dans les divers registres et latchs du LC-2 (1 si criture, 0 sinon) ; - GatePC, GateMDR, GateALU et GateMARMX commandent lcriture sur le bus ; - R.W : 0 pour une lecture et 1 pour une criture en mmoire. - ALUK (2 bits) : 00 pour ADD, 01 pour AND, 10 pour NOT, 11 pour que loprande de droite (SR1) traverse lALU sans calcul ; - PCMX (2 bits) : 00 pour slectionner PC+1, 01 pour le bus, 10 pour la sortie du banc de registres, 11 pour la concatnation PC[15:9]@IR[8:0] ; - MARMX (2 bits) : 00 pour slectionner IR[7:0], 01 pour l addition dun registre et IR[5:0], 10 pour la concatnation PC[15:9]@IR[8:0], 11 est inutilis ; - SR1MX (2 bits) : multiplexeur non reprsent sur la figure et alimentant le signal SR1 (numro registre source 1) : 00 pour slectionner IR[11:9], 01 pour IR[8:6], 10 et 11 inutiliss ; - DRMX (1 bit) : multiplexeur non reprsent sur la figure et alimentant le signal DR (numro registre destination) : 0 pour slectionner IR[11:9], 1 pour IR[8:6] ; - SR2MX (1 bit) : multiplexeur permettant de choisir entre SR2 (registre source 2) et limmdiat ; ce signal est toujours gal la valeur du bit IR[5], il est inutile de spcifier la valeur de ce signal ; - on ignore le rle des autres signaux. On rappelle que les diffrentes tapes possibles de lexcution dune instruction dans le LC-2 sont les suivantes (chacune requiert un cycle processeur) : o Chargement de linstruction (3 tapes, donc 3 cycles) : Envoi adresse instruction (PCMAR) ; on effectue galement PCPC+1 Chargement instruction (MmoireMDR) Stockage instruction (MDRIR) o Dcodage et lecture des oprandes (lecture des registres Rs1, Rs2 ; appels SR1, SR2 sur le schma du processeur) o Calcul dadresse (les diffrents calculs dadresse destins aux instructions daccs la mmoire sont slectionns avec MARMX) o Accs mmoire : laccs mmoire pour les donnes se dcompose en 3 tapes (3 cycles) comme laccs mmoire pour les instructions : Envoi adresse de la donne (dans le latch MAR) ; en cas dcriture, il faut galement envoyer la donne dans MDR dans une autre tape Accs mmoire (criture, ou lecture et stockage de la donne dans le latch MDR) Rcupration de la donne dans le processeur partir de MDR en cas de lecture o Excution (ALU) o Ecriture du rsultat (dans le banc de registres)

- 17 -

On rappelle la structure gnrale du microsquenceur, on donne une syntaxe pour les microinstructions et un exemple de microprogramme (contrle de linstruction ADD) :

Une microinstruction comporte 4 champs : opcode, numro de condition, adresse de branchement, signaux de contrle. Il existe 4 types de microinstruction : microinstruction simple (MS), branchement inconditionnel (BI), branchement conditionnel (BC), microinstruction darrt (STOP). Pour le microsquenceur du LC-2, on considre ici que lon dispose de 6 signaux de conditions correspondant aux 5 bits de poids fort du registre dinstruction (IR) et au bit z du registre codecondition (CC); ces signaux sont appels I15, I14, I13, I12, I11, z. Syntaxe utiliser : on ne reprsentera pas une microinstruction avec un format binaire mais en utilisant le format suivant : nom microinstruction nom condition numro microinstruction signaux activs

o nom microinstruction correspond aux acronymes MS, BI, BC et STOP, nom condition aux bits I15, I14, I13, I12, I11, z, numro microinstruction ladresse en mmoire ROM de la microinstruction de destination (en cas de branchement) exprime en dcimal (la premire microinstruction sera stocke ladresse 0), et signaux activs aux signaux qui sont activs par la microinstruction en ignorant les signaux sans importance pour cette microinstruction. Exemple de microprogramme : contrle de linstruction ADD du LC-2 : Nom MS MS MS MS MS MS Condition Adresse Signaux GatePC=1, LD.MAR=1, PCMX=00, LD.PC=1 LD.MDR=1, R.W=0 GateMDR=1, LD.IR=1 SR1MX=01 ALUK=00 GateALU=1, LD.REG=1, LD.CC=1 PCMAR ; PC+1PC MmoireMDR MDRIR SR1,SR2ALU Calcul ALUDR

- 18 -

You might also like