Virtuální procesor 2: Porovnání verzí
Bez shrnutí editace |
Bez shrnutí editace |
||
Řádek 6: | Řádek 6: | ||
* Velikost paměťové buňky: dynamické celé číslo |
* Velikost paměťové buňky: dynamické celé číslo |
||
* Sdílená paměť kódu a dat |
* Sdílená paměť kódu a dat |
||
Značení parametrů instrukcí |
|||
*Pn - číslo parametru (parameter) |
|||
*En - entita (entity) |
|||
*An - oblast (area) |
|||
Virtuální paměťové oblasti |
Virtuální paměťové oblasti |
||
Řádek 19: | Řádek 13: | ||
| 0 || M || Operační paměť |
| 0 || M || Operační paměť |
||
|- |
|- |
||
| 1 || |
| 1 || || I/O brány |
||
|- |
|- |
||
| 2 || R || Uživatelské registry |
| 2 || R || Uživatelské registry |
||
Řádek 30: | Řádek 24: | ||
Systémové registry (oblast 3) |
Systémové registry (oblast 3) |
||
{| class="wikitable" |
{| class="wikitable" |
||
! Index !! Význam |
! Index !! Název !! Význam |
||
|- |
|- |
||
| 0 || Program Counter (PC) || Čítač aktuální pozice programu. Zápisem do něj lze provádět skoky a čtením z něj lze uchovávat návratovou hodnotu nebo získat pozici v programu pro čtení konstantních dat. |
|||
| 0 || Program Counter (PC) |
|||
|- |
|||
| 1 || Interrupt Vector Table (IVT) || Počátek tabulky přerušení v paměti. |
|||
|- |
|||
| 2 || Interrupt enabled (IE) || Příznak, který se automaticky zakáže při vstupu do přerušení. Možno ručně povolit v průběhu přerušení nebo nutno zpět povolit při návratu z přerušení. |
|||
|} |
|} |
||
Řádek 66: | Řádek 64: | ||
| 11 || SKIP n || Skip Next Instruction || Přeskočí vykonání další instrukce pokud hodnota parametru je nulová |
| 11 || SKIP n || Skip Next Instruction || Přeskočí vykonání další instrukce pokud hodnota parametru je nulová |
||
|} |
|} |
||
* Inkrement a dekrement |
|||
INC n: |
|||
ADD n nebo ADD n, 1 |
|||
DEC n: |
|||
SUB n nebo SUB n, 1 |
|||
* Porovnáno (compare) CMP p1, p2 |
|||
CP TEMP, p1 |
|||
SUB TEMP, p2 |
|||
SIGN TEMP |
|||
SKIP n |
|||
JUMP n |
|||
JUMP n |
|||
* Bitové operace |
* Bitové operace |
||
Řádek 71: | Řádek 84: | ||
Posuny lze provádět v rámci hodnot buněk přímo pomocí operací DIV, MUL mocnin 2. |
Posuny lze provádět v rámci hodnot buněk přímo pomocí operací DIV, MUL mocnin 2. |
||
Případně převést buňku na více menších dle bitových hodnot a provádět posuny přes více buněk. |
Případně převést buňku na více menších dle bitových hodnot a provádět posuny přes více buněk. |
||
* Instrukce skoků |
* Instrukce skoků |
||
Jsou realizovány pomocí přímé kopie do registru PC. |
Jsou realizovány pomocí přímé kopie do registru PC. |
||
Absolutní skok: CP 0^S, LABEL |
Absolutní skok: CP 0^S, LABEL |
||
Relativní skok: ADD 0^S, $ - LABEL |
Relativní skok: ADD 0^S, $ - LABEL |
||
* Zásobníkové operace |
* Zásobníkové operace |
||
Pro účely registru SP(Stack Pointer) lze zvolit kterýkoliv uživatelský registr např. (SP = 16^R) |
Pro účely registru SP(Stack Pointer) lze zvolit kterýkoliv uživatelský registr např. (SP = 16^R) |
||
Řádek 85: | Řádek 100: | ||
CP n, SP^M |
CP n, SP^M |
||
* Vstupně/výstupní přístup |
|||
Operace OUT port, n: |
|||
CP port^I, n |
|||
Operace IN n, port: |
|||
CP n, port^I |
|||
* Podprogramy |
|||
Operace CALL n: |
|||
CP SP^M, PC |
|||
ADD SP^M, +x |
|||
SUB SP |
|||
Operace RET: |
|||
ADD SP |
|||
CP PC, SP^M |
|||
* Přerušení |
|||
Pozice tabulky vektorů přerušení je dána registrem IVT ukazujícím do operační paměti. |
|||
Přerušení lze softwarově vyvolat pomocí instrukce INT n. Náhradní kód by vypadal zhruba takto: |
|||
CP 0^R, IVT |
|||
ADD 0^R, n |
|||
CP PC, 0^R^M |
|||
* Prohození hodnot (exchange) |
|||
Nutno realizovat pomocí dočasného registru. |
|||
XCHG p1, p2: |
|||
PUSH TEMP |
|||
CP TEMP, p1 |
|||
CP p1, p2 |
|||
CP p2, TEMP |
|||
POP TEMP |
|||
* Desetinná čísla |
|||
Nutno realizovat pomocí knihovny |
|||
[[Kategorie:Programování]] |
[[Kategorie:Programování]] |
Verze z 20. 12. 2014, 21:14
Cílem je navrhnout abstraktní virtuální počítač, který by bylo možné jednoduše implementovat v dostupných jazycích a assemblerech. Důležitý prvek návrhu je použití abstraktních dynamických čísel bez horního omezení. Návrh by měl využívat principů lokality a relativních pozic, aby byly používány především malé číselné hodnoty. Samotná implementace může používat pro menší stroje pevnou velikost buňky a registrů jako např. 32-bit integer a může při požadavcích na větší čísla vyhlásit chybu. Nebo může pro větší čísla použít dynamickou paměťovou reprezentaci čísel pomocí různých implementací typu BigInteger.
- Adresa paměti: dynamické celá čísla
- Velikost paměťové buňky: dynamické celé číslo
- Sdílená paměť kódu a dat
Virtuální paměťové oblasti
Index | Zkratka | Význam |
---|---|---|
0 | M | Operační paměť |
1 | I/O brány | |
2 | R | Uživatelské registry |
3 | S | Systémové registry |
4 | P | Paměť programu (pokud je oddělená od operační) |
Systémové registry (oblast 3)
Index | Název | Význam |
---|---|---|
0 | Program Counter (PC) | Čítač aktuální pozice programu. Zápisem do něj lze provádět skoky a čtením z něj lze uchovávat návratovou hodnotu nebo získat pozici v programu pro čtení konstantních dat. |
1 | Interrupt Vector Table (IVT) | Počátek tabulky přerušení v paměti. |
2 | Interrupt enabled (IE) | Příznak, který se automaticky zakáže při vstupu do přerušení. Možno ručně povolit v průběhu přerušení nebo nutno zpět povolit při návratu z přerušení. |
Mikroinstrukce
Symboly [] značí nepovinné parametry
Kód | Zkatka | Název | Význam |
---|---|---|---|
0 | NOP | No Operation | Žádná operace |
1 | HALT | Program halt | Zastaví vykonávání programu |
2 | CP p0, p1 | Copy | Kopíruje data ze zdrojové buňky do cílové p0 <= p1 |
3 | ADD p0, [p1, [p2]] | Addition | Součet. Varianty: p0 <= p0 + 1, p0 <= p0 + p1, p0 <= p2 + p1 |
4 | SUB p0, [p1, [p2]] | Substraction | Odečet. Varianty: p0 <= p0 - 1, p0 <= p0 - p1, p0 <= p2 - p1 |
5 | MUL p0, p1, [p2] | Multiplication | Násobení. Varianty: p0 <= p0 * p1, p0 <= p2 * p1 |
6 | DIV p0, p1, [p2], [p3] | Division | Dělení se zbytkem. Varianty: p0 <= p0 / p1, p0 <= p2 / p1, p0 p3(zbytek) <= p0 / p1, p0 p3(zbytek) <= p2 / p1 |
7 | PCLR | Parameters Clear | Nuluje přednastavení všech parametrů, vybírá první parametr. |
8 | PSEL n | Parameter Select | Vybírá aktivní parametr |
9 | PSET n | Parameter Set | Nastavuje hodnotu vybraného parametru |
10 | PIND n | Parameter Indirection | Nastavuje parametr jako ukazatel do oblasti. Při opakovaném použití se cílová hodnota použije jako adresa do další paměti. |
11 | SKIP n | Skip Next Instruction | Přeskočí vykonání další instrukce pokud hodnota parametru je nulová |
- Inkrement a dekrement
INC n: ADD n nebo ADD n, 1
DEC n: SUB n nebo SUB n, 1
- Porovnáno (compare) CMP p1, p2
CP TEMP, p1 SUB TEMP, p2 SIGN TEMP SKIP n JUMP n JUMP n
- Bitové operace
Nejsou přímo podporovány díky dynamické povaze paměťových buněk. Posuny lze provádět v rámci hodnot buněk přímo pomocí operací DIV, MUL mocnin 2. Případně převést buňku na více menších dle bitových hodnot a provádět posuny přes více buněk.
- Instrukce skoků
Jsou realizovány pomocí přímé kopie do registru PC. Absolutní skok: CP 0^S, LABEL Relativní skok: ADD 0^S, $ - LABEL
- Zásobníkové operace
Pro účely registru SP(Stack Pointer) lze zvolit kterýkoliv uživatelský registr např. (SP = 16^R) Operace PUSH n: CP SP^M, n SUB SP
Operace POP n: ADD SP CP n, SP^M
- Vstupně/výstupní přístup
Operace OUT port, n: CP port^I, n
Operace IN n, port: CP n, port^I
- Podprogramy
Operace CALL n: CP SP^M, PC ADD SP^M, +x SUB SP
Operace RET: ADD SP CP PC, SP^M
- Přerušení
Pozice tabulky vektorů přerušení je dána registrem IVT ukazujícím do operační paměti. Přerušení lze softwarově vyvolat pomocí instrukce INT n. Náhradní kód by vypadal zhruba takto: CP 0^R, IVT ADD 0^R, n CP PC, 0^R^M
- Prohození hodnot (exchange)
Nutno realizovat pomocí dočasného registru. XCHG p1, p2: PUSH TEMP CP TEMP, p1 CP p1, p2 CP p2, TEMP POP TEMP
- Desetinná čísla
Nutno realizovat pomocí knihovny