Из журнала ZX Format #3, Санкт-Петербург, 03.1996 Рубрика "IS-DOS - программистам" No 3 Прокопенко С. В. под ред. Елисеева В. А. "Формат объектных модулей *.obj IS-DOS Ассемблера" ________________________________________ В этой статье рассматривается фор- мат объектных модулей, принятый в систе- ме IS-DOS и поддерживаемый IS-DOS Ассем- блером и компоновщиком объектных моду- лей link.com. Этот формат является офи- циальным стандартом IS-DOS. Если Вы за- хотите перенести в IS-DOS готовые объек- тные модули из других операционных сис- тем (например CP/M 80), или написать свой собственный транслятор какого-либо языка высокого уровня, мы настоятельно рекомендуем Вам придерживаться этого формата, что позволит добиться совмес- тного использования Ваших разработок с IS-DOS Ассемблером и упростит создание готовых библиотек процедур для IS-DOS. Статья адресована прежде всего программистам-профессионалам и разработ- чикам программного обеспечения, желающим создавать инструментальные средства программирования для IS-DOS. ________________ Файлы в формате *.obj создаются IS-DOS Ассемблером и служат входными файлами для компоновщика link.com. В задачу link.com входит создание загружаемого кодового модуля *.com из одного или нескольких объектных модулей, полученных трансляцией текстов программ. Объектный файл *.obj состоит из нескольких областей, с длинами и относи- тельными смещениями от начала файла, оп- ределенными в его первых 32 байтах (см. табл 1): Таблица 1. Описание областей объектного файла ---------------------------------------- смещ. длина значение ---------------------------------------- 0,1 (2) - ссылка на область гло- бальных символов модуля - область [1] (смещение от начала файла) 2,3 (2) - длина этой области 4,5 (2) - ссылка на область слож- ных относительных выра- жений, определяющих гло- бальные символы модуля - область [2] (смещение от начала файла) 6,7 (2) - длина этой области 8,9 (2) - ссылка на область про- граммного кода область [3] (смещение от начала файла) 10,11 (2) - длина этой области 12,13 (2) - ссылка на область ад- ресов настраиваемых ячеек модуля и остав- шихся невычисленными во время трансляции выра- жений, определяющих значения этих ячеек область [4] (смещение от начала файла) 14,15 (2) - длина этой области 16-29 (14) - резерв 30-31 (2) - контрольная сумма пер- вых 30 байт файла. --------------------------------------- Контрольная сумма считается стан- дартным для IS-DOS способом: в двухбай- товой ячейке суммируются значения от- дельных байтов файла. Далее в объектном модуле идут пере- численные выше области в названном по- рядке. Для компоновщика link.com важно, чтобы первой следовала область гло- бальных символов (со смещением от нача- ла файла = 32). Порядок следования ос- тальных областей не важен. ________________ Область 1. Глобальные символы, определенные в данном модуле. Все глобальные символы модуля поме- щаются в эту область в виде 16 байтовых записей в формате, близком к формату таблицы глобальных символов *.gtb. Отли- чия касаются только значений символов и тегов (*) этих значений. (см. табл. 2) -------------- (*) Тег (англ. tag - ярлык, зтикетка) - часть элемента данных (один или нес- колько разрядов слова), определяющая его тип. (прим. ред.) -------------- Таблица 2. Структура области глобальных символов. ---------------------------------------- смещ. длина значение ---------------------------------------- 0,1 (2) - ссылка на предыдущую запись 2,3 (2) - ссылка на следующую запись 4 (1) - число знаков в имени символа (N) 5 (N) - знаки имени символа (символы) 5+N (1) - тег значения символа 6+N (2) - значение символа ---------------------------------------- Возможные теги значения символа: 1 - символ определен через внешнее по перемещаемости выражение, которое должно быть записано в области 2 объектного модуля. В этом случае байты по смещению 6+N и 6+N+1 не определены. В остальных случаях само значение символа находится в слове по смещению 6+N. %10000000 - тег абсолютного значения символа. %1******* - тег относительного или сложного относительного значения символа, где ******* - степень от- носительности (см. описание ассем- блера п.п.3.5.1, перемещаемость при вычислении выражений). Относи- тельные значения определяются отно- сительно начала модуля. Степень относительности здесь - это число перемещений, т.е. число, опреде- ляющее сколько раз адрес модуля должен быть добавлен или вычтен к/из значения символа при компоновке на конкретный ад- рес. Это число определяется как 7-раз- рядное число со знаковым разрядом в би- те номер 6. Здесь бит 6 играет ту же роль, что и бит 7 в 8-разрядном знаковом числе. Таким образом, если 6 бит = 1, то адрес модуля будет не добавлен, а выч- тен из значения символа при компоновке. Например, после определения в ас- семблере $MET EQU -$ ($-ссылка на прог- раммный счетчик) $MET в объектном файле получит значение тега #FF, и при компо- новке адрес модуля будет вычтен из зна- чения $MET один раз. ________________ Область 2. Внешние по перемещаемости выражения для глобальных символов, определенных в данном модуле. Выражения должны быть записаны в постфиксной (*) форме, отделяться друг от друга кодом 9 и лежать в том же по- рядке, что и глобальные символы, ссылаю- щиеся на эти выражения. -------------- (*) Постфиксная форма записи выражений - это форма, при которой сначала записы- ваются операнды, а потом - операторы, например 2 4 + вместо 2 + 4. (Прим. ред.) -------------- Операнды записываются в стандар- тной форме (см. табл. 4 в разделе "Фор- мат выражений"). В качестве примера та- кого выражения можно привести следующее: Пусть MET - метка со смещением от начала модуля #33. Для глобальной метки $met EQU MET/256 в объектный файл будет помещено такое выражение в область 2 (hex формат): 80 33 00 80 00 01 2F. #33 256 / ________________ Область 3. Программный код модуля. Область должна содержать програм- мный код процессора с точностью до нас- траиваемых значений байтов и слов. При- чем должны быть определены все относи- тельные 2х байтовые значения. Байты, не определенные в модуле, или определенные как внешние, сложные относительные, а также относительные, но не 2х байтовой длины, могут иметь любое значение (ас- семблер записывает туда 0). ________________ Область 4. Адреса и значения настраиваемых ячеек модуля. Область состоит из записей, (воз- можны два типа), и должна оканчиваеться 4 байтами #FF. Типы записей: 1.Адреса 2-х байтовых ячеек с отно- сительным значением. Например, во фрагменте MET: LD HL,MET значение по адресу MET+1 будет простым относительным (в регистр загру- жается значение метки), и поэтому адрес MET+1 должен быть записан в 4 область как запись типа 1. Этот адрес представ- ляет собой смещение относительно начала области кода объектного модуля до нас- траиваемой ячейки. В этом случае нас- траиваемое относительное значение будет лежать по данному адресу в области кода модуля. Поэтому для настройки 2-х байто- вой ячейки достаточно знать ее адрес. Это,практически, наиболее часто встре- чающийся тип настраиваемых значений при компоновке модулей. 2. Все остальные адреса ячеек, зна- чения которых не определились до конца во время трансляции (вместе с выражения- ми, определяющими эти значения). Формат этой записи следующий (см. табл.3) Таблица 3 Формат адресов настраиваемых ячеек. ---------------------------------------- смещ. длина значение ---------------------------------------- 0,1 (2) - #FFFF - признак нача- ла записи для отличия от записи типа 1. 2 (1) - тег определяемого зна- чения: 0 - 2-х байтовое слово 1 - 1 - байтовая ячейка 2 - ячейка - аргумент команд короткого пере- хода типа JR AAA; JR CC,AAA; где CC-условие перехода. 3 - номер бита (для любых команд битовых операций) 4 - тип прерывания (аргу- мент команды IM ) 5 - номер рестарта (аргу- мент команды RST) 3,4 (2) - адрес настраиваемой ячейки (то же самое, что и в случае записи типа 1) 5-... ... - выражение в постфиксной форме (подробности см. ниже под заголовком "Фор- мат выражений"). ... (1) - код 9 - признак конца выражения. ---------------------------------------- Формат выражений. Для увеличения скорости вычисления выражений при компоновке их принято за- писывать в постфиксной форме, т.е. ког- да операторы следуют после своих аргу- ментов. Распознаются следующие операторы: Бинарные: + 2B сложение - 2D вычитание * 2A умножение / 2F деление & 26 поразрядное логическое "и". @ 40 поразрядное логическое "или". ! 21 поразрядное логическое исклю- чающее "или". ? 3F оператор MOD Унарные: , 2C минус (изменение знака числа) ^ 5E возведение в квадрат (2^) Формат записи аргументов следующий (см. табл 4.) Таблица 4. Формат операндов в выражениях. ---------------------------------------- смещ. длина значение ---------------------------------------- 0 1 - Тег значения аргумента. 1 2 - Числовое значение аргу- мента. или 1 N - Символьное значение аргумента длины в N зна- ков, применяется для включения в выражение неопределенных в модуле символов. N может быть от 1 до 6. ---------------------------------------- Типы тегов: Если старший бит - 1, то аргумент имеет числовое значение. %10000000 - значение аргумента аб- солютное %1******* - относительное или сложное относительное значение аргумента степени ******* (о степени см. опи- сание области 1). Если старший бит - 0, то аргумент яв- ляется неопределенным в модуле сим- волом, и тег определяет число пос- ледующих за ним знаков символа. Например, в теге %00000*** звездоч- ки означают число знаков в символе. Это число может быть от 1 до 6. Примеры записи выражений: Выражение /256&2^3, где MET - метка с относительным смеще- нием в модуле #10, будет выглядеть в объектном модуле как следующая строка в hex формате: 81 10 00 80 01 00 2B 80 00 01 2F MET 1 + 256 / 80 03 00 5E 26 3 2^ & 81 - тег относительного значения степе- ни 1 (для метки MET). 80 - тег абсолютного значения для чисел 1, 256 и 3. Выражение 2*, где MET - не определенный в модуле сим- вол, будет выглядеть в объектном модуле как следующая строка в hex формате: 80 02 00 03 4D 45 54 80 01 00 2B 2A 2 M E T 1 + * 80 - тег абсолютного значения для чисел 2 и 1. 03 - тег символьного значения для неоп- ределенного символа MET из 3 знаков. ________________________________________