ZX Format
#03
29 февраля 1996 |
|
IS-DOS - "Формат объектных модулей *.obj IS-DOS Ассемблера".
Рубрика "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.
Примеры записи выражений:
Выражение
<MET+1>/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+1>,
где 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 знаков.
________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября