Построение ассемблера
Мне нужно построить ассемблер для архитектуры процессора, которую я создал. Архитектура похожа на MIPS, но это не имеет значения.
Я начал использовать С#, хотя С++ был бы более уместным. (С# означает более быстрое время разработки для меня).
Моя единственная проблема в том, что я не могу придумать хороший дизайн для этого приложения. Я строю 2-х ходовой ассемблер. Я знаю, что мне нужно делать в каждом проходе. \
Я реализовал первый проход, и я понял, что если мне нужно построить код сборки на одной строке... ошибка не будет выброшена. Это означает только одно плохое методы анализа.
Так всемогущие программисты, отцы ассемблера просвещают меня, как я должен действовать.
Мне просто нужно поддерживать символы и декларации данных. Инструкции имеют фиксированный размер.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Ответы
Ответ 1
Я написал три или четыре простых сборщика. Без использования генератора парсера я сделал модель S-C ассемблер, которую я знал лучше всего для 6502.
Чтобы сделать это, я использовал простой синтаксис - строка была одной из следующих:
nothing
[label] [instruction] [comment]
[label] [directive] [comment]
Яркой была одна буква, за которой следует любое количество букв или цифр.
Команда была <whitespace> <mnemonic> [Операнды]
Директива была <whitespace> .XX [операнды]
Комментарий был * до конца строки.
Оперансы зависели от инструкции и директивы.
Включены директивы
.EQ для определения констант
.OR задать исходный адрес кода
.HS шестнадцатеричная строка байтов
.AS ascii строка байтов - любой разделитель, кроме пробела - независимо от того, что начиналось с его окончания
.TF целевой файл для вывода
.BS n резервное хранение блоков n байтов
Когда я написал это, я написал простые парсеры для каждого компонента. Всякий раз, когда я сталкивался с меткой, я помещаю ее в таблицу с ее целевым адресом. Всякий раз, когда я сталкивался с меткой, которую я не знал, я пометил инструкцию как неполную и помещал неизвестную метку ссылкой на инструкцию, требующую исправления.
После того, как все исходные строки прошли, я просмотрел таблицу "исправить" и попытался найти запись в таблице символов, если бы это произошло, я исправил инструкции. Если нет, то это была ошибка.
Я сохранил таблицу имен команд и все допустимые режимы адресации для операндов. Когда я получил инструкцию, я попытался разобрать каждый режим адресации, пока что-то не сработало.
Учитывая эту структуру, для выполнения всего этого потребуется всего два дня.
Ответ 2
Посмотрите на этот сборник Assembler Development от Randy Hyde, автора знаменитого "The Art of Assembly Language":
Набор разработчика Assembler
Ответ 3
Первый проход двухпроходного ассемблера собирает код и помещает заполнители для символов (так как вы не знаете, насколько все это до тех пор, пока вы не запустили ассемблер). Второй проход заполняет адреса. Если впоследствии собранный код необходимо связать с внешними ссылками, это задание одноименного компоновщика.
Ответ 4
Если вы хотите написать ассемблер, который просто работает, и выплескивает шестнадцатеричный файл для загрузки на микроконтроллер, это может быть простым и легким. Часть моей библиотеки ciforth - это полный ассемблер Pentium для добавления встроенных определений, около 150 строк. Существует ассемблер для 8080 пары дюжины строк.
Принцип объясняется http://home.hccnet.nl/a.w.m.van.der.horst/postitfixup.html.
Это составляет применение шаблона дизайна доски. Вы начинаете с указания инструкции, оставляя отверстия для любых и всех операндов. Затем вы заполняете отверстия, когда вы сталкиваетесь с параметрами.
Существует строгое разделение между общим инструментом и набором инструкций.
Если ассемблер вам нужен только для вас, и нет требований, кроме удобства использования (не для домашнего задания), вы можете иметь пример реализации в http://home.hccnet.nl/a.w.m.van.der.horst/forthassembler.html. Если вам не нравится Forth, в Perl также есть пример реализации. Если набор инструкций Pentium слишком сильно пережевывает, то вы все же должны понимать принцип и общую часть.
Сначала вам рекомендуется посмотреть файл asi8080.frt. Это 389 WOC (слова кода, а не строки кода). Опытный Форхер, знакомый с набором инструкций, может провести ассемблер таким образом вечером. Pentium - сука.