Вход в систему

Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров"

33. Структура объектных файлов. Формат записи привязки (FIXUPP)

 

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

Общий формат записи следующий:

Запись FIXUPP может определять ноль и более привязок, каждая из которых обращается к адресному полю, содержащемуся в предыдущей записи данных. Запись данных может предшествовать нескольким записям FIXUPP, обращающимся к ней. Каждая привязка определяется в поле fixup следующими четырьмя типами данных - адресное поле, режим, цель и фрагмент. Цель и фрагмент могут быть полностью определены как полем fixup, так и ссылкой на предыдущее поле thread.

Поле thread определяет текущие цель или фрагмент, к которым впоследствии можно ссылаться. Как только в поле thread определены цель или фрагмент, любое поле fixup, следующее за ним (в той же или последующих записях FIXUPP), может обращаться к цели или фрагменту, пока другое поле thread с тем же типом ( D ) и номером (0-3) не появится в той же или другой записи FIXUPP.

  1. thread
    Это поле имеет следующий формат:



    • Поле trd dat представляет собой байт со следующей структурой:



      Бит D определяет тип поля thread. Если D=0, то поле определяет цель. Если D=1, то поле определяет фрагмент.

      Битовое поле method содержит номер метода определения цели (D=0) или фрагмента (D=1), т.е. Т0, Т1, T2, T4, T5, T6 или F0, F1, F2, F4, F5. Как было описано выше, метод определяет тип используемого индекса (если используется).

      Битовое поле trdnum содержит номер от 0 до 3 включительно и ассоциирует этот номер поля thread с фрагментом или целью, определяемым в поле thread.

    • Поле index содержит индекс. Это может быть индекс сегмента, группы или внешнего имени, в зависимости от метода, указанного в поле method. Если указаны методы F4 и F5, то поле index отсутствует.

  2. fixup
    Это поле имеет следующий формат:



    • Два байта поля locat имеют следующую структуру:



      Бит М указывает режим привязки:
      М=0 - внутрисегментный
      М=1 - межсегментный
      Примечание. Внутрисегментный режим не применим для записей LIDATA.

      Битовое поле loc (3 бита) определяет тип привязываемого адресного поля, содержащегося в предшествующей записи данных:
      0 - младший байт;
      1 - смещение;
      2 - база;
      3 - указатель;
      4 - старший байт;
      5 - смещение (определяется загрузчиком).
      Все другие значения не разрешены.

      Поле data record offset содержит число от 0 до 1023 включительно, определяющее смещение адресного поля в предшествующей записи данных. Смещение вычисляется относительно первого байта данных.

      Примечание. Если предшествующей записью является запись LIDATA, то вполне возможно, что смещение будет указывать на поля repeat count или block count блока повторяемых данных. В результате такой ошибочной ссылки действия сборщика не определены.

    • Байт fix dat имеет следующий формат:



      Бит F означает следующее:
      F=0 - Фрагмент определен в битовом поле frame.
      F=1 - Фрагмент определен в поле thread.

      Битовое поле frame может интерпретироваться двояко, в зависимости от значения бита F:
      F=0 - поле frame указывает метод определения фрагмента 0-5, т.е. F0-F5.
      F=1 - поле frame содержит номер поля thread, где дано определение фрагменту (поле thread может может находится в этой же или в одной из предшествующих записей FIXUPP).

      Бит Т означает следующее:
      Т=0 - цель определена в поле fixup.
      Т=1 - цель определена в поле thread.

      Бит Р означает следующее:
      Р=0 - требуются данные о смещении цели (методы Т0, Т1 и Т2).
      Р=1 - данные о смещении цели не требуются.

      Битовое поле target может интерпретироваться двояко, в зависимости от значения бита Т:
      Т=0 - поле target содержит число 0-3 включительно, соответствующее методам Т0, Т1, Т2 или Т4, Т5, Т6, в зависимости от значения бита Р.
      Т=1 - поле target содержит номер поля thread, где дано определение цели.

    • frame datum содержит индекс сегмента, группы или внешнего имени для спецификации фрагмента. Это поле отсутствует, если фрагмент определен в поле thread (F=1), или если он определен методами F4, F5 или F6.

    • target datum содержит индекс сегмента, группы или внешнего имени для спецификации цели. Это поле отсутствует, если цель определена в поле thread (T=1).

    • target displacement содержит 16-битное смещение, требуемое для определения цели методами Т0, Т1 и Т2. Если Р=1, то это поле отсутствует.

Введение
Причины использования языка ассемблер
Причины неиспользования языка ассемблер
Синтаксис ассемблера
Системное программное обеспечение и структура ЭВМ
Программная модель процессора Intel 8086
Организация работы памяти
Операнды
Адресация операндов
Формат машинных команд
Команды переходов
Типы ассемблеров. Функции ассемблера
Ассемблер по схеме 1А / ОП
Ассемблер по схеме 1А / МД
Двухпросмотровый ассемблер
Многопросмотровый ассемблер
Загрузчик
Структура объектных файлов. Основные понятия
Идентификация модуля и атрибуты
Концепция привязки
Объектный файл. Последовательность записей
Объектный файл. Формат записей
Формат записей THEADR и LHEADR
Формат записи LNAMES
Формат записи SEGDEF
Формат записи GRPDEF
Формат записи PUBDEF
Формат записи COMDEF
Формат записи LOCSYM
Формат записи EXTDEF
Формат записи LINNUM
Формат записи LEDATA
Формат записи LIDATA
Формат записи FIXUPP
Формат записи MODEND
Формат записи комментариев


исполнялось 0,316934 c, запросов к базе 6