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í