ZX Format #03
29 февраля 1996
  IS-DOS  

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 знаков.
________________________________________



Другие статьи номера:

IS-DOS - "IS-DOS - начинающим" No 3

IS-DOS - "Оконная система IS-DOS".

IS-DOS - "Формат объектных модулей *.obj IS-DOS Ассемблера".

IS-DOS - "Формат таблицы локальных символов IS-DOS Ассемблера".

Авторы журнала - ZX-Format No.3

Железо - Исправление ошибки TR-DOS.

Железо - новая звуковая карта: General Sound.

Железо - новая модель Спектрума: Scorpion ZS 256 Turbo+.

Железо - о турбировании Спектрум-машин.

Железо - обзор модемов для ZX Spectrum.

Железо - Шинная архитектура Спектрума (концептуальная разработка).

Игрушки - "Last battle" (Последняя битва) подробное описание.

Игрушки - 48 утюгов (второй уровень).

Игрушки - десятка наиболее продаваемых в С.-Петербурге.

Игрушки - описание игры BATMAN-II.

Игрушки - что новенького: The Light Corridor, Jonny Quest in Doctor Zins, Bedlam, Bubble Dizzy, Navy Seals, Пираты.

Конкурс - конкурс на компьютерный анекдот.

Лотерея - лотерея для читателей журнала.

От авторов - о третьем выпуске журнала.

Отдохнём - HУ, ЮЗЕР, ПОГОДИ!

Отдохнём - глюкодром: Самые ОПЕЧАТКИ.

Помощь - Очередной трактат об очердной оболчке и не только.

Почтовый ящик - дискуссия.

Почтовый ящик - доска обьявлений.

Почтовый ящик - письма читателей.

Премьера - TASM 4.0 (Turbo ASseMbler for ZX-Spectrum 128k)

Премьера - Приключения ВИННИ ПУХА.

Программистам - Basic для всех №3.

Программистам - Адаптация игр: адаптация программ на диск.

Программистам - Адаптация игр: зыкрытые коды.

Программистам - адаптцация игр: бессмертия.

Программистам - ассемблер: Экскурс в анатомию ZX

Разное - Amiga: вопросы и ответы.

Разное - Амига: новости.

Разное - Перспективы П/О.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Тема - Новый перекресток - кое-что из сложностей игры The Castle.
Вступление - стихи и содержание номера.
Информация - От авторов

В этот день...   4 июля