Program lahko naložimo na poljubno lokacijo v pomnilniku tako, da izberemo željeno celico pomnilnika, nato pa naložimo program. Program se naloži od izbrane celice naprej.
Simulator sam ne omogoča pisanje oz. spreminjanje programske kode, zato se programsko kodo piše s poljubnim drugim tekstovnim urejevalnikom (npr. Notepad). Primer programa lahko vidite na sliki.
Pri pisanju kode se je potrebno držati nekaterih pravil:
Prednost spletne različice je, da aplikacije ni potrebno nameščati, saj deluje v spletnem brskalniku. Dodatno omogoča urejanje programske kode v samem simulatorju in ima vgrajen seznam ukazov z osnovno razlago. Slabost je, da ne omogoča nalaganja programske kode na poljubno lokacijo in ne omogoča uporabe prekinitvenih točk (angl. "breakpoint").
Ob vsaki spremembi programa je potrebno tega ponovno naložiti v pomnilnik. Ena velja, če program izvedemo do konca in ga želimo ponovno izvesti. Program se vedno naloži na prvo lokacijo. Med izvajanjem programa je v statusni vrstici razložen trenutno označen ukaz. Poleg koračnega izvajanja omogoča samodejno izvedbo programa pri različnih hitrostih. Med samodejnim izvajanjem programa lahko izvajanje ustavimo in nadaljujemo s koračnim izvajanjem.
| Oznaka | Opis |
|---|---|
| IR | Ukazni register (Instruction Register) vsebuje ukaz, ki je pripravljen za izvajanje |
| PC | Programski števec (Program Counter) vsebuje naslov ukaza, ki je pripravljena za izvajanje |
| SP | Kazalec sklada (Stack Pointer) vsebuje naslov vrha sklada |
| AC | Akumulator oz. splošnonamenski register (tudi GPR - General Purpose Register) |
| MAR | Register naslovnega vodila (Memory Address Register) vsebuje naslov pomnilnika, iz katerega se bere ali piše |
| MBR | Register podatkovnega vodila (Memory Buffer Register) vsebuje vrednost, ki je prebrana ali se bo pisala v pomnilnik |
Seznam vseh ukazov:
| ADDD | ADDI | ADDL | |
| CALL | DESP | INSP | JNEG |
| JNZE | JPOS | JUMP | JZER |
| LOCO | LODD | LODI | LODL |
| POP | POPI | PSHI | PUSH |
| RETN | STOD | STOI | STOL |
| SUBD | SUBI | SUBL | SWAP |
Ukaze je mogoče razvrstiti v več skupin. Razvrstitev ukazov glede na tip operacije je naslednja:
| Branje* | LOCO | LODD | LODI | LODL | POP | POPI |
|---|---|---|---|---|---|---|
| Pisanje* | STOD | STOI | STOL | PSHI | PUSH | |
| Aritmetika | ADDD | ADDI | ADDL | SUBD | SUBI | SUBL |
| Skoki | JUMP | JPOS | JNEG | JZER | JNZE | |
| Drugo | CALL | RETN | DESP | INSP | SWAP |
* Branje je tukaj mišljeno kot prenos podatka iz pomnilnika/sklada/programa v akumulator, pisanje pa obratno.
Operacije branja, pisanja in aritmetike imajo več variant enakih ukazov, ki se razlikujejo glede na način naslavljanja. Ukazi se razlikujejo v zadnji črki mnemonika, ki je lahko:
Sešteje vrednost iz akumulatorja in vrednost iz pomnilnika, katero določa naslov v operandu izvor. Rezultat shrani v akumulator in v pomnilnik na naslov, ki je v operandu ponor.
Primer:
%Primer ukaza ADD
LOCO 2 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 3 %Shranimo novo vrednost v akumulator
ADD 8,9 %Sestejemo vrednosti iz akumulatorja in pomnilnika
Sešteje vrednost iz akumulatorja in vrednost iz pomnilnika, katero določa naslov v operandu izvor. Rezultat shrani v akumulator.
Primer:
%Primer ukaza ADDD
LOCO 3 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 2 %Shranimo novo vrednost v akumulator
ADDD 8 %Sestejemo vrednosti iz akumulatorja in pomnilnika
Iz pomnilnika prebere vrednost, katero določa naslov v operandu izvor. Prebrana vrednost postane novi naslov. Zatem sešteje vrednost iz akumulatorja in vrednost iz pomnilnika, katero določa novi naslov. Rezultat shrani v akumulator.
Primer:
%Primer ukaza ADDI
LOCO 2 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 8 %Pripravimo naslov, kateri bo v pomnilniku
STOD 9 %Shranimo pripravljeni naslov v pomnilnik
LOCO 5 %Shranimo novo vrednost v akumulator
ADDI 9 %Sestejemo vrednosti iz akumulatorja in pomnilnika
Sešteje vrednost iz akumulatorja in vrednost iz sklada. Oddaljenost omenjene vrednosti od vrha sklada določa vrednost v operandu izvor. Rezultat shrani v akumulator.
Primer:
%Primer ukaza ADDL
LOCO 3 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 2 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 4 %V akumulator shranimo vrednost 4
ADDL 1 %Sestejemo vrednosti iz akumulatorja in sklada
ADDL 0 %Sestejemo vrednosti iz akumulatorja in vrha sklada
Naslov iz programskega števca shrani na sklad. Zatem shrani naslov iz operanda v programski števec. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza CALL
JUMP GLAVNI %Vstopimo v glavni program
SESTEJ LODL 1 %Vrednost prvega operanda
ADDL 2 %Prištejemo vrednost drugega operanda
RETN %Izstopimo iz funkcije SESTEJ
GLAVNI LOCO 5 %Vrednost prvega operanda
PUSH %Podamo prvi operand
LOCO 3 %Vrednost drugega operanda
PUSH %Podamo drugi operand
CALL SESTEJ %Sestejemo vrednosti operandov
LOCO 2 %Vrednost prvega operanda
PUSH %Podamo prvi operand
LOCO 7 %Vrednost drugega operanda
PUSH %Podamo drugi operand
CALL SESTEJ %Sestejemo vrednosti operandov
Poveča sklad za število elementov, katero določa vrednost v operandu količina.
Primer:
%Primer ukaza DESP
DESP 9 %Ustvarimo sklad v katerem je 9 elementov
LOCO 4 %Pripravimo vrednost, katera bo v skladu
STOL 5 %Pripravljeno vrednost damo v sklad
Zmanjša sklad za število elementov, katero določa vrednost v operandu količina.
Primer:
%Primer ukaza INSP
LOCO 1 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 8 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
INSP 2 %Odstranimo sklad
Če je vrednost iz akumulatorja manjša od nič, v programski števec shrani naslov iz operanda. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza JNEG
LOCO -5 %V akumulator shranimo negativno vrednost
JNEG L1 %Ali je vrednost iz akumulatorja manjša od nič
LOCO 1 %V akumulator shranimo vrednost 1
JUMP L2 %Preskočimo naslednjo inštrukcijo
L1 LOCO -1 %V akumulator shranimo vrednost -1
L2 PUSH %Vrednost iz akumulatorja damo tudi na sklad
Če je vrednost iz akumulatorja različna od nič, v programski števec shrani naslov iz operanda. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza JNZE
LOCO 3 %V akumulator shranimo neničelno vrednost
JNZE L1 %Ali je vrednost iz akumulatorja različna od nič
LOCO 0 %V akumulator shranimo vrednost 0
JUMP L2 %Preskočimo naslednjo inštrukcijo
L1 LOCO 1 %V akumulator shranimo vrednost 1
L2 PUSH %Vrednost iz akumulatorja damo tudi na sklad
Če je vrednost iz akumulatorja večja ali enaka ničli, v programski števec shrani naslov iz operanda. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza JPOS
LOCO 7 %V akumulator shranimo pozitivno vrednost
JPOS L1 %Ali je vrednost iz akumulatorja večja ali enaka ničli
LOCO -1 %V akumulator shranimo vrednost -1
JUMP L2 %Preskočimo naslednjo inštrukcijo
L1 LOCO 1 %V akumulator shranimo vrednost 1
L2 PUSH %Vrednost iz akumulatorja damo tudi na sklad
V programski števec shrani naslov iz operanda. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza JUMP
LOCO 5 %V akumulator shranimo vrednost 5
JUMP L %Preskočimo naslednjo inštrukcijo
LOCO 0 %V akumulator shranimo vrednost 0
L PUSH %Vrednost iz akumulatorja damo tudi na sklad
Če je vrednost iz akumulatorja enaka ničli, v programski števec shrani naslov iz operanda. Naslov v operandu je lahko v obliki labele.
Primer:
%Primer ukaza JZER
LOCO 0 %V akumulator shranimo ničelno vrednost
JZER L1 %Ali je vrednost iz akumulatorja enaka ničli
LOCO -1 %V akumulator shranimo vrednost -1
JUMP L2 %Preskočimo naslednjo inštrukcijo
L1 LOCO 1 %V akumulator shranimo vrednost 1
L2 PUSH %Vrednost iz akumulatorja damo tudi na sklad
V akumulator shrani vrednost, katera je v operandu konstanta.
Primer:
%Primer ukaza LOCO
LOCO 7 %V akumulator shranimo vrednost 7
V akumulator shrani vrednost iz pomnilnika, katero določa naslov v operandu izvor.
Primer:
%Primer ukaza LODD
LOCO 4 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 0 %"Pocistimo" akumulator
LODD 8 %Nalozimo vrednost iz pomnilnika
Iz pomnilnika prebere vrednost, katero določa naslov v operandu izvor. Prebrana vrednost postane novi naslov. Zatem v akumulator shrani vrednost iz pomnilnika, katero določa novi naslov.
Primer:
%Primer ukaza LODI
LOCO 3 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 8 %Pripravimo naslov, kateri bo v pomnilniku
STOD 9 %Shranimo pripravljeni naslov v pomnilnik
LOCO 0 %"Pocistimo" akumulator
LODI 9 %Nalozimo vrednost iz pomnilnika
V akumulator shrani vrednost iz sklada. Oddaljenost omenjene vrednosti od vrha sklada določa vrednost v operandu izvor.
Primer:
%Primer ukaza LODL
LOCO 8 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 3 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LODL 1 %V akumulator shranimo vrednost iz sklada
LODL 0 %V akumulator shranimo vrednost iz vrha sklada
Iz vrha sklada pobere vrednost in jo shrani v akumulator. Pri tem se velikost sklada zmanjša za 1 element.
Primer:
%Primer ukaza POP
LOCO 4 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 7 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 0 %V akumulator shranimo vrednost 0
POP %Iz vrha sklada poberemo vrednost in jo shranimo v akumulator
POP %Poberemo še eno vrednost
Iz vrha sklada pobere vrednost in jo shrani v pomnilnik na naslov, ki je v akumulatorju. Pri tem se velikost sklada zmanjša za 1 element.
Primer:
%Primer ukaza POPI
LOCO 6 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 5 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 8 %V akumulator shranimo naslov 8
POPI %Iz sklada poberemo vrednost in jo shranimo v pomnilnik
LOCO 9 %V akumulator shranimo naslov 9
POPI %Iz sklada poberemo vrednost in jo shranimo v pomnilnik
Na sklad shrani vrednost iz pomnilnika, katero določa naslov v akumulatorju. Pri tem se velikost sklada poveča za 1 element.
Primer:
%Primer ukaza PSHI
LOCO 5 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 3 %Pripravimo vrednost, katera bo v pomnilniku
STOD 9 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 8 %V akumulator shranimo naslov 8
PSHI %Na sklad shranimo vrednost iz pomnilnika
LOCO 9 %V akumulator shranimo naslov 9
PSHI %Na sklad shranimo vrednost iz pomnilnika
Na vrh sklada shrani vrednost iz akumulatorja. Pri tem se velikost sklada poveča za 1 element, kazalec sklada (SP) se zmanjša.
Primer:
%Primer ukaza PUSH
LOCO 6 %V akumulator shranimo vrednost 6
PUSH %Na sklad shranimo vrednost iz akumulatorja
LOCO 2 %V akumulator shranimo vrednost 2
PUSH %Na sklad shranimo vrednost iz akumulatorja
Iz sklada pobere naslov in ga spremeni tako, da kaže na naslednjo pomnilniško lokacijo. Zatem ga shrani v programski števec.
Primer:
%Primer ukaza RETN
JUMP GLAVNI %Vstopimo v glavni program
SIGNUM LODL 1 %Vrednost operanda
JZER L1 %Ali je vrednost operanda enaka ničli
JPOS L2 %Ali je vrednost operanda pozitivna
LOCO -1 %Rezultat za negativno vrednost operanda
RETN %Izstopimo iz funkcije SIGNUM
L1 LOCO 0 %Rezultat za ničelno vrednost operanda
RETN %Izstopimo iz funkcije SIGNUM
L2 LOCO 1 %Rezultat za pozitivno vrednost operanda
RETN %Izstopimo iz funkcije SIGNUM
GLAVNI LOCO 8 %Vrednost operanda
PUSH %Podamo operand
CALL SIGNUM %Določimo signum od vrednosti operanda
V pomnilnik na naslov, ki je v operandu ponor, shrani vrednost iz akumulatorja.
Primer:
%Primer ukaza STOD
LOCO 5 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
Iz pomnilnika prebere vrednost, katero določa naslov v operandu ponor. Prebrana vrednost postane novi naslov. Zatem v pomnilnik na novi naslov shrani vrednost iz akumulatorja.
Primer:
%Primer ukaza STOI
LOCO 9 %Pripravimo naslov, kateri bo v pomnilniku
STOD 8 %Shranimo pripravljeni naslov v pomnilnik
LOCO 6 %Pripravimo vrednost, katera bo v pomnilniku
STOI 8 %Shranimo pripravljeno vrednost v pomnilnik
V sklad shrani vrednost iz akumulatorja. Oddaljenost omenjene shrambe od vrha sklada določa vrednost v operandu ponor.
Primer:
%Primer ukaza STOL
DESP 4 %Ustvarimo sklad
LOCO 8 %V akumulator shranimo vrednost 8
STOL 2 %V sklad shranimo vrednost iz akumulatorja
STOL 0 %Na vrh sklada shranimo vrednost iz akumulatorja
Odšteje vrednost iz pomnilnika, katero določa naslov v operandu izvor, od vrednosti iz akumulatorja. Rezultat shrani v akumulator.
Primer:
%Primer ukaza SUBD
LOCO 2 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 5 %Shranimo novo vrednost v akumulator
SUBD 8 %Odstejemo vrednost iz pomnilnika od vrednosti iz akumulatorja
Iz pomnilnika prebere vrednost, katero določa naslov v operandu izvor. Prebrana vrednost postane novi naslov. Zatem odšteje vrednost iz pomnilnika, katero določa novi naslov, od vrednosti iz akumulatorja. Rezultat shrani v akumulator.
Primer:
%Primer ukaza SUBI
LOCO 3 %Pripravimo vrednost, katera bo v pomnilniku
STOD 8 %Shranimo pripravljeno vrednost v pomnilnik
LOCO 8 %Pripravimo naslov, kateri bo v pomnilniku
STOD 9 %Shranimo pripravljeni naslov v pomnilnik
LOCO 4 %Shranimo novo vrednost v akumulator
SUBI 9 %Odstejemo vrednost iz pomnilnika od vrednosti iz akumulatorja
Odšteje vrednost iz sklada od vrednosti iz akumulatorja. Oddaljenost omenjene vrednosti od vrha sklada določa vrednost v operandu izvor. Rezultat shrani v akumulator.
Primer:
%Primer ukaza SUBL
LOCO 4 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 5 %Pripravimo vrednost, katera bo na skladu
PUSH %Pripravljeno vrednost damo na sklad
LOCO 6 %V akumulator shranimo vrednost 6
SUBL 1 %Odstejemo vrednost iz sklada od vrednosti iz akumulatorja
SUBL 0 %Odstejemo vrednost iz vrha sklada od vrednosti iz akumulatorja
Akumulator in kazalec sklada med seboj zamenjata svoje vrednosti.
Primer:
%Primer ukaza SWAP
LOCO 80 %V akumulator shranimo vrednost 80
SWAP %Zamenjamo vrednosti akumulatorja in kazalca sklada
Program se po dvojnem kliku ne zažene.
Program je starejše izdelave in na novejših operacijskih sistemih Windows privzeto ne deluje. Za zagon poskusite naslednje (v tem vrstnem redu):
Program se ob dvojem kliku ne zažene oz. mi javi napako "Failed to load control 'CommonDialog' from COMDLG32.OCX. Your version of COMDLG32.OCX may be outdated. Make sure you are using the version of the control that was provided with your application."
Poleg programa je tudi datoteka "COMDLG32.OCX". To datoteko skopirajte v mapo %WINDIR%\system32\, kjer je %WINDIR% pot do mape z Windows operacijskim sistemom (običajno C:\windows\). Pazite, ker na tej poti že obstaja datoteka z istim imenom. Priporočamo, da obstoječi datoteki v %WINDIR%\system32\ spremenite ime, preden izvedete kopiranje.
Kako lahko ugotovim kje imam napako v programu?
Preverite ali je napaka sintaktična:
Preverite ali je pravilno naložilo celoten program. V kolikor manjka kakšna
programska vrstica, potem je v njej napaka. V kolikor je na zaslonu na levi
strani kjerkoli znak "x" potem preverite to vrstico in vrstico pred njo
saj se tu nahaja sintaktična napaka.
V primeru programske napake bo potrebno koračno izvajati program (glej odgovor spodaj). Ob sledenju izvajanja lahko ugotovite, kje je vaš algoritem (postopek) napačen oz. kje ste npr. pozabili naložiti ali shraniti neko vrednost. Opazujte registre in vrstico z sporočilom.
Kako lahko koračno izvajam program (namizna različica)?
S klikom na gumb "Vse prekinitvene točke" (kljukica) nastavimo, da se program ustavi v vsaki vrstici programa. S klikom na "Zazeni" se program izvede do naslednje prekinitve točke. Ker vsaka vrstica vsebuje prekinitveno točko se program izvaja koračno (ukaz za ukazom). Vedno se izvede ukaz iz lokacije na katero kaže register PC. Če želimo vrstico preskočiti ali izvesti že izvedene vrstice kliknemo na vrstico v programu in na gumb "PC". S tem PC kaže na označeno vrstico. Program lahko izvedemo do določene programske vrstice (izberemo vrstico in nato gumb z sliko roke: "Prekinitvena točka"). Nato od tu dalje izvajamo koračno ("Vse prekinitvene točke"), itd.
Kaj sta najpogostejši sintaktični napaki?
Študenti pozabijo, da mora pred ukazom mora prostor (presledki, tabulator) za labelo, četudi le-te ni. Primer napake (kjer ni presledka pred JUMP):
la5 LOCO 0
JUMP 10
Tipkarske napake pri labelah. Kjer se lokacija kamor želimo skočiti ne imenuje enako kot labela. Primer:
laBEl5 LOCO 0
JUMP labela5
Kaj sta najpogostejši programski napaki?
Študentje pogosto pri računanju (npr. povečevanju števca) pozabijo shraniti novo vrednos nazaj v pomnilnik.
Pri pogojnih skokih na lokacije, (nižje) študentje pogosto pozabijo, da se program izvaja zaporedno in je potrebno skočiti iz pogoja. Primer napake. V spodnjem primeru je po zagovnu na skladu vedno vrednost 5 in nikoli ni vrednosti -2, saj manjka skok preko vrsitice "pozitivno" ):
JPOS pozitiv
LOCO -2
pozitv LOCO 5
PUSH