Лекции по курсу "Проектирование ассемблеров, компоновщиков, макропроцессоров"
27. Структура объектных файлов. Формат записи определения имен 'communal' (COMDEF)
Запись COMDEF содержит список из одного или более имен 'communal', определяющих переменные типа 'communal'. Переменная типа 'communal' - это инициализированная переменная, чье конечное положение и размер не определены во время компиляции.
Переменные типа 'communal' сходны с блоками 'common' языка ФОРТРАН, т.е. при сборке объектных модулей, каждый из которых объявляет переменную типа 'communal', размер памяти, отводимый переменной, равен размеру наибольшей из них. В языке СИ все инициадизированные переменные 'public' имеют тип 'communal'. Рассмотрим следующий пример объявления переменных типа 'communal' в языке СИ:
char array[4] /* в файле а.с */
char array[1] /* в файле в.с */
char array[1024] /* в файле с.с */
При сборке объектных модулей, полученных из файлов а.с, в.с и с.с, сборщик выделит 1024 байта для символьного массива "array".
Запись COMENT класса 161 должна предшествовать в модуле записи COMDEF.
- communal name
В этом поле содержится имя переменной типа 'communal', длиной в один или несколько символов.
Такие имена рассматриваются как внешние и упорядочены вместе с внешними именами. Таким образом, обращение к ним осуществляется также, как и к внешнему имени через индекс (cм. описание записи EXTDEF). - type index (индекс типа) игнорируется сборщиком Microsoft.
- data segment type - однобайтовое поле идентифицирует сегмент данных, в котором находится переменная типа 'communal' и может содержать следующие значения:
62h(FAR) - переменная находится в текущем сегменте данных.
61h(NEAR) - переменная находится не в текущем сегменте данных. - communal length содержит длину переменной типа 'communal' в соответствии со значением поля data segment type.
Если значение поля data segment type равно 62h, то длина представлена в байтах. Если 61h, то описываемое поле имеет следующий формат:
Формат любого поля длины выглядит следующим образом:
Первый формат (один байт) может содержать значение от 0 до 127.
Второй формат имеет лидирующий идентификационный байт 81Н и содержит значение в следующих двух байтах.
Третий формат имеет лидирующий идентификационный байт 84Н и содержит значение в следующих трех байтах.
Четвертый формат имеет лидирующий идентификационный байт 88Н и содержит знаковое значение в следующих четырех байтах.
Совпадающее с определением переменной типа 'communal' определение в PUBDEF затирает определение переменной типа 'communal'. Два определения переменной типа 'communal' совпадают, если совпадают имена в их определениях. Если два совпадающих определения различаются отношением к текущему сегменту ( FAR и NEAR ), то сборщик выбирает NEAR.
Если переменная NEAR, то ее размер равен наибольшему из размеров, указанных для нее. Если переменная FAR, то в случае различия размеров элементов массива сборщик выдает предупреждение. Иначе размер переменной равен размеру элемента, умноженному на наибольшее указанное количество элементов. Кроме того, сумма размеров всех переменных NEAR не должна превышать 64К, а сумма размеров всех переменных FAR - размер адресного пространства машины.
Переменная FAR, размер которой превышает 64К (HUGE), размещается в последовательных сегментах (для 8086) или секторах (для 80286). Никакие другие данные не могут размещаться в сегментах, занимаемых HUGE-переменной типа 'communal'.
Если сборщик находит совпадающие определения 'communal' - переменных HUGE и NEAR, то он выдает предупреждение, так как NEAR-переменная не может иметь размер больше 64К.
Причины использования языка ассемблер
Причины неиспользования языка ассемблер
Синтаксис ассемблера
Системное программное обеспечение и структура ЭВМ
Программная модель процессора Intel 8086
Организация работы памяти
Операнды
Адресация операндов
Формат машинных команд
Команды переходов
Типы ассемблеров. Функции ассемблера
Ассемблер по схеме 1А / ОП
Ассемблер по схеме 1А / МД
Двухпросмотровый ассемблер
Многопросмотровый ассемблер
Загрузчик
Структура объектных файлов. Основные понятия
Идентификация модуля и атрибуты
Концепция привязки
Объектный файл. Последовательность записей
Объектный файл. Формат записей
Формат записей THEADR и LHEADR
Формат записи LNAMES
Формат записи SEGDEF
Формат записи GRPDEF
Формат записи PUBDEF
Формат записи COMDEF
Формат записи LOCSYM
Формат записи EXTDEF
Формат записи LINNUM
Формат записи LEDATA
Формат записи LIDATA
Формат записи FIXUPP
Формат записи MODEND
Формат записи комментариев