Virtuální procesor 2: Porovnání verzí
Bez shrnutí editace |
Bez shrnutí editace |
||
(Není zobrazeno 5 mezilehlých verzí od stejného uživatele.) | |||
Řádek 1: | Řádek 1: | ||
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. |
|||
Cílem je navrhnout obecnou minimalistickou instrukční sadu, ve které by byly obsaženy jen základní instrukce a pokročilejší instrukce by byly složeny se základních. Složené instrukce by měly být nějakým způsobem standardizovány, aby mohly být jak implementovány pomocí základních instrukcí, tak realizovány pomocí optimalizovaného kódu samotným virtuálním počítačem. |
|||
* Adresa paměti: dynamické celá čísla |
* Adresa paměti: dynamické celá čísla |
||
* 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 |
||
{| class="wikitable" |
{| class="wikitable" |
||
! Index !! Zkratka !! Význam |
! Index !! Zkratka !! Název !! Význam |
||
|- |
|- |
||
| 0 || M || |
| 0 || M || Memory || Obecná operační paměť s náhodným přístupem |
||
|- |
|- |
||
| 1 || I || |
| 1 || I || Interface || V/V brány vnějších zařízení |
||
|- |
|- |
||
| 2 || R || Uživatelské registry |
| 2 || R || Registers || Uživatelské registry |
||
|- |
|- |
||
| 3 || S || Systémové registry |
| 3 || S || System egisters || Systémové registry řízené virtuálním počítačem |
||
|- |
|- |
||
| 4 || P || Paměť programu (pokud je oddělená od operační) |
| 4 || P || Program Memory || Paměť programu pouze pro čtení (pokud je oddělená od operační paměti) |
||
|} |
|} |
||
V/V brány (oblast 1) |
|||
{| class="wikitable" |
|||
! Index !! Název !! Význam |
|||
|- |
|||
| 0 || Console Output || Výstup na sériový terminál |
|||
|- |
|||
| 1 || Keyboard Input || Vstup z klávesnice ze sériového terminálu |
|||
|} |
|||
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. |
|||
|- |
|||
| 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í. |
|||
| 0 || Program Counter (PC) |
|||
|} |
|} |
||
Řádek 36: | Řádek 49: | ||
{| class="wikitable" |
{| class="wikitable" |
||
! |
! Kód !! Zkatka !! Název !! Význam |
||
|- |
|- |
||
| NOP || No Operation || Žádná operace |
| 0 || NOP || No Operation || Žádná operace |
||
|- |
|- |
||
| HALT || Program halt || Zastaví vykonávání programu |
| 1 || HALT || Program halt || Zastaví vykonávání programu |
||
|- |
|- |
||
| CP p0, p1 || Copy || Kopíruje data ze zdrojové buňky do cílové p0 <= p1 |
| 2 || CP p0, p1 || Copy || Kopíruje data ze zdrojové buňky do cílové p0 <= p1 |
||
|- |
|- |
||
| ADD p0, [p1, [p2]] || Addition || Součet. Varianty: p0 <= p0 + 1, p0 <= p0 + p1, p0 <= p2 + p1 |
| 3 || ADD p0, [p1, [p2]] || Addition || Součet. Varianty: p0 <= p0 + 1, p0 <= p0 + p1, p0 <= p2 + p1 |
||
|- |
|- |
||
| SUB p0, [p1, [p2]] || |
| 4 || SUB p0, [p1, [p2]] || Substraction || Odečet. Varianty: p0 <= p0 - 1, p0 <= p0 - p1, p0 <= p2 - p1 |
||
|- |
|- |
||
| MUL p0, p1, [p2] || Multiplication || Násobení. Varianty: p0 <= p0 * p1, p0 <= p2 * p1 |
| 5 || MUL p0, p1, [p2] || Multiplication || Násobení. Varianty: p0 <= p0 * p1, p0 <= p2 * p1 |
||
|- |
|- |
||
| 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 |
| 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 |
||
|- |
|- |
||
| PCLR || Parameters Clear || Nuluje přednastavení všech parametrů, vybírá první parametr. |
| 7 || PCLR || Parameters Clear || Nuluje přednastavení všech parametrů, vybírá první parametr. |
||
|- |
|- |
||
| PSEL n || Parameter Select || Vybírá aktivní parametr |
| 8 || PSEL n || Parameter Select || Vybírá aktivní parametr |
||
|- |
|- |
||
| PSET n || Parameter Set || Nastavuje hodnotu vybraného parametru |
| 9 || PSET n || Parameter Set || Nastavuje hodnotu vybraného parametru |
||
|- |
|- |
||
| 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. |
| 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. |
||
|- |
|- |
||
| 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á |
||
|- |
|||
| 12 || SIGN p1, p2 || Sign || Pokud je znaménko p2 záporné, tak vrací 1. Pokud je kladné tak vrací 0. |
|||
|} |
|} |
||
* Inkrement a dekrement |
|||
INC n: |
|||
<pre>ADD n nebo ADD n, 1 |
|||
</pre> |
|||
DEC n: |
|||
<pre>SUB n nebo SUB n, 1 |
|||
</pre> |
|||
* Porovnání (compare) CMP p1, p2 |
|||
<pre> |
|||
CP TEMP, p1 |
|||
SUB TEMP, p2 |
|||
SIGN TEMP |
|||
SKIP n |
|||
</pre> |
|||
* Bitové operace |
* Bitové operace |
||
Řádek 67: | Řádek 99: | ||
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) |
||
Operace PUSH n: |
Operace PUSH n: |
||
CP SP^M, n |
<pre>CP SP^M, n |
||
SUB SP |
SUB SP |
||
</pre> |
|||
Operace POP n: |
Operace POP n: |
||
ADD SP |
<pre>ADD SP |
||
CP n, SP^M |
CP n, SP^M |
||
</pre> |
|||
* Vstupně/výstupní přístup |
|||
Operace OUT port, n: |
|||
<pre>CP port^I, n |
|||
</pre> |
|||
Operace IN n, port: |
|||
<pre>CP n, port^I |
|||
</pre> |
|||
* Podprogramy |
|||
Operace CALL n: |
|||
<pre>CP SP^M, PC |
|||
ADD SP^M, +x |
|||
SUB SP |
|||
</pre> |
|||
Operace RET: |
|||
<pre>ADD SP |
|||
CP PC, SP^M |
|||
</pre> |
|||
* 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: |
|||
<pre>CP 0^R, IVT |
|||
ADD 0^R, n |
|||
CP PC, 0^R^M |
|||
</pre> |
|||
* Prohození hodnot (exchange) |
|||
Nutno realizovat pomocí dočasného registru. |
|||
<pre>XCHG p1, p2: |
|||
PUSH TEMP |
|||
CP TEMP, p1 |
|||
CP p1, p2 |
|||
CP p2, TEMP |
|||
POP TEMP |
|||
</pre> |
|||
* Desetinná čísla |
|||
Nutno realizovat pomocí knihovny |
|||
[[Kategorie:Programování]] |
[[Kategorie:Programování]] |
Aktuální verze z 20. 12. 2014, 21:38
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. Cílem je navrhnout obecnou minimalistickou instrukční sadu, ve které by byly obsaženy jen základní instrukce a pokročilejší instrukce by byly složeny se základních. Složené instrukce by měly být nějakým způsobem standardizovány, aby mohly být jak implementovány pomocí základních instrukcí, tak realizovány pomocí optimalizovaného kódu samotným virtuálním počítačem.
- 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 | Název | Význam |
---|---|---|---|
0 | M | Memory | Obecná operační paměť s náhodným přístupem |
1 | I | Interface | V/V brány vnějších zařízení |
2 | R | Registers | Uživatelské registry |
3 | S | System egisters | Systémové registry řízené virtuálním počítačem |
4 | P | Program Memory | Paměť programu pouze pro čtení (pokud je oddělená od operační paměti) |
V/V brány (oblast 1)
Index | Název | Význam |
---|---|---|
0 | Console Output | Výstup na sériový terminál |
1 | Keyboard Input | Vstup z klávesnice ze sériového terminálu |
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á |
12 | SIGN p1, p2 | Sign | Pokud je znaménko p2 záporné, tak vrací 1. Pokud je kladné tak vrací 0. |
- Inkrement a dekrement
INC n:
ADD n nebo ADD n, 1
DEC n:
SUB n nebo SUB n, 1
- Porovnání (compare) CMP p1, p2
CP TEMP, p1 SUB TEMP, p2 SIGN TEMP SKIP 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