Semestrální práce z předmětu Jednotky počítače

Autor: Jan Skalický (skalij2@fel, st.sk 41)
cvičení X36JPO, úterý 14:30 (léto 2005/2006)
datum poslední aktualizace: 30.04.2006, 22:33

Prohlášení o autorství:
Zde předkládanou práci jsem vytvořil samostatně s využitím informačních zdrojů uvedených v závěru práce


Změna uložení big-endian na little-endian (47)

  1. Zadání

    Operand, jehož délka ve slovech (1 slovo = 16b = 2B) je uložena v registru L, jehož počáteční adresa je uložena v registru D a který je uložen v paměti způsobem "big-endian" uložte jako "little-endian".


  2. Popis instrukce pro programátora


  3. Popis algoritmu instrukce



  4. Výpis mikroprogramu (změněné části)

    RRCJSW:		{
    		ECW CFS1 ECF, 1 , 0 , INTCHECK		; IR=10010000	instrukce RRC
    			    , 0 , 0 , INTCHECK		; IR=10010001	nedef.		
    		OED PES ECW , 2 , 0 , BEL		; IR=10010010 	BEL prvni krok (S=W=D)
    		OEPC ECOUTWR ECSP, 0 , 0 , JSW		; IR=10010011	realizace instrukce JSW
    		}
    
    
    BEL:		OEL ECW ECF, 10, , 		; W = D+L  (preteceni pres okraj pameti nevadi)
    		OEL ECW ECF, 10, , 		; W = D+2L (preteceni pres okraj pameti nevadi)
    		OEW PED ECF, 0, , 		; v D je pointer na konec operandu, v S na zacatek, CF = 0; ZF = 1
    
    BEL_TEST:	, , 14, BEL_TESTED				; L == 0 ?
    BEL_TESTED:	{
    		ECD UDD OES OEAB, , , BEL_LOOP1			; D-- a predstih pro cteni [S]
    		, , , INTCHECK					; konec cyklu
    		}
    BEL_LOOP1:	{
    		OES OEAB ECINL MRD, 0, 10, BEL_LOOP1 		; DINL = [S]
    		OEINZE PET, , , 				; T = (byte)DINL
    		}
    		OED OEAB, , , BEL_LOOP2 			; predstih pro cteni [D]
    BEL_LOOP2:	{
    		OED OEAB ECINL MRD UCF, 0, 10, BEL_LOOP2 	; DINL = [D] a UCF => CZM pro kumulaci ZF
    		OET ECF UCF, 2, , 				; kumulace ZF pro T (byte ze zacatku)
    		}
    		OEINZE ECF ECW, 2, ,				; kumulace ZF pro DIN (byte z konce), zruseni CZM
    
    		OEINZE ECOUTWR, , , 				; DOUT = DIN (pro zapis konce na zacatek)
    		OES OEAB OEWR, , , BEL_LOOP3			; predstih pro zapis [S]
    BEL_LOOP3:	{
    		OES OEAB OEWR MWR, 0, 10 , BEL_LOOP3		; zapis [S]
    		OES OEAB OEWR, , ,				; presah pro zapis [S]
    		}
    		OET ECOUTWR, , , 				; DOUT = T (pro zapis zacatku na konec)
    		OED OEAB OEWR, , , BEL_LOOP4			; predstih pro zapis [D]
    BEL_LOOP4:	{
    		OED OEAB OEWR MWR, 0, 10 , BEL_LOOP4		; zapis [D]
    		OED OEAB OEWR ECS ECL , , , BEL_TEST		; presah pro zapis [D]; S++, L--
    		}
        
  5. Výsledky ladění

    Testovální instrukce bylo provoedeno v programu SIMDOP (Simulator vyukoveho procesoru DOP-v3) Verze 3.2 (zari 2004). Každý z testů pracuje s jinou délkou operandu, včetně testu s L=0 (příznak nuly se v této situaci nastaví, protože neexistuje byte operandu, který by nebyl nulový). Jsou zde rovněž zachyceny případy, kdy jsou všechny byty operandu nulové (instrukce nastaví ZF) a nechybí ani test zachycující situaci, kdy programátor zadal délku operandu větší než zbývající prostor v paměti a při zpracování přejde instrukce přes okraj paměti.

    1. operand délky 4B
      VSTUP:
           PC: 0000     L: 02     CF:0     RAM: 000A:  78
           SP: 0000     F: 00     ZF:0          000B:  56
            S: 0000               OF:0          000C:  34
            D: 000A               SF:0          000D:  12
            W: 0000    DO: 0000   AF:0
            U: 0000   DIL: 00     IF:0
            T: 0000   DIH: 00
      
      VÝSTUP::
           PC: 0001     L: 00     CF:0     RAM: 000A:  12
           SP: 0000     F: 00     ZF:0          000B:  34
            S: 000C               OF:0          000C:  56
            D: 000C               SF:0          000D:  78
            W: 0034    DO: 0056   AF:0
            U: 0000   DIL: 34     IF:0
            T: 0056   DIH: 00
            
    2. operand délky 2B, roven 0
      VSTUP:
           PC: 0000     L: 01     CF:0     RAM: 0100:  00
           SP: 0000     F: 00     ZF:0          0101:  00
            S: 0000               OF:0
            D: 0100               SF:0
            W: 0000    DO: 000    AF:0
            U: 0000   DIL: 00     IF:0
            T: 0000   DIH: 00
      
      VÝSTUP::
           PC: 0001     L: 00     CF:0     RAM: 0100:  00
           SP: 0000     F: 02     ZF:1          0101:  00
            S: 0101               OF:0
            D: 0101               SF:0
            W: 0000    DO: 0000   AF:0
            U: 0000   DIL: 00     IF:0
            T: 0000   DIH: 00
            
    3. operand délky 6B, přetečení přes okraj
      VSTUP:
           PC: 0000     L: 03     CF:0     RAM: 0000:  92
           SP: 0000     F: 00     ZF:0          0001:  92 
            S: 0000               OF:0          ....
            D: FFFC               SF:0          FFFC:  FC
            W: 0000    DO: 0000   AF:0          FFFD:  FD
            U: 0000   DIL: 00     IF:0          FFFE:  FE
            T: 0000   DIH: 00                   FFFF:  FF
      
      VÝSTUP:
           PC: 0001     L: 00     CF:0     RAM: 0000:  FD
           SP: 0000     F: 00     ZF:0          0001:  FC
            S: FFFF               OF:0          ....
            D: FFFF               SF:0          FFFC:  92
            W: 00FF    DO: 00FE   AF:0          FFFD:  92
            U: 0000   DIL: FF     IF:0          FFFE:  FF
            T: 00FE   DIH: 00                   FFFF:  FE
            
    4. operand nulové délky
      VSTUP:
           PC: 0000     L: 00     CF:0     RAM: 0000:  92
           SP: 0000     F: 00     ZF:0
            S: 0000               OF:0
            D: 0000               SF:0
            W: 0000    DO: 0000   AF:0
            U: 0000   DIL: 00     IF:0
            T: 0000   DIH: 00
       
      VÝSTUP:
           PC: 0001     L: 00     CF:0     RAM: 0000:  92
           SP: 0000     F: 02     ZF:1
            S: 0000               OF:0
            D: 0000               SF:0
            W: 0000    DO: 0000   AF:0
            U: 0000   DIL: 00     IF:0
            T: 0000   DIH: 00
            
  6. Kvantitativní charakteristiky

    V původním mikroprogramu byla jedna mikroinstrukce změněna (řádek 150 v revizi 3.0) - ta provádí konečnou fázi dekódování. Vlastní realizaci instrukce BEL zajištuje nových 20 mikroinstrukcí. Počet taktů provádění instrukce BEL závisí pouze na obsahu registru L (a zpoždění hlavní paměti). Dekódování spolu s kontrolou přerušení trvá 8 taktů (+ jedno zpoždění paměti) a inicializace instrukce má 3 takty. Následuje cyklus, jehož doba je 17 taktů a který je prováděn L-krát. Uvnitř něj se celkem 4x přistupuje k hlavní paměti. Detekce konce cyklu spolu s jeho opuštěním a ukončením provádění instrukce trvá další 2 takty. Minimální počet taktů se bude provádět instrukce v případě, že L (délka operandu) bude 0, maximální pro L = 255. Bude to:

    Tmin = 8 + 1*Twait + 3 + 2 = 13 + 1*Twait
    Tmax = 8 + 1*Twait + 3 + 255*(16 + 4*Twait) + 2 = 4093 + 1021*Twait
    Twait je počet dodatečných čekacích taktů při přístupu k paměti (Wait takty).


  7. Závěr

    Implementace instrukce pro převod uložení operandu big-endian na little-endian proběhla úspěšně. Považoval bych za užitečné, kdyby byl program SIMDOP vybaven funkcí pro vymazání (vynulování) obsahu hlavní paměti bez nutnosti načítat program znovu a tím smazat i obsah registrů procesoru.

Práci jsem vytvořil samostatně s využitím těchto informačních zdrojů:

Webová stránka podpory výuky: http://service.felk.cvut.cz/courses/X36JPO
Dokumentace procesoru DOP-v3 (Miloš Bečvář, FEL ČVUT)

© 2006 Jan Skalicky
cz (dot) skalda (at) seznam (dot) cz