Anteriormente rodamos o código intermediário em uma máquina virtual baseada em pilha. Agora iremos traduzir o código intermediário para o código na arquitetura Hack.
<aside> 📢 Os conceitos e técnicas utilizados são discutidas no tópico "Ambiente de Execução"
</aside>
No projeto nand2tetris eles chamam esse componente de VMTranslator e ele é o segundo programa desenvolvido, como na figura abaixo:
Anteriormente mapeamos a linguagem fonte para uma linguagem intermediaria que abstraia algumas operações. Porém, agora precisamos implementar esse ambiente de execução considerando a arquitetura Hack e sua linguagem simbólica.
Os segmentos de memoria que eram manipulados pela máquina virtual, agora precisaram ter uma localização bem definida dentro da memoria RAM para poder ser manipulados pela linguagem simbolica.
Por convenção, foram reservados algumas posições na memória para indicar a posição desses segmentos, como podemos observar na figura.
Por exemplo, o Stack Pointer, fica armazenado na posição 0:
Em um programa, podemos nos referencia-lo através do símbolo SP que já é um simbolo pre-definido na linguagem simbólica:
@SP /// == @0, irá setar o registrador A com o valor 0
O objetivo do Stack Pointer é sempre apontar para o local onde será armazenado o novo elemento. De modo abstrato seria:
POP
Então, precisaremos implementar esse funcionamento na linguagem simbólica.
Antes de seguirmos, importante usamos uma notação para ajudar na descrição do código.
Como explicado, os segmentos ficam localizados em blocos de memória e seus endereços são armazenados nas posições iniciais da memória, e serão referidas através do símbolos SP (Stack Pointer), LCL (variáveis locais), ARG (argumentos), THIS (bloco de dados de um objeto armazenado no Heap) e THAT (bloco de dados de um array).
Logo, SP, LCL, ARG, THIS e THAT são como ponteiros, que aponta para um dado endereço. Então, usaremos anotação de ponteiros para descrever alguns códigos.
Considerando o exemplo acima, para empilhar o valor 17, teriamos o seguite pseudocodigo:
*SP = 17 // para onde o SP aponta recebe 17
SP++ // incrementa o valor do ponteiro
Que, mapeado para Hack Assembly: