Virtuální procesor 2: Porovnání verzí

Z ZděchovNET
Skočit na navigaci Skočit na vyhledávání
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 || I || I/O brány
| 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