[an error occurred while processing this directive]
  ПАКЕТ ПРИКЛАДНЫХ ПРОГРАММ "ШКОЛЬНИЦА"

 К О М П О Н О В Щ И К   П Е Р Е М Е Щ А Е М Ы Х   П Р О Г Р А М М 

   РУКОВОДСТВО ПРОГРАММИСТА


 1. ОСНОВНЫЕ СВЕДЕНИЯ

 Компоновщик перемещаемых программ (LINKER) предназначен для компоновки объектных
программ, полученных различными способами на ПЭВМ Агат.

 1.1. Объектные программы
 Объектная (двоичная) программа - это любая последовательность байтов, т.е.
информация, рассматриваемая как содержимое непрерывного участка машинной памяти.
Это может быть как программа в машинных кодах, так и другая двоичная
информация (например, графическая), а также любая их смесь.
 Абсолютная объектная программа считается связанной с определенным
участком памяти: она корректна только при размещении с некоторого начального
адреса. Эта связь возникает, когда в объектной программе содержатся абсолютные
адреса ее внутренних частей (например, в командах абсолютного перехода).
При загрузке такой программы с другого адреса ссылки внутри нее нарушаются.
 Перемещаемая объектная программа не зависит от места размещения: она либо не
содержит абсолютных ссылок внутрь себя (например, графическая информация), либо
содержит дополнительную информацию, позволяющую при размещении с конкретного
адреса выполнить их пересчет (настройку).

 1.2. Создание объектных программ
 Абсолютные программы порождаются Ассемблером ДОК "Школьницы", а также при
записи участка памяти командами BSAVE из DOS 3.3 и [SAVE из Отладчика ДОК.
 Перемещаемые программы порождаются Ассемблером при указании
в тексте исходной программы псевдокоманды REL. Одновременно для них создаются
таблица перемещения и таблица внешних меток. Формат таблиц приведен в Приложении 1.
 На диске абсолютные программы хранятся в К- и В-файлах, перемещаемые - в
П-файлах (DOS 3.3 выдает их в каталоге, как R-файлы). Файлы этих типов тоже
называются абсолютными или перемещаемыми объектными файлами.

 1.3. Компоновка объектных программ
 Компоновкой называется сборка раздельно подготовленных объектных программ
(модулей, подпрограмм, данных) в единый комплекс. Она сводится к выполнению
одного или нескольких из следующих действий:
 - физическое склеивание нескольких программ в одну,
 - настройка перекрестных ссылок между ними для взаимодействия,
 - настройка программы на другое место размещения в памяти.
 LINKER позволяет проводить компоновку в несколько этапов с созданием
промежуточных объектных программ. Окончательный результат компоновки -
абсолютная объектная программа, готовая к запуску.

 1.4. Задание перекрестных ссылок в программах
 Перекрестная ссылка - это ссылка из одной программы на метку, описанную в
другой программе. Такая метка называется глобальной.
 Метка объявляется глобальной с помощью псевдокоманды ENTRY.
 Использование глобальной метки в другом файле описывается псевдокомандой
EXTRN.
 При создании перемещаемого файла все метки, описанные в данной программе
с помощью ENTRY и EXTRN, собираются в таблицу глобальных меток, которая используется
при компоновке. При создании абсолютного файла таблица не создается.


 2. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

 Входными данными Компоновщика являются объектные файлы, подлежащие сборке, и
входная строка, в которой при вызове Компоновщика указываются имена этих
файлов со списками атрибутов.
 Выходными данными Компоновщика являются:
 а) объектные файлы, содержащие:
 - абсолютную программу, готовую к загрузке и исполнению;
 - перемещаемую программу, таблицу перемещения и таблицу глобальных меток,
пригодные для повторной обработки Компоновщиком;
 - отдельную таблицу глобальных меток;
 б) сводка всех глобальных меток и их новых адресов на экране монитора;
 в) текстовый файл, содержащий ту же сводку.


 3. ОБРАЩЕНИЕ К ПРОГРАММЕ

 3.1. Вызов Компоновщика
 Вызов Компоновщика может осуществляться из Отладчика ДОК,
для чего необходимо запустить программу LINKER:
 > [RUN LINKER
 После чего на запрос "?" ввести входную строку.
 Другой способ запуска - записать команду вызова и входную строку в
текстовом файле (например, с именем LINK):
 [RUN LINKER
 входная строка
 Тогда для запуска достаточно исполнить команду:
 > [EXEC LINK

 3.2. Формат входной строки
 Входная строка имеет вид:
 файлР [ атрР ] = файл1 [ атр1 ] , ... , файлN [ атрN ]
где файлР - имя файла-результата, файл1-файлN - имена собираемых файлов,
[ атр ] - необязательные списки атрибутов каждого файла.
 Полный список атрибутов файла-результата:
 [ Axxxx, К, П, R, B, M, T, Cметка, Sметка ]
        где xxxx - шестнадцатеричное число.
 Полный список атрибутов собираемых файлов:
 [ M, X ]
 Порядок атрибутов произволен, однобуквенные атрибуты можно не разделять.

 3.3. Атрибуты файла-результата
 Axxxx - задать начальный адрес новой объектной программы, по умолчанию - ¤800.
 К,П,R,B - задает тип объектного файла и, соответственно, вид объектной программы. 
Атрибуты П и R равнозначны. По умолчанию задан атрибут К.
 M - записать таблицу перемещения и таблицу глобальных меток в отдельный перемещаемый
файл, имя которого образуется приписыванием бувы X к имени файла-результата
(см. примеры в 4.).
 Т - записать листинг (сводку глобальных меток новой объектной программы и их
адресов) в отдельный текстовый файл, имя которого образуется приписыванием
буквы M спереди к имени файла (** в данной версии не реализовано **).
 C,Sметка - задать стартовую метку: первой командой нового файла будет записан
переход на указанную метку (** в данной версии не реализовано **).

 3.4. Атрибуты собираемых файлов
 M - не включать объектную программу из данного файла в файл-результат. Фактически
используются только определения глобальных меток. По умолчанию включается.
 X - не включать глобальные метки данного файла в список глобальных меток файла-
результата. По умолчанию включаются.


 4. ПРИМЕРЫ КОМПОНОВКИ ПРОГРАММ

 Пусть в файлах ПРИМЕР1, ПРИМЕР2, ПРИМЕР3 находятся, соответственно, следующие
программы:
AAA: LDA BBB  BBB: LDA CCC  CCC: LDA AAA
 STA CCC   STA AAA   STA BBB
 RTS   RTS   RTS

 Задача состоит в том, чтобы объединить их в одну объектную программу.
 Вставим в каждую программу какой-нибудь ORG, например, с адреса ¤800,
а также псевдокоманду REL.
 Для обозначения перекрестных ссылок на метки ААА, ВВВ, CCC между файлами
используем псевдокоманды EXTRN и ENTRY.
 В окончательном виде файлы будут иметь вид:
 ORG ¤800  ORG ¤800  ORG ¤800
 REL   REL   REL
 EXTRN BBB  EXTRN AAA  EXTRN AAA
 EXTRN CCC  EXTRN CCC  EXTRN BBB
 ENTRY AAA  ENTRY BBB  ENTRY CCC
AAA: LDA BBB  BBB: LDA CCC  CCC: LDA AAA
 STA CCC   STA AAA   STA BBB
 RTS   RTS   RTS

 При ассемблировании будут созданы 3 перемещаемых файла (пусть их имена -
ПР1, ПР2, ПР3).
 Для сборки их необходимо набрать:
     > [RUN LINKER
 и на дополнительный запрос ввести следующую входную строку:
     ?> КОДФАЙЛ [A2000] = ПР1,ПР2,ПР3     
 По окончании сборки будет выдан такой листинг сборки:
 КОДФАЙЛ:2000-2014 - диапазон адресов, в котором лежит новая программа
 AAA  2000  - новые адреса всех глобальных меток, которые
 BBB  2007    вошли в эту программу
 CCC  200E

 Рассмотрим еще несколько вариантов сборки той же программы:
 1. ПЕРФАЙЛ1 [A2000,П] = ПР1 [X], ПР2 [X], ПР3 [X]
 Глобальных меток в новом файле не будет. В отличие от программы КОДФАЙЛ эта
программа перемещаема (атрибут П) и не готова к немедленному запуску. Но зато ее
можно легко настроить на произвольный адрес:
 КОД_ИЗ_ПЕР1 [A2015] = ПЕРФАЙЛ1
 КОД_ИЗ_ПЕР2 [A202А] = ПЕРФАЙЛ1
 а также переписать в формат B-файла:
 BIN_ИЗ_ПЕР [A203F,B] = ПЕРФАЙЛ1

 2. ПЕРФАЙЛ2 [П] = ПР1, ПР2, ПР3
 В этом перемещаемом файле будут глобальные метки AAA,BBB,CCC.
 
 3. КОДФАЙЛ2 [A2000,М] = ПР1, ПР2, ПР3_
 Здесь будет создан К-файл КОДФАЙЛ2, содержащий то же, что файл КОДФАЙЛ,
но дополнительно будет создан перемещаемый файл ХКОДФАЙЛ2, в котором нет
никакого кода, но есть таблица перемещения и таблица глобальных меток к
файлу КОДФАЙЛ2. Теперь можно, во-первых, исполнить данную объектную программу
(запустить КОДФАЙЛ2), а во-вторых, использовать ее для дальнейшей сборки:
 СБОРНАЯ [A3000,П] = НОВАЯ, ХКОДФАЙЛ2
 Здесь, в предположении, что НОВАЯ программа использует метки ААА,ВВВ,CCC,
будет создан файл со ссылками "в никуда", т.к. сами эти программы отсутствуют.
Это может оказаться удобным при ссылке на резидентную программу (например, ОС).

 5. Как видно из примеров, только перемещаемые файлы могут при сборке
действительно перемещаться. Компоновщик допускает объединение и абсолютных
файлов (возможно, вперемешку с перемещаемыми), но при этом должно строго
выполняться правило состыковки: конец предыдущего файла совпадает с началом
следующего.
 Так, абсолютные файлы КОДФАЙЛ, КОД_ИЗ_ПЕР1, КОД_ИЗ_ПЕР2, BIN_ИЗ_ПЕР из
примеров выше можно скомпоновать именно в таком порядке, и ни в каком ином:
 СУПЕРКОД = КОДФАЙЛ, КОД_ИЗ_ПЕР1, КОД_ИЗ_ПЕР2, BIN_ИЗ_ПЕР
 Даже простое перемещение их недопустимо: обращение
 СУПЕРКОД [A3000] = КОДФАЙЛ, КОД_ИЗ_ПЕР1, КОД_ИЗ_ПЕР2, BIN_ИЗ_ПЕР
 даст ошибку.

             Приложение 1
 ФОРМАТ ПЕРЕМЕЩАЕМЫХ ФАЙЛОВ

 Байты файла Содержимое

 0-1  Начальный адрес A
 2-3  Длина кодовой части K
 4-5  Суммарная длина таблиц T
 6- 6+K-1 Кодовая часть программы
 6+K -... Таблица перемещения
 ... - ... Таблица глобальных меток

      Приложение 2
 СООБЩЕНИЯ КОМПОНОВЩИКА

 #n в сообщениях ниже означает номер объектного файла во входной строке,
в котором произошла данная ошибка.

 ОШИБКА В ПАРАМЕТРАХ - ошибка в задании входной строки.

 МАЛО ПАМЯТИ: СВЯЖИТЕ ПО ЧАСТЯМ - не хватает оперативной памяти для хранения
таблиц Компоновщика. Рекомендуется собрать файлы в два приема с использованием
промежуточного файла.

 КОНЕЧНЫЙ АДРЕС > FFFF: #n - получившаяся программа выходит за границу памяти.
Рекомендуется собрать ее, указав меньший начальный адрес. 

 <метка> ПОВТОРЯЕТСЯ В #n - указанная метка определена дважды в разных файлах;
выдается номер файла каждого повторного определения.

 НЕ СТЫКУЕТСЯ #n - при компоновке абсолютных программ: начальный адрес файла #n
не совпадает с концом файла #n-1.

 МНОГО ИМЕН: #n - больше, чем 256 глобальных меток, при сборке недопустимо. 
[an error occurred while processing this directive]