Escrevendo um assembler Z80 - Lexing ASM e construir uma árvore de análise usando composição?
-
19-09-2019 - |
Pergunta
Eu sou muito novo para o conceito de escrever um montador e mesmo depois de ler uma grande quantidade de material, eu ainda estou tendo dificuldades envolvendo minha cabeça em torno de um par de conceitos.
-
O que é o processo de realmente acabar com um arquivo de origem em tokens? Eu acredito que este processo é chamado de lexing, e eu procurei alta e baixa para um exemplos de código reais que fazem sentido, mas não consigo encontrar uma coisa tão exemplos de código simples muito bem-vindo;)
-
Ao analisar, se a informação nunca precisam ser passadas para cima ou para baixo da árvore? A razão que eu peço é o seguinte, pegue:
LD BC, nn
Ele precisa ser transformado em árvore de análise seguinte, uma vez tokenized (???)
___ LD ___
| |
BC nn
Agora, quando esta árvore é atravessada ele precisa para produzir o seguinte código de máquina:
01 n n
Se a instrução tinha sido:
LD DE,nn
Então, a saída seria necessário:
11 n n
O que significa que levanta a questão, é que o LD nó retorno algo diferente com base no operando ou é o operando que retorna alguma coisa? E como isso é conseguido? exemplos de código mais simples seria excelente se o tempo permitir.
Estou mais interessado em aprender alguns dos processos matérias aqui em vez de olhar para ferramentas avançadas existentes para urso por favor isso em mente antes de enviar-me a Yacc ou Flex .
Solução
Bem, a estrutura da árvore você quer realmente para uma instrução que opera sobre um registo e uma memória modo de endereçamento involing um deslocamento offset e um registo de índice ficaria assim:
INSTRUCTION-----+
| | |
OPCODE REG OPERAND
| |
OFFSET INDEXREG
E sim, você quer quer passar valores para cima e para baixo da árvore. Um método para especificar formalmente tal passagem valor é chamado "Gramática de atributos", e você decorar a gramática para o seu langauge (no seu caso, sua sintaxe assembler) com o valor-passagem e os cálculos sobre estes valores. Para mais fundo, consulte Wikipedia em gramáticas de atributos .
Em um questão relacionada você pediu , eu discuti um ferramenta, DMS , que lida com expressão gramáticas e árvores de construção. Como ferramenta de manipulação de linguagem, DMS enfrenta exatamente esses mesmos up-and-down as informações árvore flui questões. Ele não deve surpreendê-lo, que, como uma ferramenta de manipulação de linguagem high-end, ele pode lidar com computações atributo gramática diretamente.
Outras dicas
Não é necessário para construir uma árvore de análise. códigos op Z80 são muito simples. Eles consistem do código op e 0, 1 ou 2 operandos, separados por vírgulas. Você só precisa dividir o código de operação para cima no (máximo de 3) componentes com um analisador muito simples -. Nenhuma árvore é necessário
Na verdade, os opcodes que não têm uma base de byte, mas uma base octal. A melhor descrição que eu sei é DECODIFICAÇÃO Z80 Opcodes .