Table of Contents

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:

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.

  1. Semnale către CP și AM: valoarea din CP e pusă pe magistrală și scrisă în AM;
  2. Semnale catre AM și memorie pentru a lua valoarea (codul instrucțiunii) de la adresa specificată de AM;
  3. Semnal către RI pentru a pune codul instrucțiunii în el
  4. Decodificare instrucțiune;
  5. Semnal către blocul de registre generale pentru a determina activarea conținutului lui RA pe magistrală;
  6. Semnal către T1 pentru a încărca valoarea aflată în acest moment pe magistrală;
  7. Semnal către blocul de registre generale pentru a determina activarea conținutului lui RB pe magistrală;
  8. Semnal către T2 pentru a încărca valoarea aflată în acest moment pe magistrală;
  9. Semnal către UAL ce indică operația ADC;
  10. Semnal către IND pentru ca UAL-ul să poată scrie flagurile;
  11. Semnal către blocul de registre generale pentru a încărca în RA valoarea de pe magistrală;
  12. 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:

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

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]
ADDopdst = opdst + opsrc 0101000
ADCopdst = opdst + opsrc + carry 0101001
SUBopdst = opdst - opsrc 0101010
SBBopdst = opdst - opsrc - carry 0101011
ANDopdst = opdst & opsrc 0101100
ORopdst = opdst | opsrc 0101101
XORopdst = opdst ^ opsrc 0101110
CMPopdst - opsrc, fără stocare rezultat, doar setare indicatori 0100010
TESTopdst & 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

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):
    • 1: REG = REG AND RM
  • [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.

  1. (4p) Decodificați instrucțiunea ADD regdst, regsrc.
    1. Identificați grupul de instrucțiuni în care se încadrează operația (ADD) și modul de adresare.
    2. Identificați operandul destinație.
    3. Transferați conținutul registrului regsrc în registrul T2
    4. Indicați UAL-ului să execute operația și puneți rezultatul în T1
      • Registrul IND trebuie conectat la UAL ca să poată fi setate flagurile în urma execuției operației
  2. (6p) Decodificați restul instrucțiunilor.

Resurse