Написание ASM ассемблера Z80 и построение дерева синтаксического анализа с использованием композиции?

Я очень новичок в концепции написания ассемблера, и даже после прочтения большого количества материала у меня все еще возникают трудности с обертыванием головы вокруг нескольких концепций.

  1. каков процесс фактического разбиения исходного файла на токены? Я считаю, что этот процесс называется lexing, и я искал повсюду реальные примеры кода, которые имеют смысл, но я не могу найти такую простую вещь, примеры кода очень приветствуются ;)

  2. при разборе требуется ли когда-либо передавать информацию вверх или вниз по дереву? Причина, по которой я спрашиваю, такова: возьмите:

    LD BC, nn

его нужно превратить в следующее дерево разбора после токенизации(???)

  ___ LD ___
  |        |
 BC        nn

теперь, когда это дерево пройдено, оно должно произвести следующий машинный код:

01 n n

если бы инструкция была:

LD DE,nn

тогда выход будет нужно быть:

11 n n

Это означает, что возникает вопрос, возвращает ли узел LD что-то другое на основе операнда или это операнд, который возвращает что-то? И как это достигается? Более простые примеры кода были бы отличными, если позволит время.

мне больше всего интересно узнать некоторые из необработанных процессов здесь, а не смотреть на передовые существующие инструменты, поэтому, пожалуйста, имейте это в виду, прежде чем отправлять меня в Yacc или гибкий график работы.

3 ответов


Ну, структура дерева вы действительно хотите для инструкция, которая работает на Регистре и памяти способ адресации, включающий смещение смещения и регистр индекса будет выглядеть так:

    INSTRUCTION-----+
    |      |        |
  OPCODE  REG     OPERAND
                  |     |
                OFFSET  INDEXREG

и да, вы хотите передать значения вверх и вниз по дереву. Вызывается метод формального указания передачи такого значения "атрибутивные грамматики", и вы украшаете грамматику для своего langauge (в вашем случае, синтаксис ассемблера) с передачей значений и вычисления над этими значениями. Для получения дополнительной информации, см.Википедия по атрибутивным грамматикам.

на связанный вопрос, который вы задали, Я обсудил инструмент DMS, который обрабатывает грамматики выражений и строит деревья. Как инструмент манипуляции языком, DMS сталкивается с точно такими же вверх и вниз проблемы с потоками информации дерева. Это не должно тебя удивлять., это как инструмент манипуляции языком высокого класса, он может обрабатывать атрибут грамматики расчеты напрямую.


нет необходимости строить дерево разбора. Коды Z80 op очень просты. Они состоят из кода op и 0, 1 или 2 операндов, разделенных запятыми. Вам просто нужно разделить код операции на (максимум 3) компонента с помощью очень простого парсера-дерево не требуется.


на самом деле, опкоды имеют не байтовую базу, а восьмеричную базу. Лучшее описание, которое я знаю, это декодирование Z80 OPCODES.