Escrevendo um assembler Z80 - Lexing ASM e construir uma árvore de análise usando composição?

StackOverflow https://stackoverflow.com/questions/1305091

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.

  1. 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;)

  2. 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 .

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top