Domácí práce z NLP
 
Jméno a příjmení: Jiří Formánek
Studijní skupina: 37
Datum vypracování: 10.11. 2003
Ročník: 3.

1) Zadání úlohy č. 32

Kruhový posuv 32-bitové hodnotu ve dvojici registrů S a D vlevo. Rotujte obsah registrů S a D vlevo o počet pozic určených 8-mi bitovým přímým operandem. Rotace se provede tak, že vysunuté bity registru S vstupují do registru D a naopak. Obsah W nesmí být změněn.

Operační znak: 04h

2) Popis instrukce pro programátora

Instrukce : SDRL numb

Význam názvu : S D rotation left

Operační znak : 04h

Vstupy : numb je 8-mi bitový přímý operand

Výstupy po provedení instrukce :

- obsah registru W nezměněn
- registry S a D jsou posunuty o numb pozic
- PC = PC + 2

- registr FLAG zůstává v nedefinovaném stavu
- L = 0

3) Popis algoritmu

Nejprve se provede záloha registru W do T. Dále se přečte operand z paměti a uloží se do registru L. V další části se provede vlastní rotace registru S a D v cyklu, dokud obsah registru L není roven 0. V cyklu se vždy nejprve zkopíruje D do W, dále se rotuje D o jednu pozici doleva a ukládá se bit W(15) = D(15), který vypadne z W do CF. Obsah D se poté uložen zpět a provede se totéž s registrem S, kde je zároveň nasunut bit CF do S(0). Tak jsou provedeny "přeskoky" bitů z registru D do S. Dále se uplatní bit, který vypadne při rotaci S. Tento bit je uložen přes CF do W a poté se provede logický součet na W a D. Tím se S(15) dostane na D(0), ale s D se již nehýbe (přeskok z S do D). Na závěr instrukce je obnoven registr W a skáče se na návěští INTCHECK.

4) Vývojový diagram

5) Výpis programu

;-----------------------------------------------------------
; REALIZACE INSTRUKCE: Kruhovy posuv pres registry S a D
; Registr W zustava neposkozen
; Rozsah parametru 0 - 20h (0 - 32d) - pak uz se to opakuje
;-----------------------------------------------------------

SDRL: OEW PET , 0 , 0 , ; zalohuj W do registru T

     
 ; nacti bajt z pameti a uloz do L
      OEPC OEAB, 0 , 0,
; nastaveni PC na AB
ROTRD: {
      OEPC OEAB MRD ECINL , 0 , 10, ROTRD
; cteni z pameti + WAIT
      ECPC , 0 , 0 ,
; cteni dokonceno, incrementace PC
      }
      OEINZE PEL , 0 , 0 ,
; ulozeni pocet rotaci do registru L

NEXTROT: , 0 , 14 , ; if L > 0 jump to NEXTROT
      , 0 , 0, ROTUJ ; podminka splnena -> pokracovani v rotaci
      OET ECW , 2 , 0 , INTCHECK ; podminka nesplnena -> obnov W a konec instrukce

ROTUJ: OED ECW , 2 , 0 , ; W = D
      ECF ECW , 15 , 0 , ; W += (W + CIN) - vysunuti prvniho bitu D na CY a ulozeni do CF, nasunuti CF na posledni bit S
      OEW PED , 0 , 0 , ; D = W : ulozeni D

      OES ECW UCF , 2 , 0 , ; W = S
      ECF ECW , 15 , 0 , ; W += (W + CIN) - vysunuti prvniho bitu S na CY a ulozeni do CF, nasunuti CF na posledni bit D
      OEW PES ECL UCF, 0 , 0 , ; S = W : ulozeni S, dekrementace L a skok zpet na test L

      ECW , 0 , 0 , ; nacteni CF do W
      OED ECW, 5, 0 ,
; 0001 OR D - uplatneni vysunuteho bitu S(15) na D(0)
      OEW PED , 0 , 0 , NEXTROT
; D = W - ulozeni D

6) Výsledky ladění

Před spuštěním je třeba do paměti vložit instrukční kód 04 následovaný 8-bitovým operandem. Do registru W je možno vložit libovolné číslo, které po skončení instrukce bude obnoveno.

a) SDRL 16

Registr Před Po
PC 0000 0002
W FFFF FFFF
S 1234 ABCD
D ABCD 1234
L X 0

Speciální případ, kdy dochází k prohození obou registrů.

b) SDRL 32

Registr Před Po
PC 0002 0004
W FFFF FFFF
S ABCD ABCD
D 1234 1234
L X 0

Opět se jedná o speciální příklad, kdy se vlastně nestane vůbec nic, protože oba registry se orotují o 32-bitů.

c) SDRL 1

Registr Před Po
PC 0004 0006
W FFFF FFFF
S ABCD 579A
D 1234 2469
L X 0

d) SDRL 2

Registr Před Po
PC 0006 0008
W FFFF FFFF
S 579A 5E68
D 2469 91A5
L X 0

e) SDRL 3

Registr Před Po
PC 0008 000A
W FFFF FFFF
S 5E68 F344
D 91A5 8D2A
L X 0

e) SDRL 10

Registr Před Po
PC 000A 000C
W FFFF FFFF
S F344 1234
D 8D2A ABCD
L X 0

Stav procesoru na začátku ladícího programu si můžete stáhnout zde. Balíček obsahuje soubor .mae, .mem a .sta. Po ukončení programu je stav procesoru vrácen do původního stavu (samozřejmě kromě registru PC). Soubor MAS s instrukcí SDRL lze stáhnout zde.

7) Odvození délky trvání instrukce

Instrukci můžeme rozdělit následovně:

a) dekódování
b) počáteční inicializace
c) vlastní provedení
d) konec instrukce

Body a), b) a c) jsou konstantní a bod c) je závislý na vstupním parametru. Celkový čas provedení instrukce je součtem času všech částí instrukce:

Ta = 3
Tb = 6 + WAIT
Tc = 10 * numb
Td = 1

T = Ta + Tb + Tc + Td = 3 + 4 + WAIT + 10 * numb + 1 = 10 + WAIT + 10 * numb

Instrukce bude vykonána za minimální dobu, pokud je vstupní parametr 0:

T = 10 + WAIT

8) Závěr

S úlohou nebyly větší potíže a docela mě to i bavilo. Měl bych snad připomínku k nepříliš přátelskému programu SIMDOP, který je pravděpodobně napsán v Pascalu. Myslím, že v dnešní době by šel snadno napsat mnohem přívětivější program na odladění instrukcí. Například mi chybělo kopírování obsahu paměti přímo v programu, rozpis registrů na bity apod.
Nejvíce jsem čerpal z dodané dokumentace k procesoru, ve které jsou velice užitečné a dobře napsané informace, ale někdy je problém se v tom zorientovat. Alespoň řádné popsání stránek by jistě neuškodilo. Dále musím podotknout, že kvalita seminárních cvičení byla výborná a většinu věcí jsem pochopil již tam, takže hrubý návrh instrukce jsem stvořil již ve 4. týdnu.
Mohu-li se ještě vyjádřit k písemné práci z procesoru DOP, musím říct, že byla lehká, ale je na ní příliš málo času, takže i člověk, který látce rozumí, nestihne zkontrolovat svou práci a může tak zbytečně ztratit body!