Системное программирование. Конспект лекций

       

Формат объектного модуля


Объектный модуль, поступающий на вход Загрузчика должен в той или иной форме содержать:

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

Один из вариантов организации объектного модуля описывается ниже.

Объектный модуль состоит из записей четырех типов. В каждой записи первый байт содержит идентификатор типа записи, следующие 2 байта - размер записи. Количество и формат следующих байтов записи определяется ее типом.

Кодовая запись содержит адрес относительно начала модулей и коды программы. Кодовые записи строятся Ассемблером при генерации объектного кода - кодов команд и директив типа DC. Каждая кодовая запись начинается с адреса (относительно начала модуля), с которого начинается размещение ее содержимого. Разрывы в линейном пространстве адресов могут быть обусловлены директивами выделения памяти без записи в нее значений (директивы типа BSS) или разрывами, управляемыми программистом (директивы типа ORG).

Запись связываний содержит один или несколько элементов Таблицы внешних символов. Элемент Таблицы внешних символов имеет следующий формат:

Ассемблер формирует новые элементы Таблицы перемещений при обработке директив типа SEGMENT, ENT, EXT.

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

Относительный адрес и длина - адрес и длина того кода, который должен быть модифицирован. Имя символа - имя из Таблицы внешних символов, которое прибавляется к значению кода или вычитается из него. Бит операции - признак операции сложения или вычитания. Ассемблер генерирует элемент Таблицы перемещений, когда обрабатывает адресные выражения. Адресное выражение может быть абсолютным (независящими от адреса загрузки) или перемещаемым (зависящими от адреса загрузки) .
Элементы Таблицы перемещений генерируются только для перемещаемых выражений. Рассмотрим адресное выражение:

ADDR1 - ADDR2

  • Если ADDR1 и ADDR2 являются именами, перемещаемыми внутри одного и того же сегмента SEGM (их адресные значения определяются относительно начала сегмента), то адресное выражение является абсолютным, так как его значение: SEGM+ADDR1 - (SEGM+ADDR2) не зависит от адреса сегмента. Для такого выражения элемент Таблицы перемещений не строится.
  • Если ADDR1 является именем, перемещаемым внутри сегмента SEGM, а ADDR2 - абсолютный адрес, то выражение является простым перемещаемым. В кодовое представление этого выражения записывается разность между относительным адресом в сегменте ADDR1 и абсолютным значением ADDR2. Для такого выражения строится элемент Таблицы перемещений:

    адрес SEGN + длина

    Загрузчик прибавит к содержимому кода адрес сегмента SEGM.
  • Если ADDR1 является внешним именем, а ADDR2 - абсолютный адрес, то выражение также является простым перемещаемым. В кодовое представление этого выражения абсолютное значение ADDR2. Элемент Таблицы перемещений для такого выражения содержит:

    адрес ADDR1 + длина

  • Если ADDR1 и ADDR2 являются внешним именем, то выражение является сложным перемещаемым. В кодовое представление этого выражения записывается 0. Для такого выражения строятся два элемента Таблицы перемещений:

    адрес ADDR1 + длина адрес ADDR2 - длина

    При загрузке к нулевому значению записанному по адресу адрес будет прибавлен адрес внешней точки ADDR1, а затем вычтен адрес внешней точки ADDR2.

    Запись окончания формируется Ассемблером при обработке директивы END, она содержит стартовый адрес программы. Естественно, эта запись должна быть заполнена только в одном из объектных модулей, составляющих программу.


    Содержание раздела