Двухпросмотровый ассемблер
Структура объектного кода
Ассемблер (транслятор)
Ассемблер предназначен для построения машинного кода программы, представленной в виде текста на языке Ассемблер, создания дополнительной информации, необходимой при построении программы загрузчиком.
Решаемые задачи:
- Распределение памяти для переменных и программ.
- Создание машинного кода программы, т.е. построение кодов команд для соответствующих операторов исходной программы.
- Формирование объектного кода.
- Формирование протокола трансляции (листинга).
Объектный код – это программа в машинных кодах и информация, необходимая загрузчику для создания и выполнения программы.
Информация в объектном модуле представлена в виде карт. В современных объектных модулях (ОМ) она может представляться в табличном виде с содержанием всей той информации, которая есть в картах – машинный код сгенерирован для 0-го адреса загрузки.
- Карта-заголовок
H<имя модуля><длина модуля в ОП>
Назначение: задание имени модуля и заказ требуемого для него объема памяти.
- Карта объявления внешней переменной
D<имя внешней переменной><значение (адрес)><перемещаемость>
Назначение: указание информации о внешней переменной.
- Карта объявления внешней ссылки
R<имя внешней ссылки>[,…,]
Предназначена для указания внешних ссылок, используемых в программе.
- Карта тела программы (карта кода программы)
Т<адрес данных><длина данных><данные>
Предназначена для указания значений, которые должны быть записаны в ОП перед выполнением программы, т.е. при ее загрузке.
- Карта модификации
М<адрес данных><длина данных><формула>[,…,]
Предназначена для указания места и кода формулы модификации кода программы при объединении нескольких объектных модулей в программу или перемещения модуля в ОП.
Форма модификации: <имя внешней ссылки> ±
На каждое место кода программы, где указано значение внешней ссылки (используется внешняя ссылка) или значение перемещаемого выражения (перемещаемой переменной), создается отдельная карта модификации.
- Карта конца модуля
Е<точка входа>
Точка входа – адрес первой выполняемой команды.
Основная задача, решаемая ассемблером – это посторенние машинных кодов команд по текстовым операторам. Для построения кода команды необходимо знать:
· код операции;
· типы и значения операндов.
Если вся эта информация известна, то транслятор может сформировать код программы. Это в случае, если операнды отсутствуют, являются константами или регистрами.
В случае использования символического имени в операнде, возможны два случая:
1. Если соответствующая переменная или метка уже встретились в предыдущих операторах, то их значение известно (адрес) и можно генерировать код команды.
2. Переменная или метка еще не встретились, значит, их значение не известно, следовательно, построить код команды невозможно.
Поэтому задача построения кода программы решается в два просмотра.
Задача первого просмотра:
Распределить память для программы и определить значения переменных или меток.
Результатом первого просмотра является таблица символических имен, содержащая список переменных и меток и их значение. Также при первом просмотре может быть сформирована таблица литералов.
Литералы – это константы длиной более слова, а, следовательно, они не могут быть вписаны в команды. Транслятор отдельно самостоятельно выделяет память для таких констант и запоминает в таблице адрес памяти, где расположено значение константы, а в команде вместо константы подставляет ссылку на адрес памяти.
Задача второго просмотра:
- Формирование кода программы (кодов команд).
- Формирование всех карт объектного модуля и создание объектного кода или объектного модуля.
- Формирование или дополнение протокола трансляции (файла листинга).
В процессе трансляции используется ряд постоянных и переменных структур данных (таблиц).
2.1 Постоянные таблицы
- Таблица форматов команд (ТФК)
Содержит информацию о коде операции, длине команды и формате кодирования команды. Состоит из полей:
· мнемокод команды;
· тип первого операнда;
· тип второго операнда;
· длина команды;
· код операции (обычно значение первого байта);
· вид формата команды (одно или несколько полей).
Ключ таблицы составной и включает в себя первые три поля.
Таблица используется при первом просмотре для определения длины команды, а также для определения формата и кода операции.
Таблица заполняется ???? и не изменяется в процессе трансляции.
- Таблица регистров
Предназначена для указания имен регистров, их типа и кода. Содержит поля:
· имя регистра;
· код (номер) регистра;
· тип регистра.
Таблица используется на первом просмотре для определения типа регистров, на втором просмотре – код регистра (???).
Ключом является имя регистра.
2.2 Переменные таблицы
- Таблица символических имен
Предназначена для хранения информации об идентификаторах переменных, констант и меток, оставшихся в программе. Содержит поля:
· имя (идентификатор);
· значение (для переменной и метки это адрес, для переменной – ее значение);
· перемещаемость. Значение переменной перемещаемо, если адрес (переменная, метка). Если это константа, то не перемещаема;
· тип переменной;
· длина значения переменной.
Таблица формируется при первом просмотре, а используется во втором для формирования кодов команд, использующих ссылки.
- Таблица литералов
Предназначена для хранения информации о длинных константах. Содержит такие же поля, как таблица символьных имен, но вместо имени переменной используется сама запись константы. Далее все то же, что в ТСИ.