quinta-feira, julho 27, 2017

Assembler para o CDP1802 - Parte 2

No post anterior vimos uma linguagem assembler para o 1802. Neste post vou falar um pouco no programa que eu escrevi para traduzi-la em linguagem de máquina.

Assemblando o Blink

Aviso: o meu assembler ainda é um trabalho em curso. A versão atual está no meu github: https://github.com/dquadros/Asm1802. Bugs são bem prováveis, use por sua conta e risco. Neste momento as mensagens de erro deixam muito a desejar.

Uma primeira decisão foi desenvolver o programa em C#. O motivo principal é que eu queria usar programação orientada a objeto e aproveitar estruturas de dados como listas e dicionários. Tomada esta decisão optei por uma linguagem que eu uso habitualmente.

Existe muita teoria sobre tradução de linguagens, que eu preferi deixar de lado. Considerando as simplicidades e esquisitices da linguagem, resolvi fazer a análise e geração "na marra".

Um último detalhe a mencionar sobre decisões: usei a língua inglesa  tanto para os nomes de classes e métodos como para os comentários.

Como infraestrutura, criei as seguintes classes:
  • SymbolTable: uma camada fina sobre um dictionary para armazenar os símbolos e os valores associados a eles.
  • InstrTable: um dictionary para ajudar a identificar as instruções, processar os operandos e gerar o código.
  • Token: esta classe isola e faz uma precisa categorização de elementos como símbolos, instruções, diretivas e constantes.
O trabalho pesado da análise do fonte está na classe Statement.  Um statement se refere a um único comando, a separação dos comandos de uma linha e a retirada de comentários é feita em um passo de pré-processamento. A análise é feita na maior parte do tempo analisando o texto da esquerda para a direita. Existem dois casos que exigem voltar atrás:
  • Na análise de um datalist é tentado primeiro identificar um string, se não houver sucesso deve ser uma expressão.
  • Na análise de uma expressão é primeiro procurado identificar "A(", "A.0(" e "A.1(". Se não for nenhum destes devemos ter um "expressão básica" (constante, símbolo, etc).
O programa principal orquestra tudo isto:
  • Analisa a linha de comando (que por enquanto só deve conter o nome do arquivo com o fonte)
  • Carrega o fonte para a memória
  • Separa os comandos
  • Na primeira fase, analisa os comandos montando a tabela de símbolos e determinando o tamanho ocupado
  • Na segunda fase, refaz a análise para obter os endereços atualizados quanto às referências aos símbolos definidos à frente, gera o código e produz a listagem de saída
  • Lista a tabela de símbolos
O resultado não está tão limpo quando eu gostaria, mas parece estar funcionando. O principal teste foi um extensa listagem extraída do Operator Manual for RCA COSMAC Development System II. O programador abusou um pouco do assembler, sendo um pouco criativo no uso de alguns recursos (à custa da legibilidade do programa).

Nenhum comentário: