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
;----------------------------------------------------------- ROTRD: { NEXTROT: , 0 , 14 , ;
if L > 0 jump to NEXTROT ECW UCF, 8 , 0
, ;
W+Cin OEW
PED , 0 , 0 , ;
D = W : ulozeni D OES ECW ,
2 , 0 , ;
W = S ECW UCF, 8 , 0 ,
;
W+Cin OEW
PES ECL , 0 , 0 , NEXTROT ; S = W :
ulozeni S, dekrementace L a skok na test L |
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žší.