# Zápočtový test 22.1.2009 odpoledne

<{ForumPost(poster="Wideman", timestamp=2009-01-22 19:30:17)}>
Dnešní úkol, přestože jsem ho zvládl, mi nepřišel až tak lehkej. Měli jsme napsat interpret jakéhosi assembleru, přičemž nejdůležitější vlastnost byla, že umí paralelní zpracování cyklů. Každý program měl vlastní paměť a registry, které uchovávaly hodnoty typu int. V programu se dalo přistupovat k datům čtyřmi způsoby:

    123 - přímé použití konstanty
    rX - obsah registru s indexem X např. r2
    [X] - obsah paměti s indexem X
    [rX] - obsah paměti s indexem v rX

   
Dále jazyk uměl různé příkazy, které vždy něco udělaly a výsledek uložily do prvního operandu, takže na pozici prvního operandu nemohla být konstanta. Syntax byla "příkaz op1 op2", operandy mohly být zapsány jedním ze čtyř výše popsaných způsobů, a byly dány tyto příkazy:

    MOV - uložil obsah op2 do op1
    ADD - sečetl a výsledek uložil do op1
    SUB - odečetl
    MUL - vynásobil
    DIV - vydělil
    MOD - modulo
    NEG - pouze jeden operand, do něj uloží 1 pokud se op1 == 0, jinak do něj uloží 0
    PRINT - pouze jeden operand, vypíše jeho obsah na konzoli

Dále měl umět klasické cykly:

    SEQ op1 op2
        blok
        příkazů
        ...
    ENDSEQ - op2 znamená počet iterací (0..op2), do op1 se vždy na začátku provádění bloku příkazů uložilo aktuální číslo iterace

A to nejdůležitější byly paralelní cykly, kde se blok příkazů prováděl najednou v tolika vláknech kolik byla hodnota op2. Všechna vlákna sdílela paměť, ale registry mělo každé vlákno svoje - kopii registrů před spuštěním cyklu. Po skončení byla hodnota registrů opět jako před samotným cyklem.

    PAR op1 op2
        blok
        příkazů
        ...
    ENDPAR - význam operandů stejný

U obou cyklů pak platilo, že pokud na konci každé iterace byla hodnota op1 == 0 tak se po skončení cyklu do op1 (typicky to byl registr) uložila 0, jinak 1. Cykly do sebe mohly být vnořovány a to jak klasické, tak i paralelní. Pro ukázku vstupní soubor jednoduchého paralelního vypsání 1-100 vypadal takto:

    PAR r0 100
        PRINT r0
    ENDPAR

 a výstup byla čísla 0 až 100 mírně zpřeházená.  
Nevim jestli jsem to aspoň částečně dobře popsal, protože my jsme strávili popisováním zadání a otázkami skoro hodinu.
<{/ForumPost}>

<{ForumPost(poster="Him", timestamp=2009-01-31 15:27:44)}>
Zkoušel jsem si to: [http://martinvseticka.eu/index.php?sekc ... e&page=187](http://martinvseticka.eu/index.php?sekce=browse&page=187), ale není mi moc jasné to s tou hodnotou op1 v PAR, konkretne:   

 > U obou cyklů pak platilo, že pokud na konci každé iterace byla hodnota op1 == 0 tak se po skončení cyklu do op1 (typicky to byl registr) uložila 0, jinak 1.

Kdy toto může nastat?
<{/ForumPost}>

<{ForumPost(poster="seby", timestamp=2009-02-01 15:10:15)}>

 > Him wrote:Kdy toto může nastat?

Já to pochopil tak, že vnitřek cyklu může do op1 zapisovat a já po každém provedení jednoho průchodu cyklem musím zkontorlovat hodnotu op1 a na konci celého cyklu zkontrolovat, jestli byla hodnota op1 vždy 0. Pokud ano, tak tam uložím/nechám 0, pokud ne, tak tam uložím 1.
<{/ForumPost}>

<{ForumPost(poster="Him", timestamp=2009-02-01 15:15:51)}>
Seby: Diky, ten muj kod to tak dela taky, ale neni mi moc jasne, k cemu je to dobre.
<{/ForumPost}>

