Previous Up

2  Couche microprogrammée

Dans ce chapitre, on considère une mémoire centrale de 212 mots de 16 bits, comportant une pile d'exécution, reliée à un bus d'adresses à 12 lignes et à un bus de données à 16 lignes. On suppose qu'un programme en langage machine est chargé dans cette mémoire centrale.

Le microprogramme est un programme qui réside dans une mémoire locale du (micro) processeur: c'est un interpréteur qui décode et exécute une par une les instructions en langage machine19, en répétant le schéma général suivant: Avant de revoir le détail de ces opérations, nous décrivons la structure d'une micromachine et les micro-instructions.

2.1  Structure de la micromachine

La micromachine contient deux parties: le chemin des données et le bloc de contrôle. Voir la figure 1.



Figure 1: Une machine microprogrammée



2.1.1  Le chemin des données

Il comprend (voir la partie gauche de la figure 1):

2.1.2  Le bloc de contrôle

Il comprend (voir la partie droite de la figure 1):

2.2  Les micro-instructions

2.2.1  Structure d'une micro-instruction

Une micro-instruction est donc un mot de 32 bits comportant 13 champs:
La figure 2 montre quelques exemples de micro-instructions. La colonne de gauche indique de façon fonctionnelle (dans un langage de type Pascal) les opérations à effectuer et les colonnes suivantes contiennent les valeurs des bits de la micro-instruction correspondante.

  C B A ADDR
rad:=co; rd; 0 0 2 0 0 1 1 0 0 0 0 0 00
rd; 0 0 2 0 0 0 1 0 0 0 0 0 00
ri:=rdo; 1 0 2 0 0 0 0 0 1 3 0 0 00
co:=co+1; 0 0 0 0 0 0 0 0 1 0 6 0 00
rad:=ri; rdo:=ac; wr; 0 0 2 0 1 1 0 1 0 0 3 1 00
ual:=rit; if n goto 15; 0 1 2 0 0 0 0 0 0 0 0 4 15
ac:=inv(rdo); 1 0 3 0 0 0 0 0 1 1 0 0 00
rit:=decalg(rit); if n goto 25; 0 1 2 2 0 0 0 0 1 4 0 4 25
ual:=ac; if z goto 25; 0 2 2 0 0 0 0 0 0 0 0 1 22
ac:=bet(ri,amasq); goto 0; 0 3 1 0 0 0 0 0 1 1 8 3 00
pp:=pp-1; rd; 0 0 0 0 0 0 1 0 1 2 2 7 00
rit:=decalg(ri+ri); if n goto 69; 0 1 0 2 0 0 0 0 1 4 3 3 69


Figure 2: Quelques exemples de micro-instructions



Dans la dernière ligne du tableau, par exemple, les opérations sont
rit:=decalg(ri+ri); if n goto 69;
La micro-instruction associée comporte donc:

2.2.2  Exécution d'une micro-instruction

L'exécution est divisée en quatre étapes, correspondant chacune à un des quatre sous-cycles de l'horloge.

2.3  L'interprétation des instructions en langage machine

2.3.1  Les instructions du langage machine

Un ensemble d'instructions est représenté dans le tableau de la figure 3.

Binaire Symbole Instruction Opération
0000 xxxx xxxx xxxx LODD Chargement ac:=m[x]
    mode direct  
0001 xxxx xxxx xxxx STOD Rangement m[x]:=ac
    mode direct  
0010 xxxx xxxx xxxx ADDD Addition ac:=ac+m[x]
    mode direct  
0011 xxxx xxxx xxxx SUBD Soustraction ac:=acm[x]
    mode direct  
0100 xxxx xxxx xxxx JPOS Saut si >0 if (ac>0) co:=x
0101 xxxx xxxx xxxx JZER Saut si =0 if (ac=0) co:=x
0110 xxxx xxxx xxxx JUMP Saut co:=x
0111 xxxx xxxx xxxx LOCO Chargement ac:=x (0≤ x≤ 4 095)
    constante  
1000 xxxx xxxx xxxx LODL Chargement ac:=m[pp+x]
    mode local  
1001 xxxx xxxx xxxx STOL Rangement m[pp+x]:=ac
    mode local  
1010 xxxx xxxx xxxx ADDL Addition ac:=ac+m[pp+x]
    mode local  
1011 xxxx xxxx xxxx SUBL Addition ac:=acm[pp+x]
    mode local  
1100 xxxx xxxx xxxx JNEG Saut si <0 if (ac<0) co:=x
1101 xxxx xxxx xxxx JNZE Saut si ≠ 0 if (ac≠ 0) co:=x
1110 xxxx xxxx xxxx CALL Appel procédure pp:=pp−1; m[pp]:=co; co:=x
1111 0000 0000 0000 PSHI Empilement pp:=pp−1; m[pp]:=m[ac]
    indirect  
1111 0010 0000 0000 POPI Dépilement m[ac]:=m[pp]; pp:=pp+1
    indirect  
1111 0100 0000 0000 PUSH Empilement pp:=pp−1; m[pp]:=ac
1111 0110 0000 0000 POP Dépilement ac:=m[pp]; pp:=pp+1
    indirect  
1111 1000 0000 0000 RETN Retour co:=m[pp]; pp:=pp+1
1111 1010 0000 0000 SWAP Échange tmp:=ac; ac:=pp; pp:=tmp
    AC et pile  
1111 1100 yyyy yyyy INSP Incrémentation pp:=pp+y (0≤ y≤ 255)
    de PP  
1111 1110 yyyy yyyy DESP Décrémentation pp:=ppy (0≤ y≤ 255)
    de PP  


Figure 3: Instructions du langage machine



La première colonne de ce tableau contient le code binaire de l'instruction. Remarquons que les instructions sont rangées par ordre croissant suivant leur code. Ce code est en général divisé en deux parties, la première représentant l'opération proprement dite et la seconde une adresse de la mémoire centrale ou une constante. Dans la deuxième colonne figure le symbole correspondant, tandis que la troisième colonne contient le nom de l'instruction et la quatrième une description fonctionnelle de cette instruction dans un langage du type Pascal. Dans cette colonne, le mot de la mémoire centrale d'adresse x est noté m[x].

Considérons par exemple l'instruction de symbole JUMP. Le code binaire de cette opération commence par 0110, suivi de l'adresse en mémoire centrale (sur 12 bits) où le branchement doit avoir lieu. La description fonctionnelle consiste simplement en une instruction: co:=x, qui signifie que cette adresse de la mémoire centrale doit être copiée dans le compteur ordinal.

Certaines opérations ont un code opération sur 16 bits, car elles ne nécessitent pas d'information supplémentaire: par exemple l'instruction PUSH ajoute le contenu du registre AC au sommet de la pile d'exécution. La pile considérée dans ce chapitre est située à des adresses décroissantes de la mémoire centrale, il faut donc décrémenter de 1 l'adresse du sommet de pile pour y ajouter une donnée: pp:=pp−1; m[pp]:=ac.

On peut observer dans ce tableau trois modes d'adressage: Indépendamment du mode d'adressage, les instructions se divisent en plusieurs catégories:

2.3.2  Interprétation d'une instruction du langage machine

Les figures 4, 5, et 6 montrent un exemple de micro-programme. Un micro-programme est donc une suite de micro-instructions, qui sont ici décrites de manière fonctionnelle pour des raisons de lisibilité, mais qu'il faudrait en fait traduire par les 32 bits correspondants, comme cela a été fait dans la figure 2. Le micro-programme est formé d'une boucle, comprenant trois étapes: La première étape est réalisée par les micro-instructions 0, 1, et 2 du micro-programme. Les deux étapes suivantes sont réalisées par tous les groupes de micro-instructions qui précèdent le retour au début de la boucle, représenté par un branchement sur la première micro-instruction: goto 0;.

Fin de la deuxième étape: supposons par exemple que les micro-instructions exécutées soient celles de numéros 3, 4, et 5. Troisième étape: supposons que l'instruction STOD ait été détectée. Il faut transférer la donnée contenue dans le registre AC en mémoire centrale à l'adresse spécifiée par les 12 bits restants de l'instruction. Exercice  Citer et expliquer la suite des micro-instructions exécutées lors d'un appel de procédure et retour.

0: rad:=co; rd; programme principal
1: co:=co+1; rd; incrémentation de CO
2: ri:=rdo; if n goto 28; analyse et sauvegarde de RDO
3: rit:=decalg(ri+ri); if n goto 19; 00xx ou 01xx?
4: rit:=decalg(rit); if n goto 11; 000x ou 001x?
5: ual:=rit; if n goto 9; 0000 ou 0001?
6: rad:=ri; rd; 0000=LODD
7: rd;  
8: ac:=rdo; goto 0;
9: rad:=ri; rdo:=ac; wr; 0001=STOD
10: wr; goto 0;  
11: ual:=rit; if n goto 15; 0010 ou 0011?
12: rad:=ri; rd; 0010=ADDD
13: rd;  
14: ac:=rdo+ac; goto 0;  
15: rad:=ri; rd; 0011=SUBD
16: ac:=ac+1; rd;  
17: a:=inv(rdo);  
18: ac:=ac+a; goto 0;  
19: rit:=decalg(rit); if n goto 25; 010x ou 011x?
20: ual:=rit; if n goto 23; 0100 ou 0101?
21: ual:=ac; if n goto 0; 0100=JPOS
22: co:=bet(ri,amasq); goto 0;  
23: ual:=ac; if z goto 0; 0101=JZER
24: goto 0;  
25: ual:=rit; if n goto 27; 0110 ou 0111?
26: co:=bet(ri,amasq); goto 0; 0110=JUMP
27: ac:=bet(ri,amasq); goto 0; 0111=LOCO
28: rit:=decalg(ri+ri); if n goto 40; 10xx ou 11xx?
29: rit:=decalg(ri); if n goto 35; 100x ou 101x?
30: ual:=rit; if n goto 33; 1000 ou 1001?
31: a:=ri+pp; 1000=LODL
32: rad:=a; rd; goto 7;
33: a:=ri+pp; 1001=STOL
34: rad:=a; rdo:=ac; wr; goto 10;  


Figure 4: Un exemple de micro-programme




35: ual:=rit; if n goto 38; 1010 ou 1011?
36: a:=ri+pp; 1010=ADDL
37: rad:=a; rd; goto 13;  
38: a:=ri+pp; 1011=SUBL
39: rad:=a; rd; goto 16;  
40: rit:=decalg(rit); if n goto 46; 110x ou 111x?
41: ual:=rit; if n goto 44; 1100 ou 1101?
42: ual:=ac; if n goto 22; 1100=JNEG
43: goto 0;  
44: ual:=ac; if z goto 0; 1101=JNZE
45: co:=bet(ri,amasq); goto 0;  
46: rit:=decalg(rit); if n goto 50;  
47: pp:=pp-1; 1110=CALL
48: rad:=pp; rdo:=co; wr;  
49: co:=bet(ri,amasq); wr; goto 0;  
50: rit:=decalg(rit); if n goto 65; 1111, adresse?
51: rit:=decalg(rit); if n goto 59;  
52: ual:=rit; if n goto 56;  
53: rad:=ac; rd; 1111 000=PSHI
54: pp:=pp-1; rd;  
55: rad:=pp; wr; goto 10;  
56: rad:=pp; pp:=pp+1; rd; 1111 001=POPI
57: rd;  
58: rad:=ac: wr: goto 10;  
59: ual:=rit; if n goto 62;  
60: pp:=pp-1; 1111 010=PUSH
61: rad:=pp; rdo:=ac; wr; goto 10;  
62: rad:=pp; pp:=pp+1; rd; 1111 011=POP
63: rd;  
64: ac:=rdo; goto 0;  
65: rit:=decalg(rit); if n goto 73;  
66: ual:=rit; if n goto 70;  
67: rad:=pp; pp:=pp+1; rd; 1111 100=RETN
68: rd;  
69: co:=rdo; goto 0;  


Figure 5: Un exemple de micro-programme (suite)




70: a:=ac; 1111 101=SWAP
71: ac:=pp;  
72: pp:=a; goto 0;  
73: ual:=rit; if n goto 76;  
74: a:=bet(ri,smasq); 1111 110=INSP
75: pp:=pp+a; goto 0;  
76: a:=bet(ri,smasq); 1111 111=DESP
77: a:=inv(a);  
78: a:=a+1; goto 75;  


Figure 6: Un exemple de micro-programme (fin)




Previous Up