Virtuální procesor

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

Koncept

  • Je použit lineárně adresovatelný paměťový prostor, každý buňka je velikosti Bajt
  • U všech operací, kde je to žádoucí, jsou podporovány blokové operace
  • Instrukce mají až dva parametry a každý z nich může být definován jako blok (adresa + délka) nebo hodnota
  • U každého bloku může být definováno zda inkrementovat vzestupně nebo sestupně

Adresování

  • n - konstanta n
  • (n) - proměnná, hodnota na adrese n. lze použít jako registry v paměti
  • ((n)) - proměnný ukazatel na proměnnou, hodnota na adrese určené hodnotou na adrese n

Registry

  • PC (Program Counter) - určuje aktuální pozici vykonávané instrukce. Automaticky se inkrementuje vzestupně.
  • SP (Stack Pointer) - Ukazatel vrcholu zásobníku. Je využíván zásobníkovými instrukcemi.
  • C (Carry) - pomocný bitový příznak určuje přetečení rozsahu poslední operace
  • Z (Zero) - pomocný bitový příznak určuje zda výsledek poslední operace byl nulový

Instrukční sada

  • Aritmetické
    • ADD DEST, OP1, OP2
    • SUB DEST, OP1, OP2
    • MUL DEST, OP1, OP2
    • DIV DEST, OP1, OP2
    • MOD DEST, OP1, OP2
  • Logické
  • Bitové
    • SHL DEST, SOURCE
    • SHR DEST, SOURCE
    • OR DEST, OP1, OP2
    • AND DEST, OP1, OP2
    • XOR DEST, OP1, OP2
  • Řízení běhu
    • NOP - žádná operace
    • JP ADDR
    • JR ADDR
  • Zásobník

registr SP

    • PUSH SOURCE - vloží data na zásobník
    • POP DEST - načte data ze zásobníku
    • CALL
    • RET
  • Přesuny
    • COPY DEST, SOURCE - kopíruje data
    • EX OP1, OP2 - vymění data
    • CMP OP1, OP2 - porovnání bloků
  • Vnější zařízení
    • IN PORT, DEST - načte data ze vstupu
    • OUT PORT, SOURCE - zapíše data na výstup

Příklady

Kód Popis
COPY (DEST), (SOURCE) Kopie bajtu z adresy SOURCE na DEST
COPY (DEST), 0 Nastavení bajtu na adrese SOURCE na hodnotu 0
COPY ((DEST)), 0 Nastavení bajtu na adrese SOURCE na hodnotu 0
COPY (DEST):10, (SOURCE):10 Kopie bloku 10 bajtů vzestupně
COPY (DEST):10-, (SOURCE):10- Kopie bloku 10 bajtů sestupně.
COPY (DEST):10+, (SOURCE):10- Kopie bloku 10 bajtů s převrácením pořadí
COPY (DEST):10, (SOURCE):2 Kopie bloku 2 bajtů do bloku 10 bajtů, blok 2 bajtů se opakuje
COPY (DEST):10, 1 Nastavení bloku 10 bajtů na hodnotu 1
COPY 0, 1 Kopírování dat do konstanty nic neprovede
ADD (DEST):10, 1 Přičtení hodnoty 1 do jednotlivých bajtů v bloku 10 bajtů
ADD (DEST):10, 1:10 Přičtení hodnoty 1 do prvního bajtu v cílovém bloku
SHR (DEST):10, (SOURCE):10 Bitový posun bloku SOURCE doprava a zápis výsledku do bloku DEST

Inspirace

Inspirováno instrukční sadou CPU Z80 a blokovými instrukcemi LDIR, LDDR, INIR, INDR, OTID, OTDR, CPIR, CPDR. Tyto instrukce umožňovaly efektivnější vykonávání blokových operací.

Například instrukci LDIR lze zapsat jako:

LOOP:  LDI
       DEC  BC
       JR   NC, LOOP

nebo

LOOP:  LD   A, (HL)
       LD   (DE), A
       INC  HL
       INC  DE
       DEC  BC
       JR   NC, LOOP

Tento systém lze rozšířit mimo LD, IN, OUT, CP i na další instrukce jako AND, OR, XOR, EX, SHL, SHR, INC, DEC, ADD, SUB, aj.

Na příkladu instrukcí LDIR, LDDR lze pozorovat možné úpravy:

  • Zdroj může být také konstantní hodnota což lze použít jako instrukci SET
  • Lze parametricky měnit směr inkrementace/dekrementace zdroje a cíle. Pak mohou vzniknout čtyři kombinace:
    • SOURCE+ DEST+: přímá kopie, nutno použít při posunu překrývajícího se bloku směrem nahoru
    • SOURCE+ DEST-: převrácená kopie, nelze použít pro převrácení překrývajícího se bloku
    • SOURCE- DEST+: převrácená kopie, nelze použít pro převrácení překrývajícího se bloku
    • SOURCE- DEST-: přímá kopie, nutno použít při posunu překrývajícího se bloku směrem dolů
  • Incrementaci/dekrementaci lze nahradit přičtením/odečtením a tedy umožnit větší krok než 1
  • Pokud umožníme zdroji a cíli odlišné délky, pak mohou nastat tři kombinace
    • SOURCE > DEST: ze zdroje se zkopíruje jen část odpovídající délce cíle
    • SOURCE = DEST: cílový blok je přesnou kopií zdrojového
    • SOURCE < DEST: zdrojový blok je do cílového zkopírován vícekrát za sebou