Написание ассемблера Z80 - лексизация ASM и создание дерева разбора с использованием композиции? - PullRequest
9 голосов
/ 20 августа 2009

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

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

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

    LD BC, nn

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

  ___ LD ___
  |        |
 BC        nn

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

01 n n

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

LD DE,nn

Тогда результат должен быть:

11 n n

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

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

Ответы [ 3 ]

9 голосов
/ 24 августа 2009

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

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

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

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

6 голосов
/ 20 августа 2009

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

3 голосов
/ 26 октября 2009

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

...