Linguagem VM
Notação
- Pilha: Local onde a operação é executada
- Primeiro endereço: Dado no topo da pilha
- Segundo endereço: Segundo dado no topo da pilha
- Stack Pointer: Ponteiro para o endereço do dado no topo da pilha
...
...
X <- Segundo Valor
Y <- Primeiro Valor
SP ->
Operação | Argumentos | retorno | Descrição |
---|---|---|---|
add : Adição | X, Y | X | X = X + Y |
sub : Subtração | X, Y | X | X = X - Y |
neg : Negação | Y | Y | Y = - Y |
not : Not bit a bit | Y | Y | Y = ! Y |
and : And bit a bit | X, Y | X | X = X and Y |
or : Or bit a bit | X, Y | X | X = X or Y |
eq : Equal | X, Y | X | X = True if X = Y else False |
gt : Greater Than | X, Y | X | X = True if X > Y else False |
lt : Less Than | X, Y | X | X = True if X < Y else False |
Operações
add - Adição
add
X = X + Y
A operação add adiciona dois valores da pilha, e retorna o resultado no local do segundo valor.
Pilha
----------------------------------------
| Antes | Depois |
-------------------|--------------------
.... | ....
X | X+Y
Y | SP ->
SP -> |
sub - Subtração
sub
X = X-Y
A operação sub subtrai dois valores da pilha, e retorna o resultado no local do segundo valor.
neg - Negação
neg
Y = -Y
A operação neg nega (complemento de dois) o valor no topo da pilha, e retorna o resultado no mesmo local.
Pilha
----------------------------------------
| Antes | Depois |
-------------------|--------------------
.... | ....
X | X
Y | -Y
SP -> | SP ->
not - not bit a bit
and
Y = !Y
A operação not inverte (bit a bit) o valor no topo da pilha, e retorna o resultado no mesmo local.
or - Or bit a bit
or
Y = X or Y
A operação or aplica um or (bit a bit) com os valores no topo da pilha, e retorna o resultado no segundo endereço.
and - and bit a bit
and
Y = X and Y
A operação and aplica um or (bit a bit) com os valores no topo da pilha, e retorna o resultado no segundo endereço.
eq - Equal
eq
X = True se X==Y ou
False
A operação eq verifica se os dois valores no topo da pilha são iguais, re retorna o resultado (True ou False) no segundo valor da pilha.
True/false 1
- 'True' é representando por todos os bits em '1': '0xFFFF'
- 'False' é representando por todos os bits em '0': 0x0000'
Pilha
Essa operação consume os dois valores da pilha, veja exemplo.
Pilha
----------------------------------------
| Antes | Depois |
-------------------|--------------------
.... | ....
X | True/False
Y | SP ->
SP -> |
gt - Greater Than
gt
X = True se X>Y ou
False
A operação qt verifica se o valor no topo da pilha é maior que o anterior, retorna o resultado (True ou False) no segundo valor da pilha.
lt - Less Than
lt
X = True se X<Y ou
False
A operação qt verifica se o valor no topo da pilha é menor que o anterior, retorna o resultado (True ou False) no segundo valor da pilha.
Label
Labels são definidos pelo keyword label seguido de seu nome :
label
nome
São utilizados para endereçar o código em uma condição de goto.
Goto
Existem dois tipos de GOTO, condicional (if-goto) e incondicional (goto). No condicional o salto é realizado caso a condição não for Falsa (verifica sempre o último valor da pilha).
goto
nome
if-goto
nome
Função
A seguir definições de funções:
Declaração de função
Uma função é definida pelo keyword function seguido do seu nome e quantidade de variáveis locais n na estrutura a seguir :
function nome n
Toda função em VM deve possuir um retorno, definido pelo keyword return
Exemplo declaração de função
funcion add 2
push argument 0
push argument 1
add
Chamada de função
Uma função em VM é chamada pelo keyword: call seguido do nome da função e da quantidade m de parâmetros passados para essa função.
call nome m
Exemplo chamada de função
push constant 3
push constant 2
call mult 2
Parâmetros
Os parâmetros de uma função são passados na própria pilha.