Virtuální procesor 2

Z ZděchovNET
Skočit na navigaci Skočit na vyhledávání

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á
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á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