Reali mašina - tai fizinė skaičiavimo mašina, turinti techninės įrangos komponentus, tokius kaip: procesorių, operatyviąją atmintį, kietajį diską, duomenų perdavimo magistrales bei įvedimo/išvedimo įrenginius. Tai objektas, skirtas palaikyti virtualias mašinas, bei atlikti jų užduotus skaičiavimus. Realias mašinas lengva modifikuoti bei pritaikyti pagal norus, ir kad palaikytų reikiamas virtualias mašinas.
Virtuali mašina yra realios mašinos analogas. Virtualioje Mašinoje sudedami reikalingiausi komponentai, tokie kaip atmintis, procesorius, įvedimo/išvedimo įrenginiai, bei supaprastinama naudotojo sąsaja. Sudėtingos ir nepatogios sąsajos virtualioje mašinoje yra aprašomos supaprastintai, taip yra palengvinamas pats programavimo procesas. Taip pat Virtuali Mašina realizuoja realios mašinos komandas paprastesniu, lengviau suprantamu būdu interpretuojant virtualios mašinos komandas kaip realios mašinos komandas ar jų rinkiniu. Be to Virtuali Mašina pateikia supaprastintą atminties adresavimą. Visa tai leidžia pasiekti realią mašiną ir virtualios mašinos mašininiu kodu parašytą programą sėkmingai įvykdyti realioje mašinoje.
Atmintis yra suskirstyta i blokus (puslapius, takelius). Kiekvieną bloką sudaro 16 žodžių, kiekvieną žodį - 4 baitai.
Realios mašinos atmintis (RAM) padalinta į vartotojo ir supervizorinę atmintį. Vartotojo atmintyje saugomos vykdomos programos, ja dalijasi virtualios mašinos, o supervizorinėje atmintyje saugomi sisteminiai kintamieji. Visa RM atmintis yra 66 puslapiai - 64 puslapiai vartotojo atminčiai, 2 puslapiai supervizorinei atminčiai.
Virtualią atmintį sudaro 16 blokų, taigi vienu metu realia atmintimi gali dalintis bent 4 virtualios mašinos.
Išorinė atmintis yra realizuojama failu.
Visos komandos, nedirbančios su išoriniais įrenginiais, užima 1 taktą.
-
LRxy
Load to R word at address xyNukopijuoja atmintyje esantį žodį virtualiu adresu xy į R. Čia R - vienas iš registrų A, B, C, D. Adresas yra šešioliktainis skaičius iš dviejų skaitmenų, x nurodo virtualios atminties puslapio numerį, y nurodo ląstelės tame puslapyje numerį. Naudojantis puslapiavimo mechanizmu, xy paverčiamas į realų adresą, kuriame esantis žodis nukopijuojamas į registrą R.
-
SRxy
Save word in R to memory at address xyIšsaugo žodį registre R į atmintį adresu xy. Čia R - vienas iš registrų A, B, C, D. Adresas yra šešioliktainis skaičius iš dviejų skaitmenų, x nurodo virtualios atminties puslapio numerį, y nurodo ląstelės tame puslapyje numerį. Naudojantis puslapiavimo mechanizmu, xy paverčiamas į realų adresą, į kurį nukopijuojamas registre R esantis žodis.
-
PTOR
copy word in P To RNukopijuoja žodį registre P į registrą R. Čia P ir R skirtingi registrai iš A, B, C, D. Jie negali būti tokie patys, neleidžiama nukopijuoti to paties registro reikšmę į tą patį registrą.
-
XCPR
exchange words in P and RSukeičia registruose P ir R esančius žodžius vietomis. Čia P ir R skirtingi registrai iš A, B, C, D. Jie negali būti tokie patys, neleidžiama sukeisti to paties registro reikšmės vietomis.
Visos aritmetinės ir loginės komandos, išskyrus COMP
, išsaugo rezultatą registre A. Unarinės komandos operuoja su žodžiais registre A, binarinės komandos operuoja su žodžiais registruose A ir B. Taip pat visos aritmetinės ir loginės komandos, išskyrus DIV
, MOD
ir NOT
formuoja požymių registro reikšmę.
-
ADD
A = A + BPožymiai:
ZF = 1
, jei suma lygi 0, kitu atvejuZF = 0
;CF = 1
, jei suma peržengia žodžio (4 baitų) ribas, kitu atvejuCF = 0
;OF = 1
, jei dvieju žodžių, kurių vyriausias bitas yra 0, sumos vyriausias bitas tampa 1 arba jei dviejų žodžių, kurių vyriausias bitas yra 1, sumos vyriausias bitas yra 0. Kitu atvejuOF = 0
-
SUB
A = A - BPožymiai:
ZF = 1
, jei skirtumas lygus 0, kitu atvejuZF = 0
;CF = 1
, jei atimama didesnį skaičių iš mažesnio, kitu arvejuCF = 0
.
-
COMP
Compare A and BPalygina du skaičius registruose A ir B: vykdo
SUB
, bet rezultato neišsaugo, tik keičia požymių registrą. -
INC
A = A + 1Vykdo
ADD
, kur B lygus 1. -
DEC
A = A - 1Vykdo
SUB
, kur B lygus 1. -
MUL
A = A * BPožymiai:
ZF = 1
, jei B arba A lygūs 0, kitu atvejuZF = 0
;CF = 1
, jei sandauga peržengia žodžio (4 baitų) ribas, kitu atvejuCF = 0
.
-
DIV
A = A / BRezultatas - sveikoji skaičiaus dalis. Požymių registras nekeičiamas. Jei bandoma dalinti iš 0, fiksuojama klaida, kurios kodas 2.
-
MOD
A = A % BPožymių registras nekeičiamas. Jei bandoma dalinti iš 0, fiksuojama klaida, kurios kodas 2.
-
AND
,OR
,XOR
A = A AND B
A = A | B
A = A ^ B
Požymiai:
ZF = 1
, jei rezultatas 0, kitu atvejuZF = 0
;CF = 0
;OF = 0
.
-
NOT
*A = ~ APožymių registro nekeičia.
-
LSHF
A = A << BNulinis postūmis nekeičia požymių registro. Kitu atveju:
ZF = 1
, jei rezultatas lygus 0, kitu atvejuZF = 0
;CF
lygus paskutiniam išstumtam bitui;OF = 1
, jei C lygus 1 ir išstumtas bitas nelygus kairiausiam bitui po operacijos.
-
RSHF
A = A >> BNulinis postūmis nekeičia požymių registro. Kitu atveju:
ZF = 1
, jei rezultatas lygus 0, kitu atvejuZF = 0
;CF
lygus paskutiniam dešiniausiam išstumtam bitui;OF
lygus kairiausiam bitui prieš bitų postumį, jei C lygus 1.
Valdymo perdavimo komandos perduoda valdymą, t.y. adresą xy registre C priskiria registrui IC. Adresas virtualus yra komandos (žodžio) indeksas reliatyvus kodo segmentui. x nurodo puslapio indeksą, y nurodo ląstelės tame puslapyje indeksą. Jei adresas užeina už virtualios atminties ribų, fiksuojama klaida, kurios kodas 1 (bad address).
-
JUMP
Besąlygiškai perduoda valdymą.
-
JE
Jump if EqualPerduoda valdymą, jei
ZF = 1
. -
JNE
Jump if Not EqualPerduoda valdymą, jei
ZF = 0
. -
JG
Jump if GreaterPerduoda valdymą, jei
ZF = 0
irCF = 0
. -
JGE
Jump if Greater or EqualPerduoda valdymą, jei
CF = 0
. -
JL
Jump if LowerPerduoda valdymą, jei
CF = 1
. -
JLE
Jump if Lower or EqualPerduoda valdymą, jei
ZF = 1
irCF = 1
.
Darbui su simbolių eilutėmis, adresai turi būti smulkesni. Adresai naudojami simbolių eilutėms yra skaičiai, nurodantys baito indeksą kokiame nors žodyje, kokiame nors bloke, duomenų segmente. Kadangi žodis yra 4 baitai, simbolių eilučių adresai yra 4 kartotiniai.
Po komandos vykdymo:
- Jeigu
DF = 0
, adresai padidinami vienetu; - Jeigu
DF = 1
, adresai sumažinami vienetu.
Jei adresas užeina už duomenų segmentų ribų, fiksuojama klaida, kurios kodas 1 (bad address).
-
FWD
Forward directionPriskiria
DF
požymiui reikšmę 0. -
BKWD
Backwards directionPriskiria
DF
požymiui reikšmę 1. -
LODS
Load StringNukopijuoja simbolių eilutės simbolį atmintyje į registrą.
Reikalavimai:
- D adresas į simbolį duomenų segmente.
Rezultatai:
- A simbolis. Išsaugotas kaip registro jauniausias baitas.
-
STOS
Store StringIšsaugo simbolį registre į simbolio vietą atmintyje. Simbolis yra laikomas jauniausias baitas registre.
Reikalavimai:
- A simbolio reikšmė;
- D adresas į simbolį duomenų segmente.
-
CMPS
Compare StringsPalygina du simbolius atmintyje ir keičia požymių registrą. Požymiai tokie patys kaip
COMP
komandos.Reikalavimai:
- A pirmojo simbolio duomenų segmente adresas;
- B antrojo simbolio duomenų segmente adresas.
-
MOVS
Move StringNukopijuoja vieną simbolį atmintyje į kito baito atmintyje vietą.
Reikalavimai:
- A pirmojo simbolio duomenų segmente adresas;
- B antrojo simbolio duomenų segmente adresas.
Šios komandos kartoja tam tikrą operaciją n kartų. Skaičius n turi būti nurodytas registre C. Kiekvieną taktą atliekami šie veiksmai:
- Tikrinamas žodis registre C. Jei C reikšmė lygi 0, sustojama, t.y. vykdoma kita komanda;
- Kitu atveju vykdoma operacija;
- Registro C reikšmė sumažinama vienetu ir vėl vykdomas 1 žingsnis.
-
LOOP
Besąlygiškai perduoda valdymą komandai.
Reikalavimai:
- D komandos adresas, kuriai bus perduotas valdymas. Adreso požymiai tokie patys kaip
JUMP
komandų adresams.
- D komandos adresas, kuriai bus perduotas valdymas. Adreso požymiai tokie patys kaip
-
REP
Repeat string notKartoja komandą darbui su simbolio eilutėmis. Po šios komandos iš karto rašoma arba
STOS
, arbaCMPS
, arbaMOVS
.
Komandos darbui su failais užima 3 taktus.
-
OPEN
Open fileAtidaro failą. Laikoma, kad atidarius failą, galima jį ir skaityti, ir rašyti, nereikia nurodyti papildomo požymio. Jei failas neegzistuoja, fiksuojama klaida, kurios kodas 6 (no such file).
Reikalavimai:
- A failo pavadinimo (simbolių eilutės) adresas atmintyje.
Rezultatai:
- D atidaryto failo deskriptorius.
-
READ
Read fileSkaito iš failo. Jei failas nebuvo atidarytas, fiksuojama klaida, kurios kodas 7 (file not open).
Reikalavimai:
- D failo deskriptorius;
- A simbolių eilutės, į kurią bus rašoma, adresas atmintyje;
- C simbolių eilutės, į kurią bus rašoma, ilgis.
Rezultatai:
- C perskaitytų simbolių skaičius.
-
WRTE
Write fileRašo į failą. Jei failas nebuvo atidarytas, fiksuojama klaida, kurios kodas 7 (file not open).
Reikalavimai:
- D failo deskriptorius;
- A simbolių eilutės, kuri bus rašoma, adresas atmintyje;
- C simbolių eilutės, kuri bus rašoma, ilgis.
-
CLOS
Close fileUždaro failą. Jei failas nebuvo atidarytas, fiksuojama klaida, kurios kodas 7 (file not open).
Reikalavimai:
- D failo deskriptorius.
-
DSTR
Destroy fileSunaikina failą. Jei toks failas neegzistuoja, fiksuojama klaida, kurios kodas 6 (no such file).
Reikalavimai:
- A failo pavadinimo (simbolių eilutės) adresas atmintyje.
-
WTOS
Word To StringKonvertuoja skaičių į simbolių eilutę.
Reikalavimai:
- A skaičius konvertavimui;
- D simbolių eilutės adresas, į kurią bus rašoma.
Rezultatai:
- C simbolių eilutės ilgis.
-
STOW
String To WordKonvertuoja simbolių eilutę į skaičių.
Reikalavimai:
- A simbolių eilutės adresas;
- C simbolių eilutės ilgis.
Rezultatai:
- A konvertuotas skaičius
-
DRAW
Nupiešia tašką ekrane.
Registras SI įgauna reikšmę 5 ir iš vartotojo režimo pereinama į supervizorinį. Supervizoriniame režime piešiamas taškas. Ši operacija užima 2 taktus.
Reikalavimai:
- A x koordinatė - stulpelio numeris terminale;
- B y koordinatė - eilutės numeris terminale;
- D RGB reikšmė. R, G ir B komponentės užima po vieną baitą, t.y. tai skaičiai nuo 0 iki 255 (imtinai). Jauniausias registro D baitas yra komponentė B, antras pagal jaunumą yra G, trečias - R. Vyriausias baitas nenaudojamas.
-
HALT
Nutraukia programos vykdymą.
Registrui SI priskiria reikšmę 6 - stabdyti programą. Iš vartotojo režimo pereinama į supervizorinį, kuriame programa sustabdoma.