• Teoria

VM - jump

Goto é a maneira de desviarmos uma execução em vm, e possui a seguinte sintaxe:

  • goto LABEL
  • if-goto LABEL

podemos utilizar dois tipos :

  • goto : incondicional , salta sem condição
  • if-goto : condiconal, salta se o último valor da pilha for True

Exemplo: Salto para igual se 3 = 2

push constant 3
push constant 2
eq
if-goto IGUAL
..
..
label IGUAL
..
..

Exemplo: Contador utilizando for utilizando goto

// for(i=0; i<10; i++)
//     x = x+1;

push constant 0
pop temp 0         
push constant 1
pop temp 1
label LOOP_START
push temp 0
push constant 10
eq
if-goto END       // se temp0 = 10 salta para o fim
push temp 0
push constant 1
add
pop temp 0
push temp 1
push constant 1
add
pop temp 1
goto LOOP_START  // If counter > 0, goto LOOP_START
label END

labels

Os labels são definidos pela keyword label + nome :

  • label nome