- •Министерство образования российской федерации
- •1Теоретические сведения
- •1.1Структура компилятора
- •1.2Транслятор
- •1.3Машинно-зависимые характеристики ассемблера
- •1.4Машинно-независимые характеристики ассемблера
- •1.5Основные определения
- •1.6Описание программы alter
- •3Порядок выполнения работ (руководство пользователя)
- •4Отчеты по лабораторным работам
- •5Контрольные вопросы
- •6Литература
1.2Транслятор
Типичным транслятором является ассемблер. Существует целый ряд основных функций, например таких, как трансляция мнемонических кодов операций в их эквиваленты на машинном языке или присваивание машинных адресов символическим меткам, которые должны выполняться любым ассемблером.
Большинство ассемблеров выполняет два просмотра исходной программы. Основной задачей первого просмотра является поиск символических имен и назначение им адресов. Фактическая трансляция выполняется во время второго просмотра. Ассемблер наряду с трансляцией исходной программы должен также выполнять и так называемые директивы ассемблера (иногда их называют псевдокомандами). Эти директивы не переводятся непосредственно в машинные команды (хотя и могут оказывать влияние на объектную программу), а управляют работой самого ассемблера. В заключительной фазе своей работы ассемблер должен записать полученный объектный код на некоторое устройство вывода. Позднее эта объектная программа будет загружена в оперативную память для исполнения.
Для представления объектной программы обычно используется простой формат, в котором определены три типа записей: запись-заголовок, тело программы и запись-конец. Запись-заголовок содержит имя программы, её начальный адрес и длину. Тело программы содержит машинные команды и данные программы с указанием адресов их загрузки. Запись конец отмечает конец объектной программы и определяет адрес, с которого следует начинать исполнение программы (точку входа).
Теперь подробнее опишем функции каждого из двух просмотров простого ассемблера:
Первый просмотр (определение имен):
назначение адресов для всех предложений исходной программы;
запоминание значений (адресов), присвоенных всем меткам, для последующего их использования на втором просмотре;
выполнение некоторых директив ассемблера.
Второй просмотр (трансляция команд и генерация объектного кода):
трансляция команд(перевод кодов операций и разрешение адресных ссылок);
генерация данных, заданных директивами BYTE,WORD и др.
выполнение тех директив ассемблера, которые небыли обработаны на первом просмотре.
запись объектного кода и выдача листинга.
1.3Машинно-зависимые характеристики ассемблера
1. Форматы команд и способы адресации.
Преобразование имен регистров в их числовые значения может делаться с помощью отдельной таблицы. Часто для удобства используют таблицу имен.
Для трансляции большинства команд вида память – регистр используется относительный способ адресации (либо относительно счетчика команд, либо относительно базы). В любом случае ассемблер должен вычислить смещение, которое является составной частью объектной команды. Трансляция команд, в которых используются непосредственные операнды, проще, поскольку в них не нужна организация ссылок на оперативную память. Все, что требуется, это преобразовать операнд во внутреннее представление и занести его в команду. Ассемблирование команд, использующих косвенную адресацию, фактически не представляет ничего нового. Для того чтобы получить требуемый целевой адрес, вначале обычным образом вычисляется смещение. Затем в разряде n генерируемой команды устанавливается признак косвенной адресации.
2.Перемещение программ:
Поскольку ассемблеру не известен фактический адрес начала загрузки, он не может выполнять необходимую настройку адресов, используемых программой. Однако ассемблер может указать загрузчику те части объектной программы, которые нуждаются в настройке при загрузке Объектная программа, содержащая информацию, необходимую для выполнения подобной модификации, называется перемещаемой программой. Естественно, что команда загрузчика должна быть составной частью объектной программы. Это можно сделать с помощью дополнительного типа записи объектного формата – запись модификатора. Эта запись имеет следующий формат:
Запись-модификатор:
Столбец 1 |
М. |
Столбец 2-7 |
Начальный адрес модифицируемого адресного поля относительно начала программы (шестнадцатеричный). |
Столбец 8-9 |
Длина модифицируемого адресного поля в полубайтах (шестнадцатеричная). |
Длина хранится в полубайтах (а не в байтах), так как модифицируемое адресное поле не обязательно содержит целое число байтов. Месторасположения модифицируемого адресного поля задаётся адресом байта, в котором содержатся старшие разряды адресного поля. Если модифицируемое адресное поле занимает нечетное количество полубайтов, то предполагается, что оно начинается с середины байта, адрес которого задан в столбцах 2-7. Модификация во время загрузки требуется только в командах, использующих прямую (как альтернатива относительной) адресацию.