<< Вернуться к содержанию





  поправка към глава 9.2.2. стр. 20:

         ИЗМЕНЕНИЯ И ДОПОЛНЕНИЯ
              к документу
  "UniASM - руководство пользователя"

  1. ИЗМЕНЕНИЯ п.9.2.2. - "SECT"

  Второй абзац следует читать:

  "Выражение не должно включать
неопределенный или внешний символ.  Если
выражение пропущено, секция формируется
с адреса, следующего за последним
адресом, занятым предидущей секцией.
Таким образом можно определить локальные
переменные в нулевой странице каждой
процедуры."


  2. ДОПОЛНЕНИЕ к п.9.2.6. - "MAIN"

  Директиву MAIN можно применить только
раз и только в одном из связываемых
модулей.


  3. НОВАЯ ГЛАВА



       11. РЕДАКТОР СвЯЗЕЙ ULINK

         11.1.  ВЫЗОВ РЕДАКТОРА

  Вызов редактора связей осуществляется
командой UniDOS-а:

      ULINK [/[c][p]] <modules>

где:
  c - опция формирования .CMD выходного
файла, если это возможно. Если опция
пропущена, формируется .PGM файл;

  p - опция выравнивания объектных
модулей на границе страницы;

  odules - список объектных модулей или
библиотек, которые должны быть связаны в
выполнимую программу. Имена в списке
указываются без расширений. По умолчанию
считается что мудули имеют расширение
имен .OBJ, а библиотеки - .LIB.

  В результате работы редактора связей
создается выполнимой файл (программа) с
именем, совпадающем с именем модуля,
содржащего директиву MAIN и с
расширением имени PGM или CMD, в
зависимости от отсутствия или наличия
опции "/c" (см. выше).




   11.2. СВЯЗЫВАНИЕ ОБЪЕКТНЫХ МОДУЛЕЙ

  Каждый объектный модуль состоит из
сегмента кода и сегмента данных

  Сегмент данных следует непосредственно
за сегментом кода и может содержать
ТОЛЬКО неинициализированные данные. Для
создания такого сегмента следует
применить директиву SECT в начале
сегмента данных.

  В процессе обработки редактором связей
сегменты кода и данных всех модулей
объединяются, соответственно.
Объединение осуществляется таким
образом, что при загрузке выполнимого
файла сводной сегмент данных
располагается непосредственно после
сводного сегмента кода.

  В сводные сегменты кода и данных
включаются только те модульные сегменты
соответствующего типа, к которым
существует обращение.

  Если генерируется CMD файл, программа
должна сама проверить существует ли
пространство памяти, достаточное для
размещения сегмента данных. В случае
генерации PGM файла такое соответствие
гарантируется.



    11.3. СООБЩЕНИЯ РЕДАКТОРА СВЯЗЕЙ

  Диагностические собщения даны в
алфавитном порядке.  После перевода
сообщения указаны причины, если они не
очевидны.

  Code too large - сводной сегмент кода
длиннее 64Kбайт.

  Data too large - сводной сегмент
данных длиннее 64Kбайт.

  Error in object table - ошибка в
таблице сдвигов объектного модуля.

  File too large - модуль длиннее
64Кбайт.

  Invalid entry point - неправильная
точка входа - точка входа CMD файла не
находуится в его начале.

  Invalid file format - неправильный
формат объектного модуля.

  No entry point given - не указана
точка входа - директива MAIN не введена.

  Out of memory - недостаточный
объем свободной памяти.

  Read error - ошипка при чтении файла.

  Too many entry points - много входных
точек - директива MAIN встечается более
одного раза.

  Too many object files - много
объектных файлов - в списке указано
более 256 имен объектных файлов.

  Write error - ошибка записи файла.


  4. НОВОЕ ПРИЛОЖЕНИЕ B.

          ФОРМАТ OBJ-ФАЙЛОВ

адрес             содержание
---------------------------------------
$00 (W) $5AA5;
$02 (W) $0001 (номер версии);
$04 (W) число внутренных (ENT)
        символов;
$06 (W) число внешних (EXT) символов;
$08 (W) длина сегмента кода;
$0A (L) сдвиг кода с начала файла;
$0E (W) сдвиг точки входа с начала файла
        - $FFFF означает, что нет точки
        входа;
$10 (W) длина сегмента данных;
$12-$1F 0

$20     - массив внутренных символов;
        - массив внешних символов;
        - код;

    (W) число сдвигов в массиве сдвигов;
        - массив сдвигов;

    (B) 0.



  ЭЛЕМЕНТ МАССИВА ВНУТРЕННЫХ СИМВОЛОВ:

$00-$0F - имя (в ASCIIZ - закончивает на
          0);
$10 (W) - значение;
$12 (W) - тип: >= 0 - относительный;
               < 0  - абсолютный.



   ЭЛЕМЕНТ МАССИВА ВНЕШНИХ СИМВОЛОВ:

$00-$0F - имя (в ASCIIZ - закончивает на
          0);
$10 (L) - 0.



        ЭЛЕМЕНТ МАССИВА СДВИГОВ:

$00 (B) тип: < 0 - внешний;
             >= 0 - не внешний;
        бит 0 = LSB;
        бит 1 = MSB;
            Если оба бита = 1 - WORD;
$01 (W) - значение - если не внешний
          символ;
        - индекс в массиве внешних
          символов - если внешний
          символ;
$03 (W) - сдвиг относительно начала
          кода. Если сдвиг больше длины
          кода, считается что это
          элемент сегмента данных.

  Элементы массива должны быть
расположены в возрастающем порядке
сдвигов.



  5. НОВОЕ ПРИЛОЖЕНИЕ C.

           Формат PGM-файлов

адрес             содержание
---------------------------------------
$00 (W) $A55A;
$02 (W) число слов таблицы сдвигов;
$04 (W) сдвиг кода с начала файла;
$06 (W) длина кода;
$08 (W) сдвиг входной точки с начала
        кода;
$0A (W) длина данных;
$0C-$0F 0
$10     начало таблицы сдвигов байтов
        релокации относительно начала
        кода.