VM - Segmentos

Os comandos push e pop são a única maneira que temos de acessar/manipular a memória. O comando push traz para a pilha um valor da memória (RAM ou ROM) e o comando pop salva na memória um valor da pilha (RAM). Os comandos possuem a seguinte sintaxe :

  • push segment index
  • pop segment index

Onde index é um número inteiro positivo e segment pode ser um dos casos a seguir:

segment Uso Index Comentário
argument Local onde o argumento da função está salvo 0 .. Alocado dinamicamente pelo VMTranslator quando a função é chamada
local Local das variáveis locais da função 0 .. Alocado dinamicamente pelo VMTranslator quando a função é chamada
static Local onde as variáveis do objeto estão salvos 0 .. Essas variáveis são compartilhadas por todas as funções do mesmo .vm, assim como em um objeto
constant Carrega uma constante na pilha 0 .. 32767 Mesmo uso do leaw (carrega da ROM um valor na RAM)
this/that Segmentos de uso geral, pode apontar para qualquer lugar 0 .. Usado para ler e escrever de endereços da memória, por exemplo, acessar o LCD
pointer Altera os valores do this e do that 0, 1 Usado para modificar a onde o this e o that apontam
temp Local para uso de variáveis temporárias 0 .. 7 Acessado por qualquer função, é armazenado nos endereços R5 .. R12 da RAM

Exemplo, acessando o temp

Por exemplo, para trazermos para a pilha uma constante realizamos a seguinte operação:

push constant 15
  • nesse caso o segmento acessado é o constant e o parâmetro é o 15.

Para salvarmos o valor 15 no temp 3 (endereço da RAM 7), basta:

push constant 15
pop temp 3

Podemos também trazer o temp 3 para a pilha:

push temp 3