Virtuální procesor: Porovnání verzí
Skočit na navigaci
Skočit na vyhledávání
Bez shrnutí editace |
(kategorie) |
||
(Nejsou zobrazeny 3 mezilehlé verze od stejného uživatele.) | |||
Řádek 5: | Řádek 5: | ||
* Instrukce mají až dva parametry a každý z nich může být definován jako blok (adresa + délka) nebo hodnota |
* 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ě |
* 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== |
==Instrukční sada== |
||
{| class="wikitable sortable" |
|||
* Aritmetické |
|||
! Kód !! Název !! Parametry !! Popis |
|||
** ADD DEST, OP1, OP2 |
|||
|- |
|||
** SUB DEST, OP1, OP2 |
|||
! colspan="4" | Aritmetické |
|||
** MUL DEST, OP1, OP2 |
|||
|- |
|||
** DIV DEST, OP1, OP2 |
|||
| 10 || ADD || DEST, OP1, OP2 || |
|||
|- |
|||
* Logické |
|||
| 1 || SUB || DEST, OP1, OP2 || |
|||
* Bitové |
|||
|- |
|||
** SHL DEST, SOURCE |
|||
| 2 || MUL || DEST, OP1, OP2 || |
|||
|- |
|||
** OR DEST, OP1, OP2 |
|||
| 3 || DIV || DEST, OP1, OP2 || |
|||
|- |
|||
** XOR DEST, OP1, OP2 |
|||
| 4 || MOD || DEST, OP1, OP2 || |
|||
* Řízení běhu |
|||
|- |
|||
** NOP - žádná operace |
|||
! colspan="4" | Logické |
|||
** JP ADDR |
|||
|- |
|||
** JR ADDR |
|||
! colspan="4" | Bitové |
|||
* Zásobník |
|||
|- |
|||
registr SP |
|||
| 5 || SHL || DEST, SOURCE || |
|||
** PUSH SOURCE - vloží data na zásobník |
|||
|- |
|||
** POP DEST - načte data ze zásobníku |
|||
| 6 || SHR || DEST, SOURCE || |
|||
** CALL |
|||
|- |
|||
** RET |
|||
| 7 || OR || DEST, OP1, OP2 || |
|||
* Přesuny |
|||
|- |
|||
** COPY DEST, SOURCE - kopíruje data |
|||
| 8 || AND || DEST, OP1, OP2 || |
|||
|- |
|||
** CMP OP1, OP2 - porovnání bloků |
|||
| 9 || XOR || DEST, OP1, OP2 || |
|||
** REV DEST, SOURCE - převrací pořadí bajtů v bloku |
|||
|- |
|||
* Vnější zařízení |
|||
! colspan="4" | Řízení běhu |
|||
** IN PORT, DEST - načte data ze vstupu |
|||
|- |
|||
** OUT PORT, SOURCE - zapíše data na výstup |
|||
| 0 || NOP || || žádná operace |
|||
|- |
|||
| 11 || JP || FLAG, ADDR || přímý skok |
|||
|- |
|||
| 12 || JR || FLAG, RELADDR || relativní skok |
|||
|- |
|||
! colspan="4" | Zásobník |
|||
|- |
|||
| 13 || PUSH || SOURCE || vloží data na zásobník |
|||
|- |
|||
| 14 || POP || DEST || načte data ze zásobníku |
|||
|- |
|||
| 15 || CALL || ADDR || uloží návratovou adresu na zásobník a skočí na zadanou adresu |
|||
|- |
|||
| 16 || RET || || návrat z podprogramu, zpětná adresa je načtena ze zásobníku |
|||
|- |
|||
! colspan="4" | Obecné |
|||
|- |
|||
| 17 || COPY || DEST, SOURCE || kopíruje data |
|||
|- |
|||
| 18 || EX || OP1, OP2 || prohodí data |
|||
|- |
|||
| 19 || CMP || OP1, OP2 || porovnání bloků |
|||
|- |
|||
! colspan="4" | Vnější zařízení |
|||
|- |
|||
| 20 || IN || PORT, DEST || načte data ze vstupu |
|||
|- |
|||
| 21 || OUT || PORT, SOURCE || zapíše data na výstup |
|||
|} |
|||
==Příklady== |
==Příklady== |
||
Řádek 45: | Řádek 88: | ||
! Kód !! Popis |
! Kód !! Popis |
||
|- |
|- |
||
| < |
| <code>COPY (DEST), (SOURCE)</code> || Kopie bajtu z adresy SOURCE na DEST |
||
|- |
|- |
||
| < |
| <code>COPY (DEST), 0</code> || Nastavení bajtu na adrese SOURCE na hodnotu 0 |
||
|- |
|- |
||
| < |
| <code>COPY ((DEST)), 0</code> || Nastavení bajtu na adrese SOURCE na hodnotu 0 |
||
|- |
|- |
||
| < |
| <code>COPY (DEST):10, (SOURCE):10</code> || Kopie bloku 10 bajtů vzestupně |
||
|- |
|- |
||
| < |
| <code>COPY (DEST):10-, (SOURCE):10-</code> || Kopie bloku 10 bajtů sestupně. |
||
|- |
|- |
||
| < |
| <code>COPY (DEST):10+, (SOURCE):10-</code> || Kopie bloku 10 bajtů s převrácením pořadí |
||
|- |
|||
| <code>COPY (DEST):10, (SOURCE):2</code> || Kopie bloku 2 bajtů do bloku 10 bajtů, blok 2 bajtů se opakuje |
|||
|- |
|||
| <code>COPY (DEST):10, 1</code> || Nastavení bloku 10 bajtů na hodnotu 1 |
|||
|- |
|||
| <code>COPY 0, 1</code> || Kopírování dat do konstanty nic neprovede |
|||
|- |
|||
| <code>ADD (DEST):10, 1</code> || Přičtení hodnoty 1 do jednotlivých bajtů v bloku 10 bajtů |
|||
|- |
|||
| <code>ADD (DEST):10, 1:10</code> || Přičtení hodnoty 1 do prvního bajtu v cílovém bloku |
|||
|- |
|||
| <code>SHR (DEST):10, (SOURCE):10</code> || Bitový posun bloku SOURCE doprava a zápis výsledku do bloku DEST |
|||
|} |
|} |
||
Řádek 80: | Řádek 135: | ||
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. |
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 |
|||
[[Kategorie:Programování]] |
Aktuální verze z 27. 6. 2012, 06:17
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
Kód | Název | Parametry | Popis |
---|---|---|---|
Aritmetické | |||
10 | ADD | DEST, OP1, OP2 | |
1 | SUB | DEST, OP1, OP2 | |
2 | MUL | DEST, OP1, OP2 | |
3 | DIV | DEST, OP1, OP2 | |
4 | MOD | DEST, OP1, OP2 | |
Logické | |||
Bitové | |||
5 | SHL | DEST, SOURCE | |
6 | SHR | DEST, SOURCE | |
7 | OR | DEST, OP1, OP2 | |
8 | AND | DEST, OP1, OP2 | |
9 | XOR | DEST, OP1, OP2 | |
Řízení běhu | |||
0 | NOP | žádná operace | |
11 | JP | FLAG, ADDR | přímý skok |
12 | JR | FLAG, RELADDR | relativní skok |
Zásobník | |||
13 | PUSH | SOURCE | vloží data na zásobník |
14 | POP | DEST | načte data ze zásobníku |
15 | CALL | ADDR | uloží návratovou adresu na zásobník a skočí na zadanou adresu |
16 | RET | návrat z podprogramu, zpětná adresa je načtena ze zásobníku | |
Obecné | |||
17 | COPY | DEST, SOURCE | kopíruje data |
18 | EX | OP1, OP2 | prohodí data |
19 | CMP | OP1, OP2 | porovnání bloků |
Vnější zařízení | |||
20 | IN | PORT, DEST | načte data ze vstupu |
21 | 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