Laboratorul 9 - Calculatorul Didactic: Instrucțiuni cu doi operanzi
Scopul laboratorului este de a implementa execuția instrucțiunilor cu 2 operanzi (ADD, ADC, SUB, SBB, AND, OR, XOR, CMP și TEST) în unitatea de comandă.
Implementarea unei instrucțiuni în unitatea de comandă
În laboratorul 8 au fost enumerate cele patru etape de prelucrare a instrucțiunilor:
Fetch - aducerea instrucțiunii din memorie în registrul instrucțiune (RI)
Decode - decodificarea instrucțiunii
Execute - executarea instrucțiunii
Store - scrierea rezultatului (dacă este cazul)
Ce trebuie să facă unitatea de comandă atunci când trebuie excutată o instrucțiune aritmetică logică cu doi operanzi? De exemplu
ADC RA, RB
.
Semnale către CP și AM: valoarea din CP e pusă pe magistrală și scrisă în AM;
Semnale catre AM și memorie pentru a lua valoarea (codul instrucțiunii) de la adresa specificată de AM;
Semnal către RI pentru a pune codul instrucțiunii în el
Decodificare instrucțiune;
Semnal către blocul de registre generale pentru a determina activarea conținutului lui RA pe magistrală;
Semnal către T1 pentru a încărca valoarea aflată în acest moment pe magistrală;
Semnal către blocul de registre generale pentru a determina activarea conținutului lui RB pe magistrală;
Semnal către T2 pentru a încărca valoarea aflată în acest moment pe magistrală;
Semnal către UAL ce indică operația ADC;
Semnal către IND pentru ca UAL-ul să poată scrie flagurile;
Semnal către blocul de registre generale pentru a încărca în RA valoarea de pe magistrală;
Incrementarea CP pentru adresa instrucțiunii următoare - semnal către CP pentru a scrie în el.
Implementare
Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale:
Automatul trebuie să ofere stări pentru:
aducerea instrucțiunii din memorie în registrul RI
decodificarea codului instrucțiunii pentru identificarea operației ce trebuie efectuate și a operanzilor acesteia (dacă este cazul)
interpretarea fiecărei instrucțiuni. Aceasta se traduce printr-o serie de stări care setează semnalele de output ale modulului pentru a comanda execuția instrucțiunii.
incrementarea registrului CP
La fel ca în laboratorul trecut, în implementarea unității de comandă vom considera că UAL-ul va pune rezultatul în T1, și de acolo va fi transferat în registre sau în memorie. Această convenție simplifică stările care comandă execuția operațiilor aritmetice-logice.
Codificarea instrucțiunilor
Formatul instrucțiunilor este același precum cel din laboratorul 8, așa cum se observă din imaginea de mai jos.
Formatul instrucțiunilor calculatorului didactic
Click AICI pentru explicarea câmpurilor din figura anterioară.
Click AICI pentru explicarea câmpurilor din figura anterioară.
COP - codul operației, 7 biți
bitul [0] - separă instrucțiunile care folosesc o adresă efectivă de cele care nu folosesc:
0 - instrucțiuni cu calcul de adresă efectivă
1 - instrucțiuni fără calcul de adresă efectivă (salturi condiționate, ret etc.)
bitul [1] - separă instrucțiunile care au 1 operand de cele cu 2 operanzi:
0 - un operand
1 - doi operanzi
bitul [2] - separă instrucțiunile cu operand imediat de cele fără operand imediat:
0 - fără operand imediat
1 - cu operand imediat
bitul [3] - separă instrucțiunile de transfer de date/control de celelalte:
0 - transfer de date/control (mov, push, call etc.) sau care nu salvează rezultatul (cmp, test)
1 - instrucțiuni aritmetico-logice cu salvarea rezultatului, salturi condiționate
biții [4][5][6] - cod operație
d - pentru instrucțiunile cu doi operanzi, folosit pentru a ști care e primul și care e al doilea dintre cele două câmpuri REG și RM din codul instrucțiunii:
0 - RM = RM op REG
1 - REG = REG op RM
MOD - modul de calcul al adresei efective (4 moduri - 2 biți)
REG - indexul registrului care conține unul dintre operanzi
RM - indexul registrului care conține unul dintre operanzi
Instrucțiunile care vor fi implementate în acest laborator se regăsesc în tabelul de mai jos. Acestea sunt instrucțiuni aritmetice și logice cu doi operanzi ale căror valori sunt în registrele generale și fie pun un rezultat înapoi în registrul destinație, fie nu stochează rezultatul ci doar setează indicatorii de condiție (CMP și TEST).
Instrucțiune | Funcție | Cod RI[0:6] |
ADD | opdst = opdst + opsrc | 0101000 |
ADC | opdst = opdst + opsrc + carry | 0101001 |
SUB | opdst = opdst - opsrc | 0101010 |
SBB | opdst = opdst - opsrc - carry | 0101011 |
AND | opdst = opdst & opsrc | 0101100 |
OR | opdst = opdst | opsrc | 0101101 |
XOR | opdst = opdst ^ opsrc | 0101110 |
CMP | opdst - opsrc, fără stocare rezultat, doar setare indicatori | 0100010 |
TEST | opdst & opsrc, fără stocare rezultat, doar setare indicatori | 0100100 |
Instrucțiuni aritmetice-logice cu doi operanzi
Pentru decodificarea instrucțiunilor din acest laborator trebuie sa identificăm atât grupul instrucțiunilor aritmetice-logice cu doi operanzi, fără operand imediat și care stochează rezultatul (RI0..3 = 0101) cât și cele care nu stochează rezultatul (RI0..3 = 0100).
Adresarea directă la registru
Operanzii se găsesc în registrele specificate de câmpurile REG și RM. Pentru a selecta ordinea operanzilor din aceste două câmpuri, trebuie să ținem cont de valoarea din bitul d. Vom folosi adresarea directă la registru (câmpul mod trebuie să conțină valoarea 2'b11), așa cum se observă în imaginea de mai jos.
Adresarea directă la registru pentru instrucțiuni cu doi operanzi
Instrucțiunea AND RA, RB
efectuează ȘI
logic între cei doi operanzi și pune rezultatul în registrul destinație (RA
). Un exemplu de calcul al codului operației se regăsește mai jos:
[0] = 0 - cu calcul de adresă efectivă
[1] = 1 - doi operanzi
[2] = 0 - fără operand imediat
[3] = 1 - operație aritmetică cu salvarea rezultatului
[4,5,6] = [1,0,0] - codul dat operației (stabilit de arhitectură)
[7] - selectează operandul destinație. Pentru exemplul acesta vom considera că acest bit ia valoarea 1 (destinația va fi registrul RA
):
[8,9] = [1,1] - modul de adresare (folosim adresarea directă la registru)
[10,11,12] = [0,0,0] - indexul registrului RA
în bancul de registre
[13,14,15] = [0,0,1] - indexul registrului RB
în bancul de registre
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
Exerciții
Modificați modulul uc.v din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din tabelul prezentat anterior. Citiți secțiunea de implementare.
(4p) Decodificați instrucțiunea ADD regdst, regsrc.
Identificați grupul de instrucțiuni în care se încadrează operația (ADD) și modul de adresare.
Identificați operandul destinație.
Transferați conținutul registrului regsrc în registrul T2
Indicați UAL-ului să execute operația și puneți rezultatul în T1
(6p) Decodificați restul instrucțiunilor.
Resurse