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

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

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

 

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

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

  1. segment attr

    Это поле содержит информацию о различных атрибутах сегмента и имеет следующий формат:



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



    Битовое поле A (выравнивание) указывает атрибут выравнивания ЛСЕГ:
    • A = 0 - SEGDEF описывает абсолютный ЛСЕГ.
    • A = 1 - SEGDEF описывает перемещаемый ЛСЕГ, выравниваемый на границу байта.
    • A = 2 - SEGDEF описывает перемещаемый ЛСЕГ, выравниваемый на границу слова.
    • A = 3 - SEGDEF описывает перемещаемый ЛСЕГ, выравниваемый на границу параграфа.
    • A = 4 - SEGDEF описывает перемещаемый ЛСЕГ, выравниваемый на границу страницы (256 байт).

    Если A = 0, то поля frame number (номер фрагмента) и offset (смещение) присутствуют. Сборщик Microsoft linker поддерживает использование абсолютных сегментов только для адресации, например, для определения стартового адреса ПЗУ и определения символических имен вместо адресов ПЗУ.

    Битовое поле C (сочетание) определяет атрибут сочетания ЛСЕГ. Для абсолютных сегментов C равно нулю. Для перемещаемых сегментов поле C кодирует способ сочетания сегментов (0, 1, 2, 3, 4, 5, 6 и 7).

    C = 2 - «public»
    C = 5 - «stack»
    C = 6 - «common»

    Если C = 0, то перемещаемый ЛСЕГ не может сочетаться. Значения 1 и 3 не определены. C = 4 и C = 7 - то же самое, что и C = 2.

    Битовое поле B = 0, если длина сегмента не равна 64 Кбайта. B = 1, если длина сегмента равна 64 Кбайта.

    Вит p всегда равен нулю.

  2. segment length

    Это поле содержит длину сегмента в байтах. Длина может равняться нулю. В этом случае сегмент не удаляется из модуля, т.к. для указания длины сегмента, равной 64 Кбайта, необходимо использовать бит B поля ACBP в поле segment attr, а описываемое поле сбросить ноль.

  3. segment name index

    Имя сегмента - это имя, которое программист или транслятор присваивает сегменту, например, code, data. Описываемое поле содержит индекс имени сегмента, т.е. указывает имя сегмента его индексом в списке имен записи LNAMES.

  4. class name index

    Имя класса - это имя, которое программист или транслятор присваивает сегменту. Если таковое не присвоено, то его длина равна нулю. Описываемое поле содержит индекс имени класса, т.е. указывает имя класса его индексом в списке имен записи LNAMES.

  5. overlay name index

    Имя наложения - это имя, которое транслятор и/или сборщик присваивает по указанию программиста сегменту. Длина этого имени может равняться нулю. Описываемое поле содержит индекс имени наложения, т.е. указывает имя наложения его индексом в списке имен записи LNAMES.

 

Пример: Эта запись идентифицирует сегмент стека.

98 07 00 74 00 01 04 01 01 E6

98:
   Запись определения сегмента (SEGDEF)

07 00:
   Длина записи 7 байт

74 (01110100):
   011: SEGDEF описывает перемещаемый логический сегмент, выравниваемый на границу параграфа.
   101: класс сочетания - Stack
       0: длина сегмента не равна точно 64 Кбайтам (65536).

00 01:
   Длина сегмента 256 байт.

04:
   Индекс имени сегмента: 04

01:
   Индекс имени класса: 01

01:
   Индекс имени оверлея: 01

E6:
   Контрольная сумма (равна 230).

Пример: SEGDEF для командного сегмента.

98 07 00 60 14 00 02 01 01 E9

98:
   Запись определения сегмента (SEGDEF)

07 00:
   Длина записи 7 байт

74 (01100000):
   011: SEGDEF описывает перемещаемый логический сегмент, выравниваемый на границу параграфа.
   000: класс сочетания - none
       0: длина сегмента не равна точно 64 Кбайтам (65536).

14 00:
   Длина сегмента 20 байт.

02:
   Индекс имени сегмента: 02

01:
   Индекс имени класса: 01

01:
   Индекс имени оверлея: 01

E9:
   Контрольная сумма (равна 233).

Как и всякое имя, заголовок начинается с байта длины. Именем модуля является то имя, которое было введено на запрос транслятора; если был указан путь, то он также войдет в имя T- или L-модуля.

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


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