2004 ИС (Илюшечкин) / ВМИП / Compilers_methodics
.doc
Интегрированная среда проектирования программного обеспечения микроконтроллеров
Компилятор и дизассемблер
Методика написания
Аннотация
Приведена методика написания компиляторов и дизассемблеров, входящих в интегрированную среду проектирования (ИСП) программного обеспечения микроконтроллеров.
Методика
Компилятор состоит из двух основных блоков:
-
синтаксический анализатор
-
кодировщик команд.
Компилятор является двухпроходным. На первом проходе анализируются метки константы и макрокоманды. На втором проходе происходит замена меток и констант их значениями. Синтаксический анализ строки производится с учетом стандартного формата строки на языке ассемблера:
[метка] [операция] [операнд[ы]] [комментарий]
Компилятор может быть написан на любом языке программирования, редактор связей которого поддерживает создание динамических библиотек DLL.
Реализация конкретных процедур синтаксического анализа и кодирования не ограничена какими-либо условиями. Единственное требование — библиотека компилятора должна экспортировать функцию compile, входным параметром которой является имя файла, а выходными — динамические массивы, которые содержат (в порядке вызова):
-
соответствия номеров строк исходного текста номерам команд в машинном коде. Эта информация предназначена для обеспечения пошагового выполнения программы при отладке;
-
результаты компиляции (содержат все ошибки и предупреждения);
-
информацию о символических именах (метках и константах).
В случае фатальных ошибок во время компиляции, функция возвращает 0, в случае успеха 1.
Процесс написания компилятора можно автоматизировать.
Соответствующие процедуры могут быть описаны с помощью языковых грамматик. Этими грамматиками можно воспользоваться при генерации исходных текстов программами YACC (Yet Another Compilers Compiler) или Bizon. Результатом работы этих программ является полностью законченный модуль синтаксического анализа исходного текста и кодирования команд. Программисту требуется только представить этот модуль в виде DLL. В случае необходимости внесения изменений в компилятор изменения вносятся только в исходный файл грамматики и осуществляется его перекомпиляция.
Дизассемблер состоит из блока декодирования команд, который имеет сходную для всех микроконтроллеров структуру.
Процедура декодирования последовательно выбирает байты из массива кодов программы, учитывая при этом количество байт в команде (это определяется системой команд) и осуществляет замену соответствующих бит мнемоникой команды и операндами. Таким образом, дизассемблер представляет собой рутинную процедуру выделения битов и поиск в таблице соответствий.
На реализацию процедуры также не налагается никаких ограничений, за исключением соблюдения соответствия формату.
Объявление экспортируемых функций а также пример их использования представлено в документе “Руководство системного программиста”.