Двухпросмотровый ассемблер

Структура объектного кода

Ассемблер (транслятор)

Ассемблер предназначен для построения машинного кода программы, представленной в виде текста на языке Ассемблер, создания дополнительной информации, необходимой при построении программы загрузчиком.

Решаемые задачи:

  1. Распределение памяти для переменных и программ.
  2. Создание машинного кода программы, т.е. построение кодов команд для соответствующих операторов исходной программы.
  3. Формирование объектного кода.
  4. Формирование протокола трансляции (листинга).

Объектный код – это программа в машинных кодах и информация, необходимая загрузчику для создания и выполнения программы.

Информация в объектном модуле представлена в виде карт. В современных объектных модулях (ОМ) она может представляться в табличном виде с содержанием всей той информации, которая есть в картах – машинный код сгенерирован для 0-го адреса загрузки.

  1. Карта-заголовок

H<имя модуля><длина модуля в ОП>

Назначение: задание имени модуля и заказ требуемого для него объема памяти.

  1. Карта объявления внешней переменной

D<имя внешней переменной><значение (адрес)><перемещаемость>

Назначение: указание информации о внешней переменной.

  1. Карта объявления внешней ссылки

R<имя внешней ссылки>[,…,]

Предназначена для указания внешних ссылок, используемых в программе.

  1. Карта тела программы (карта кода программы)

Т<адрес данных><длина данных><данные>

Предназначена для указания значений, которые должны быть записаны в ОП перед выполнением программы, т.е. при ее загрузке.

  1. Карта модификации

М<адрес данных><длина данных><формула>[,…,]

Предназначена для указания места и кода формулы модификации кода программы при объединении нескольких объектных модулей в программу или перемещения модуля в ОП.

Форма модификации: <имя внешней ссылки> ±

На каждое место кода программы, где указано значение внешней ссылки (используется внешняя ссылка) или значение перемещаемого выражения (перемещаемой переменной), создается отдельная карта модификации.

  1. Карта конца модуля

Е<точка входа>

Точка входа – адрес первой выполняемой команды.

Основная задача, решаемая ассемблером – это посторенние машинных кодов команд по текстовым операторам. Для построения кода команды необходимо знать:

· код операции;

· типы и значения операндов.

Если вся эта информация известна, то транслятор может сформировать код программы. Это в случае, если операнды отсутствуют, являются константами или регистрами.

В случае использования символического имени в операнде, возможны два случая:

1. Если соответствующая переменная или метка уже встретились в предыдущих операторах, то их значение известно (адрес) и можно генерировать код команды.

2. Переменная или метка еще не встретились, значит, их значение не известно, следовательно, построить код команды невозможно.

Поэтому задача построения кода программы решается в два просмотра.

Задача первого просмотра:

Распределить память для программы и определить значения переменных или меток.

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

Литералы – это константы длиной более слова, а, следовательно, они не могут быть вписаны в команды. Транслятор отдельно самостоятельно выделяет память для таких констант и запоминает в таблице адрес памяти, где расположено значение константы, а в команде вместо константы подставляет ссылку на адрес памяти.

Задача второго просмотра:

  1. Формирование кода программы (кодов команд).
  2. Формирование всех карт объектного модуля и создание объектного кода или объектного модуля.
  3. Формирование или дополнение протокола трансляции (файла листинга).

В процессе трансляции используется ряд постоянных и переменных структур данных (таблиц).

2.1 Постоянные таблицы

  1. Таблица форматов команд (ТФК)

Содержит информацию о коде операции, длине команды и формате кодирования команды. Состоит из полей:

· мнемокод команды;

· тип первого операнда;

· тип второго операнда;

· длина команды;

· код операции (обычно значение первого байта);

· вид формата команды (одно или несколько полей).

Ключ таблицы составной и включает в себя первые три поля.

Таблица используется при первом просмотре для определения длины команды, а также для определения формата и кода операции.

Таблица заполняется ???? и не изменяется в процессе трансляции.

  1. Таблица регистров

Предназначена для указания имен регистров, их типа и кода. Содержит поля:

· имя регистра;

· код (номер) регистра;

· тип регистра.

Таблица используется на первом просмотре для определения типа регистров, на втором просмотре – код регистра (???).

Ключом является имя регистра.

2.2 Переменные таблицы

  1. Таблица символических имен

Предназначена для хранения информации об идентификаторах переменных, констант и меток, оставшихся в программе. Содержит поля:

· имя (идентификатор);

· значение (для переменной и метки это адрес, для переменной – ее значение);

· перемещаемость. Значение переменной перемещаемо, если адрес (переменная, метка). Если это константа, то не перемещаема;

· тип переменной;

· длина значения переменной.

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

  1. Таблица литералов

Предназначена для хранения информации о длинных константах. Содержит такие же поля, как таблица символьных имен, но вместо имени переменной используется сама запись константы. Далее все то же, что в ТСИ.