Virtualní procesor 4: Porovnání verzí
Skočit na navigaci
Skočit na vyhledávání
(Založena nová stránka: * Index registru: číslo kódované jako 4-bit dynamické, 0 - R0, 1 - R1, 2 - R2, 3 - R3 * Šířka registru: číslo kódované jako 4-bit dynamické, 0 - 8-bit, 1 - …) |
Bez shrnutí editace |
||
(Nejsou zobrazeny 4 mezilehlé verze od stejného uživatele.) | |||
Řádek 1: | Řádek 1: | ||
=Motivace= |
|||
* Index registru: číslo kódované jako 4-bit dynamické, 0 - R0, 1 - R1, 2 - R2, 3 - R3 |
|||
* Šířka registru: číslo kódované jako 4-bit dynamické, 0 - 8-bit, 1 - 16-bit, 2 - 32-bit, 3 - 64-bit, 4 - 128-bit, ... |
|||
* Obecná instrukční sada, aby mohl jeden program běžet na mnoha různých procesorech a systémech. |
|||
* Instrukční sada podporující rovnocenně různé datové šířky. Aby pro malé hodnoty se použil jen nejmenší vhodný typ a ne největší nativní. (např. procenta = bajt) Cílem je umožnit efektivní překlad a běh na starších 8-bit a 16-bit počítačích, ale také na novějších 128-bit nebo 256-bit. |
|||
* Instrukční sada by měla být jednoduchá a co nejmenší, aby bylo možné snadno sestavit interpretr a překladač. |
|||
=Datové typy= |
|||
* Datové typy |
|||
** Logická (bitová) hodnota |
|||
** Celé číslo |
|||
** Záporné číslo ? |
|||
** Desetinné číslo ? |
|||
=Instrukční sada= |
|||
Rx - registr, kódováno pomocí indexu a šířky |
Rx - registr, kódováno pomocí indexu a šířky |
||
* Index registru: číslo kódované jako 4-bit dynamické, 0 - konstanta, 1 - R1, 2 - R2, 3 - R3, 4 - R4, 5 - R5, 6 - R6, 7 - R7, ... |
|||
{| class="wikitable" |
|||
* Šířka registru: číslo kódované jako 4-bit dynamické, 0 - 1-bit, 1 - 8-bit, 2 - 16-bit, 3 - 32-bit, 4 - 64-bit, 5 - 128-bit, 6 - 256-bit, 7 - 512-bit, ... |
|||
! Název !! Zápis !! Poznámka |
|||
{| class="wikitable sortable" |
|||
! Index !! Název !! Zápis !! Poznámka |
|||
|- |
|- |
||
| |
| 0 || No operation || NOP || |
||
|- |
|- |
||
| |
| 1 || Halt || HALT || |
||
|- |
|- |
||
| |
| 2 || Clear || CLR Rx || |
||
|- |
|- |
||
| |
| 3 || Copy || COPY Rx, Ry || |
||
|- |
|- |
||
| |
| 4 || Load from memory || LDM Rx, [Ry] || |
||
|- |
|- |
||
| |
| 5 || Store to memory || STM [Rx], Ry || |
||
|- |
|- |
||
| |
| 6 || Load from indexed memory || LDMI Rx, [Ry + Rz] || |
||
|- |
|- |
||
| |
| 7 || Store to indexed memory || STMI [Rx + Ry], Rz || |
||
|- |
|- |
||
| |
| 8 || Load system register || LDS Rx, Sx || |
||
|- |
|- |
||
| |
| 9 || Store system register || STS Sx, Rx || |
||
|- |
|||
| 10 || Exchange || XCHG Rx, Ry || při různých šířkách? |
|||
|- |
|||
| 11 || Input || IN Rx, [Ry] || |
|||
|- |
|||
| 12 || Output || OUT [Rx], Ry || |
|||
|- |
|||
| 13 || Xor || XOR Rx, Ry || |
|||
|- |
|||
| 14 || And || AND Rx, Ry || |
|||
|- |
|||
| 15 || Or || OR Rx, Ry || |
|||
|- |
|- |
||
| 16 || Not || NOT Rx || Negace všech bitů podobně jako XOR Rx, $ffff |
|||
| Or || OR Rx, Ry || |
|||
|- |
|- |
||
| |
| 17 || Increment || INC Rx || |
||
|- |
|- |
||
| |
| 18 || Decrement || DEC Rx || |
||
|- |
|- |
||
| |
| 19 || Jump || JP Rx || |
||
|- |
|- |
||
| Jump || |
| 20 || Jump if not zero || JPNZ Rx, Ry || |
||
|- |
|- |
||
| |
| 21 || Jump relative || JR Rx || |
||
|- |
|- |
||
| 22 || Jump relative if not zero || JRNZ Rx, Ry || |
|||
| Return from subroutine || RET || |
|||
|- |
|- |
||
| |
| 23 || Call subroutine || CALL Rx || |
||
|- |
|- |
||
| |
| 24 || Call subroutine if not zero || CALLNZ Rx, Ry || |
||
|- |
|||
| 25 || Call subroutine relative || CALLR Rx || |
|||
|- |
|||
| 26 || Call subroutine relative if not zero || CALLRNZ flag,Rx || |
|||
|- |
|||
| 27 || Return from subroutine || RET || |
|||
|- |
|||
| 28 || Return from subroutine if not zero || RETNZ Rx || |
|||
|- |
|||
| 29 || Push to stack || PUSH Rx || |
|||
|- |
|||
| 30 || Pop from stack || POP Rx || |
|||
|- |
|||
| 31 || Addition || ADD Rx, Ry || |
|||
|- |
|||
| 32 || Addition with carry || ADDC Rx, Ry, Rz || Bit z Rz se přičte a nastaví se do něj carry výsledku |
|||
|- |
|||
| 33 || Substraction || SUB Rx, Ry || |
|||
|- |
|||
| 34 || Substraction with carry || SUBC Rx, Ry, Rz || Bit z Rz se přičte a nastaví se do něj carry výsledku |
|||
|- |
|||
| 35 || Multiplication || MUL Rx, Ry || |
|||
|- |
|||
| 36 || Division || DIV Rx, Ry || |
|||
|- |
|||
| 37 || Shift left || SHL Rx, Ry || |
|||
|- |
|||
| 38 || Shift right || SHR Rx, Ry || |
|||
|- |
|||
| 39 || Set bit || SET Rx, Ry || Jako: OR Rx, (1 shl Ry) |
|||
|- |
|||
| 40 || Reset bit || RES Rx, Ry || Jako: AND Rx, not (1 shl Ry) |
|||
|- |
|||
| 41 || Test bit || BIT Rx, Rx, Ry || |
|||
|- |
|||
| 42 || Assign bit || ASB Rx, Ry, Rx || |
|||
|- |
|||
| 43 || Enable interrupt || EI || |
|||
|- |
|||
| 44 || Disable interrupt || DI || |
|||
|- |
|||
| 45 || Interrupt || INT Rx || |
|||
|- |
|||
| 46 || Rotate left || RL Rx, Ry || |
|||
|- |
|||
| 47 || Rotate right || RR Rx, Ry || |
|||
|- |
|||
| 48 || Input indexed || IN Rx, [Ry + Rz] || |
|||
|- |
|||
| 49 || Output indexed || OUT [Rx + Ry], Rz || |
|||
|} |
|} |
||
=Systémové registry= |
|||
{| class="wikitable sortable" |
|||
! Index !! Název !! Zkratka !! Význam !! Výchozí hodnota |
|||
|- |
|||
| 0 || Instruction Pointer || IP || Aktuální pozice v programu, roste nahoru || 0 |
|||
|- |
|||
| 1 || Stack Pointer || SP || Vrchol zásobníku, roste dolů || 0 |
|||
|- |
|||
| 2 || Interrupt Vector || IV || Počátek tabulky vektorů přerušení || 0 |
|||
|- |
|||
| 3 || Interrupt Vector Item Size || IVS || Velikost položky v tabulce přerušení || 8 |
|||
|} |
|||
=Tabulka přerušení= |
|||
{| class="wikitable sortable" |
|||
! Index !! Název !! Význam |
|||
|- |
|||
| 0 || Reset || Také první start procesoru |
|||
|- |
|||
| 1 || Neplatná instrukce || |
|||
|} |
|||
=I/O porty= |
|||
Kategorie zařízení |
|||
{| class="wikitable sortable" |
|||
! Index !! Zařízení !! Význam |
|||
|- |
|||
| 0 || Mapování || |
|||
|- |
|||
| 1 || Procesor || |
|||
|- |
|||
| 2 || Klávesnice || |
|||
|- |
|||
| 3 || Myš || |
|||
|- |
|||
| 4 || Obrazovka || |
|||
|- |
|||
| 5 || Sériová linka || |
|||
|- |
|||
| 6 || Zvukový generátor || |
|||
|- |
|||
| 7 || Pevný disk || |
|||
|} |
|||
Funkce zařízení: |
|||
{| class="wikitable sortable" |
|||
! Kategorie !! Index !! Název !! Význam |
|||
|- |
|||
| Mapování || 1 || Mapper.GetDeviceAreaStart || zjistit počáteční port zařízení |
|||
|- |
|||
| Mapování || 2 || Mapper.GetDeviceAreaSize || zjistit počet funkcí |
|||
|- |
|||
| Mapování || 3 || Mapper.GetDeviceCount || zjistit počet zařízení |
|||
|- |
|||
| Mapování || 4 || Mapper.IsConnected || zjistit stav připojení |
|||
|- |
|||
| Mapování || 5 || Mapper.GetDeviceCategory || zjistit kategorii zařízení |
|||
|- |
|||
| Mapování || 6 || Mapper.GetDeviceIndex || zjistit index zařízení pokud je více stejné kategorie |
|||
|- |
|||
| Procesor || 1 || CPU.GetCoreCount || zjistit počet jader |
|||
|- |
|||
| Procesor || 2 || CPU.GetFreq || zjistit kmitočet |
|||
|- |
|||
| Klávesnice || 1 || Keyboard.ReadKey || Přečíst klávesu z bufferu |
|||
|- |
|||
| Myš || 1 || Mouse.GetPosX || Přečíst pozici X myši |
|||
|- |
|||
| Myš || 2 || Mouse.GetPosY || Přečíst pozici Y myši |
|||
|- |
|||
| Myš || 3 || Mouse.GetButtonState || Přečíst stav tlačítek |
|||
|- |
|||
| Obrazovka || 1 || Screen.GetSizeX || Přečíst počet pixelů X |
|||
|- |
|||
| Obrazovka || 2 || Screen.GetSizeY || Přečíst počet pixelů Y |
|||
|- |
|||
| Obrazovka || 3 || Screen.GetColorDepth || Přečíst hloubku barev |
|||
|- |
|||
| Obrazovka || 4 || Screen.SetColorDepth || Nastavit hloubku barev |
|||
|} |
|||
=Problémy= |
|||
* Minimum nutných instrukcí? |
|||
* Rozšiřující instrukce pro urychlení - operaci lze provést pomocí základními |
|||
* více paměťových oblastí (více datových, oddělená programová) |
|||
* chráněný režim, úrovně oprávnění |
|||
* virtuální paměť, stránkování |
|||
[[Kategorie:Programování]] |
[[Kategorie:Programování]] |
Aktuální verze z 23. 1. 2016, 15:45
Motivace
- Obecná instrukční sada, aby mohl jeden program běžet na mnoha různých procesorech a systémech.
- Instrukční sada podporující rovnocenně různé datové šířky. Aby pro malé hodnoty se použil jen nejmenší vhodný typ a ne největší nativní. (např. procenta = bajt) Cílem je umožnit efektivní překlad a běh na starších 8-bit a 16-bit počítačích, ale také na novějších 128-bit nebo 256-bit.
- Instrukční sada by měla být jednoduchá a co nejmenší, aby bylo možné snadno sestavit interpretr a překladač.
Datové typy
- Datové typy
- Logická (bitová) hodnota
- Celé číslo
- Záporné číslo ?
- Desetinné číslo ?
Instrukční sada
Rx - registr, kódováno pomocí indexu a šířky
- Index registru: číslo kódované jako 4-bit dynamické, 0 - konstanta, 1 - R1, 2 - R2, 3 - R3, 4 - R4, 5 - R5, 6 - R6, 7 - R7, ...
- Šířka registru: číslo kódované jako 4-bit dynamické, 0 - 1-bit, 1 - 8-bit, 2 - 16-bit, 3 - 32-bit, 4 - 64-bit, 5 - 128-bit, 6 - 256-bit, 7 - 512-bit, ...
Index | Název | Zápis | Poznámka |
---|---|---|---|
0 | No operation | NOP | |
1 | Halt | HALT | |
2 | Clear | CLR Rx | |
3 | Copy | COPY Rx, Ry | |
4 | Load from memory | LDM Rx, [Ry] | |
5 | Store to memory | STM [Rx], Ry | |
6 | Load from indexed memory | LDMI Rx, [Ry + Rz] | |
7 | Store to indexed memory | STMI [Rx + Ry], Rz | |
8 | Load system register | LDS Rx, Sx | |
9 | Store system register | STS Sx, Rx | |
10 | Exchange | XCHG Rx, Ry | při různých šířkách? |
11 | Input | IN Rx, [Ry] | |
12 | Output | OUT [Rx], Ry | |
13 | Xor | XOR Rx, Ry | |
14 | And | AND Rx, Ry | |
15 | Or | OR Rx, Ry | |
16 | Not | NOT Rx | Negace všech bitů podobně jako XOR Rx, $ffff |
17 | Increment | INC Rx | |
18 | Decrement | DEC Rx | |
19 | Jump | JP Rx | |
20 | Jump if not zero | JPNZ Rx, Ry | |
21 | Jump relative | JR Rx | |
22 | Jump relative if not zero | JRNZ Rx, Ry | |
23 | Call subroutine | CALL Rx | |
24 | Call subroutine if not zero | CALLNZ Rx, Ry | |
25 | Call subroutine relative | CALLR Rx | |
26 | Call subroutine relative if not zero | CALLRNZ flag,Rx | |
27 | Return from subroutine | RET | |
28 | Return from subroutine if not zero | RETNZ Rx | |
29 | Push to stack | PUSH Rx | |
30 | Pop from stack | POP Rx | |
31 | Addition | ADD Rx, Ry | |
32 | Addition with carry | ADDC Rx, Ry, Rz | Bit z Rz se přičte a nastaví se do něj carry výsledku |
33 | Substraction | SUB Rx, Ry | |
34 | Substraction with carry | SUBC Rx, Ry, Rz | Bit z Rz se přičte a nastaví se do něj carry výsledku |
35 | Multiplication | MUL Rx, Ry | |
36 | Division | DIV Rx, Ry | |
37 | Shift left | SHL Rx, Ry | |
38 | Shift right | SHR Rx, Ry | |
39 | Set bit | SET Rx, Ry | Jako: OR Rx, (1 shl Ry) |
40 | Reset bit | RES Rx, Ry | Jako: AND Rx, not (1 shl Ry) |
41 | Test bit | BIT Rx, Rx, Ry | |
42 | Assign bit | ASB Rx, Ry, Rx | |
43 | Enable interrupt | EI | |
44 | Disable interrupt | DI | |
45 | Interrupt | INT Rx | |
46 | Rotate left | RL Rx, Ry | |
47 | Rotate right | RR Rx, Ry | |
48 | Input indexed | IN Rx, [Ry + Rz] | |
49 | Output indexed | OUT [Rx + Ry], Rz |
Systémové registry
Index | Název | Zkratka | Význam | Výchozí hodnota |
---|---|---|---|---|
0 | Instruction Pointer | IP | Aktuální pozice v programu, roste nahoru | 0 |
1 | Stack Pointer | SP | Vrchol zásobníku, roste dolů | 0 |
2 | Interrupt Vector | IV | Počátek tabulky vektorů přerušení | 0 |
3 | Interrupt Vector Item Size | IVS | Velikost položky v tabulce přerušení | 8 |
Tabulka přerušení
Index | Název | Význam |
---|---|---|
0 | Reset | Také první start procesoru |
1 | Neplatná instrukce |
I/O porty
Kategorie zařízení
Index | Zařízení | Význam |
---|---|---|
0 | Mapování | |
1 | Procesor | |
2 | Klávesnice | |
3 | Myš | |
4 | Obrazovka | |
5 | Sériová linka | |
6 | Zvukový generátor | |
7 | Pevný disk |
Funkce zařízení:
Kategorie | Index | Název | Význam |
---|---|---|---|
Mapování | 1 | Mapper.GetDeviceAreaStart | zjistit počáteční port zařízení |
Mapování | 2 | Mapper.GetDeviceAreaSize | zjistit počet funkcí |
Mapování | 3 | Mapper.GetDeviceCount | zjistit počet zařízení |
Mapování | 4 | Mapper.IsConnected | zjistit stav připojení |
Mapování | 5 | Mapper.GetDeviceCategory | zjistit kategorii zařízení |
Mapování | 6 | Mapper.GetDeviceIndex | zjistit index zařízení pokud je více stejné kategorie |
Procesor | 1 | CPU.GetCoreCount | zjistit počet jader |
Procesor | 2 | CPU.GetFreq | zjistit kmitočet |
Klávesnice | 1 | Keyboard.ReadKey | Přečíst klávesu z bufferu |
Myš | 1 | Mouse.GetPosX | Přečíst pozici X myši |
Myš | 2 | Mouse.GetPosY | Přečíst pozici Y myši |
Myš | 3 | Mouse.GetButtonState | Přečíst stav tlačítek |
Obrazovka | 1 | Screen.GetSizeX | Přečíst počet pixelů X |
Obrazovka | 2 | Screen.GetSizeY | Přečíst počet pixelů Y |
Obrazovka | 3 | Screen.GetColorDepth | Přečíst hloubku barev |
Obrazovka | 4 | Screen.SetColorDepth | Nastavit hloubku barev |
Problémy
- Minimum nutných instrukcí?
- Rozšiřující instrukce pro urychlení - operaci lze provést pomocí základními
- více paměťových oblastí (více datových, oddělená programová)
- chráněný režim, úrovně oprávnění
- virtuální paměť, stránkování