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

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

19. Концепция привязки

 

Привязка - это адресная привязка объектного кода, запрашиваемая транслятором и выполненная сборщиком. Для специфицирования привязки необходимо указать четыре типа данных:

  1. Место и тип привязываемого адресного поля.
    Существует пять типов адресных полей:
    • Указатель (старшее слово имеет больший адрес).
    • База - это старшее слово указателя (сборщику безразлично, есть младшее слово указателя или нет).
    • Смещение - это младшее слово указателя (сборщику безразлично, следует ли за ним старшее слово).
    • Старший байт - это старший байт смещения (сборщику безразлично, предшествует ли младший байт).
    • Младший байт - это младший байт смещения (сборщику безразлично, следует ли за ним старший байт).


    Тип адресного поля указывается в поле LOC поля LOCAT записи FIXUPP, а его местоположение - в поле DATA_RECORD_OFFSET того же поля LOCAT.

  2. Один из двух возможных режимов привязки.
    Сборщик Microsoft linker выполняет привязку в одном из двух режимов:
    • Внутрисегментный режим используется для привязки 8-битовых и 16-битовых смещений, указываемых в командах CALL, JUMP и JUMP SHORT.
    • Межсегментный режим используется при всех других режимах адресации (8086).

  3. Цель, т.е. адрес в памяти к которому обращается адресное поле.
    Цель - это объект в MAS, к которому осуществляется обращение (точнее, самый младший байт этого объекта).
    Сборщик определяет цель одним из шести способов, причем три способа из указанных являются основными. Каждый из основных способов использует два вида данных: индекс Х и смещение D.

    Метод Определение цели
    (Т0) Х - это индекс сегмента. Цель - это D-й байт в логическом сегменте, идентифицируемом индексом сегмента
    (Т1) Х - это индекс группы. Цель - это D-й байт в логическом сегменте, идентифицируемом индексом группы
    (Т2) Х - это индекс внешнего имени. Этот индекс идентифицирует внешнее имя, которое, в свою очередь, дает адрес соответствующего байта. Целью является байт, D-й после указанного

    Остальные способы используют только один вид данных - индекс Х, т.е. смещение D считается равным нулю.

    Метод Определение цели
    (Т4) Х - это индекс сегмента. Цель - это первый байт в ЛСЕГ, идентифицируемом индексом сегмента
    (Т5) Х - это индекс группы. Цель - это первый байт в логическом сегменте указанной группы. Этот ЛСЕГ идет первым в группе
    (Т6) Х - это индекс внешнего имени. Целью является байт, который адресуется внешним именем, которое, в свою очередь, идентифицируется индексом внешнего имени

    Таким образом, определение цели можно записать:

    Номенклатура Метод
    Цель: SI (имя сегмента), смещение T0
    Цель: GI (имя группы), смещение T1
    Цель: EI (внешнее имя), смещение T2
    Цель: SI (имя сегмента) T4
    Цель: GI (имя группы) T5
    Цель: EI (внешнее имя) T6

    Примеры:    
    Цель: SI(CODE),1024   - 1025-ый байт в сегменте CODE.
    Цель: GI(DATAAREA)   - Позиция в MAS группы с именем DATAAREA.
    Цель: EI(SIN)   - Адрес внешней процедуры SIN.
    Цель: EI(PAYSCHEDULE),24   - 24-ый байт во внешней структуре данных PAYSCHEDULE.

  4. Фрагмент, к которому имеет место обращение.
    Каждая ячейка памяти, к которой происходит обращение, содержится в том или ином фрагменте. Этот фрагмент определяется содержимым сегментного регистра. Для формирования корректной ссылки к памяти сборщик должен знать цель и фрагмент, к которому выполняется обращение. Существует пять способов определения фрагмента. При этом используются индекс Х и данные (необязательно).

    Метод Определение фрагмента
    (F0) Х - это индекс сегмента. Фрагментом является канонический фрагмент логического сегмента, идентифицируемого индексом сегмента
    (F1) Х - это индекс группы. Фрагментом является канонический фрагмент группы
    (F2) Х - это индекс внешнего имени. Фрагмент определяется, когда сборщик находит определение внешнего имени как ’public’. При этом существует две ситуации:
    (F2a) Отсутствие ассоциированной группы. Фрагментом является канонический фрагмент логического сегмента, связанного с внешним именем.
    (F2c) ЛСЕГ входит в группу. Фрагментом является канонический фрагмент группы. (Группа указана в поле GROUP_INDEX записи PUBDEF)
    (F4) Нет индекса. Фрагмент - это канонический фрагмент логического сегмента, содержащего адресное поле.
    (F5) Нет индекса. Цель определяет фрагмент. Возможны три ситуации:
    (F5a) Цель определяет индекс сегмента. Фрагмент определяется способом (F0).
    (F5b) Цель определяет индекс группы. Фрагмент определяется способом (F1).
    (F5c) Цель определяет индекс внешнего имени. Фрагмент определяется способом (F2)


    Ниже приведена номенклатура определений фрагмента:

    Фрагмент: SI (Имя сегмента)   (F0)
    Фрагмент: GI (Имя группы)   (F1)
    Фрагмент: EI (Внешнее имя)   (F2)
    Фрагмент: Адресное поле   (F4)
    Фрагмент: Цель   (F5)
    Фрагмент: -   (F6)


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

 

Внутрисегментная привязка


Внутрисегментная привязка выполняется следующим образом.

  • Если адресное поле или цель находятся вне указанного фрагмента, то сборщик выдает предупреждение. В противном случае смещение цели относительно фрагмента будет равно сумме значений регистра IP на момент ссылки (указывает на байт, содержащий код следующей команды) и указываемого смещения.
  • Если адресное поле представляет собой смещение, то сборщик прибавляет его (по модулю 65536) к значению IP.
  • Если адресное поле - это младший байт, то сборщик прибавляет его (по модулю 256) к значению IP.
  • Если адресное поле - это база, указатель или старший байт, то намерения транслятора неясны, а действия сборщика не определены.

 

Межсегментная привязка


Межсегментная привязка выполняется следующим образом.
Неотрицательный 16-битовый номер, FBVAL, определен, как номер фрагмента или значение селектора, указанных при привязке. Знаковый 20-битный номер, FOVAL, определен, как расстояние между базой фрагмента и целью. Если этот 20-битный номер меньше 0 или больше 65535, то сборщик выдает сообщение об ошибке. В противном случае сборщик использует значения FBVAL и FOVAL для привязки адресного поля следующим образом:

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


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