Skip to content

Instantly share code, notes, and snippets.

@mochja
Last active December 16, 2015 09:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mochja/ee1767f35c672c307dcb to your computer and use it in GitHub Desktop.
Save mochja/ee1767f35c672c307dcb to your computer and use it in GitHub Desktop.
VM IFJ15

VM

Na zaciatku sa premapuju skakajuce instrukcie na realne adresy targetujucej instrukcie, odstrania sa tym padom label instrukcie.

CALL MAIN
EXIT
LABEL MAIN
ADD 3 2
0x00: CALL 0x02
0x01: EXIT
0x02: ADD 3 2

Prva instukcia je vzdy call main, ktora zavola hlavnu funkciu programu, vytvori si svoj vlastny kontext do ktoreho si uklada lokalne premenne a pripadne parametre funcie, ak teda nejake ma, do kontextu sa taktiez ulozi aj aktualna adresa instrukcie, aby to cele vedelo kam sa vratit po vykonani funkcie, teda pri zavolani return.

Volanie return uvolni kontext a hodnotu vyrazu uvolni na stack. Taktiez je dobre podotknut, ze vsetky aritmeticke operacie, ukladaju hodnotu vysledku na stack, v pripade ze chcem hodnotu aritmetickej operacie ulozit do contextu funkcie, teda do lokalnej premmenej je potreba vyuzit instrukcie STORE, v opacnom pripade napriklad pri return a; kde a je lokalna premenna sa vyuziva instrukcia LOAD, ktora ma opacny effekt, a to zoberie hodnotu z kontextu a placne ju na vrchol stacku.

STORE a LOAD, pripadne aj aritmeticke instrukcie pracuju s offsetom. Tento offset urcuje poziciu v aktualnom kontexte. Ten kontext ma lokalny stack, vzdy sa pushnu parametre, potom rozdelovac (coz je prazdna polozka) a nasledne sa pripadavaju lokane premenne.

pr.:

f(int a):
  b = a;
f(5)
---------------
5
0
5

Potom u instrukcie LOAD ....., oznacuje offset hodnotu od 0 polozky. Ak chceme parameter a, bude hodnota -1, ak lokalnu hodnotu b bude hodnota 1.

ADD 3 2    // na vrh stacku sa ulozi hodnota 5
STORE 1    // hodnotu z vrchu stacku "presunieme" do 1 lokalnej premennej, cize sa odstrani zo stacku.
LOAD 1     // hodnotu z 1. lok. premennej jebneme naspat na vrch stacku. Je dobre podotknut ze hodnotu v contexte zanecha.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment