Подтвердить что ты не робот

Построение ассемблера

Мне нужно построить ассемблер для архитектуры процессора, которую я создал. Архитектура похожа на MIPS, но это не имеет значения.

Я начал использовать С#, хотя С++ был бы более уместным. (С# означает более быстрое время разработки для меня).

Моя единственная проблема в том, что я не могу придумать хороший дизайн для этого приложения. Я строю 2-х ходовой ассемблер. Я знаю, что мне нужно делать в каждом проходе. \

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

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

4b9b3361

Ответ 1

Я написал три или четыре простых сборщика. Без использования генератора парсера я сделал модель S-C ассемблер, которую я знал лучше всего для 6502.

Чтобы сделать это, я использовал простой синтаксис - строка была одной из следующих:

nothing
[label] [instruction] [comment]
[label] [directive] [comment]

Яркой была одна буква, за которой следует любое количество букв или цифр.

Команда была <whitespace> <mnemonic> [Операнды]

Директива была <whitespace> .XX [операнды]

Комментарий был * до конца строки.

Оперансы зависели от инструкции и директивы.

Включены директивы .EQ для определения констант

.OR задать исходный адрес кода

.HS шестнадцатеричная строка байтов

.AS ascii строка байтов - любой разделитель, кроме пробела - независимо от того, что начиналось с его окончания

.TF целевой файл для вывода

.BS n резервное хранение блоков n байтов

Когда я написал это, я написал простые парсеры для каждого компонента. Всякий раз, когда я сталкивался с меткой, я помещаю ее в таблицу с ее целевым адресом. Всякий раз, когда я сталкивался с меткой, которую я не знал, я пометил инструкцию как неполную и помещал неизвестную метку ссылкой на инструкцию, требующую исправления.

После того, как все исходные строки прошли, я просмотрел таблицу "исправить" и попытался найти запись в таблице символов, если бы это произошло, я исправил инструкции. Если нет, то это была ошибка.

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

Учитывая эту структуру, для выполнения всего этого потребуется всего два дня.

Ответ 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 - сука.