Domácí práce z X36JPO

Letní semestr 2005

 

Jméno a příjmení:         Jaromír Nusl

Skupina:                      Po 11:00

Datum vypracování:     1.5.2005

Ročník:                        2.

1) Zadání úlohy č. 28

Rotujte obsah registrů S a D vlevo  o počet pozic určených 16 bitovým přímým operandem. Obsah W nesmí být instrukcí změněn.

2) Popis instrukce pro programátora

Instrukce : SDRL numb

Význam názvu : S D rotation left

Operační znak : 04h

Vstupy : numb je 16-ti bitový přímý operand

Výstupy po provedení instrukce :

- obsah registru W nezměněn
- registry S a D jsou posunuty o numb pozic vlevo
- PC = PC + 3
- 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 nižší část operandu z paměti a uloží se do registru L (jakmile je operand větší než 16 rotace se opakuje proto by stačily jen 4 nejnižší bity). 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. Obsah D se poté uložen zpět a provede se totéž s registrem S a provede se L-- . 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 - 0Fh (0 - 15d) - 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 ECPC , 0 , 0 ,                               
; ulozeni pocet rotaci do registru L, PC++

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 UCF , 15 , 0 ,                                               
; W = W+W+Cin

      ECW UCF, 8 , 0 ,                                                            ; W+Cin

      OEW PED , 0 , 0 ,                                               ; D = W : ulozeni D

      OES ECW , 2 , 0 ,                                               ; W = S
      ECF ECW UCF , 15 , 0 ,                                               
; W = W+W+Cin

      ECW UCF, 8 , 0 ,                                                            ; W+Cin

      OEW PES ECL , 0 , 0 , NEXTROT     ; S = W : ulozeni S, dekrementace L a skok na test L

            Zdroják .mas

           


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ý 16-bitovým operandem. Do registru W je možno vložit libovolné číslo, které po skončení instrukce bude obnoveno.

a) SDRL 10

Speciální případ, kdy dochází k rotaci 16x (obsah se nezmění)

Registr

Před

Po

PC

0

3

W

1212

1212

S

0F0F

0F0F

D

F0F0

F0F0

L

0

0

b) SDRL 08

Registr

Před

Po

PC

0

3

W

1212

1212

S

1234

3412

D

4321

2143

L

0

0

c) SDRL 1

Registr

Před

Po

PC

0

3

W

1212

1212

S

0F0F

1E1E

D

F0F0

E1E1

L

0

0

 


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 = 5 + WAIT
Tc = 9 * numb
Td = 1

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

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

Tmin = 9+ WAIT

8) Závěr

Při psaní kódu, bych docela ocenil lepší simulační program (alespoň s editací .mas), jinak jsem s programováním instrukce neměl vetší problém. U této instrukce je zbytečný 16-bitový operand, protože by stačil 4-bitový. Horních 8-bitů ani nečítám a dolní by šli ještě zamaskovat na 4-bity nejnižší.

Laboratorní úloha

nuslj2_blaskj1.zip