РЕДАКТОР СВЯЗЕЙ
РУКОВОДСТВО ОПЕРАТОРА

1. ОПРЕДЕЛЕНИЯ

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

Программная секция

именованная секция, которая состоит из смежных блоков команд или данных, рассматривается как целое и может быть перемещена отдельно, что не нарушит логику программы. Может также называться П-секцией.

Объектный модуль

основные выходные данные Ассемблера или компилятора; могут быть скомпонованы с другими модулями и загружены в память в виде готовой к выполнению программы. Объектный модуль состоит из перемещаемого машинного кода, информации о перемещении и соответствующей таблицы глобальных имён, определяющей использование символов в программе.

Загрузочный модуль

программа в готовом для загрузки и выполнения формате.

Библиотечный файл

файл, содержащий один или несколько перемещаемых объектных модулей - стандартных подпрограмм - которые могут быть включены в другие программы.

Библиотечный модуль

модуль из библиотечного файла.

Корневой сегмент

сегмент оверлейной структуры, который после загрузки остаётся резидентным в памяти во время выполнения программы.

Оверлейный сегмент

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

Глобальный символ

глобальное значение или глобальная метка.

Нижняя память

физическая память от 0 до 28K слов.

Расширенная память

физическая память свыше 28K слов.

Составное перемещение

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

2. НАЗНАЧЕНИЕ ПРОГРАММЫ И УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ

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

  1. присваивает абсолютные адреса;
  2. определяет внешние связи между модулями;
  3. создаёт блок управления, используемый при загрузке программ;
  4. если указано, формирует загрузочный модуль оверлейной структуры;
  5. включает в загрузочный модуль требуемые модули из системной библиотеки и библиотек пользователя;
  6. если указано, создаёт карту загрузки;
  7. если указано, создаёт файл определений имён.

Редактор связей формирует загрузочный модуль за два прохода. Во время первого прохода создаётся таблица имён, в которую входят все имена программных секций и глобальные имена входных модулей, и обрабатываются модули корневого сегмента (часть программы, постоянно находящаяся в памяти). Во время второго прохода редактирование завершается и формируется загрузочный модуль. Загрузочный модуль может быть получен в одном из трех форматов: в формате отображения памяти (SAV) для заданий, выполняемых под управлением монитора одного задания, или для фоновых заданий, выполняемых под управлением монитора основного - фонового задания; в перемещаемом формате отображения памяти (REL) для основных заданий, выполняемых под управлением монитора основного - фонового задания или расширенной памяти; в абсолютном двоичном формате (LDA) для использования в перфоленточной операционной системе.

Редактор связей может работать в системах с минимальным объёмом оперативной памяти (16K слов). Дополнительная память используется для повышения скорости редактирования и/увеличения размера таблицы имён, формируемой редактором связей.

3. ОБЩИЕ ПОНЯТИЯ

Когда редактор связей обрабатывает оттранслированные или скомпилированные объектные модули, он создаёт загрузочный модуль, в котором присвоены все абсолютные адреса и отведена память под программные секции.

3.1. Абсолютная секция.

Абсолютная секция часто носит название ASECT, потому что объявляется директивой Ассемблера .ASECT. В карте загрузки абсолютная секция всегда идёт первой с именем .ABS. Абсолютная секция обычно заканчивается адресом 1000 (восьмеричное) и содержит следующую информацию:

Область связи с системой располагается в ячейках 0-377 и содержит данные, которые редактор связей использует для передачи управляющих параметров программы, и карту использования памяти (см. п. 5.2).

Стек - это область памяти, которую программа может использовать для временного хранения данных и связи с подпрограммами. Обращение к стеку осуществляется через регистр общего назначения R6 - указатель стека (SP).

3.2. Программные секции.

Программные секции следуют за абсолютной секцией. Набор признаков каждой секции контролирует распределение памяти и размещение секции в загрузочном модуле.

При обработке программной секции как единицы памяти программы редактор связей использует следующие параметры:

Следует отметить, что признаки, следующие за именем П-секции в карте загрузки, не являются частью имени; только имя отличает одну П-секцию от другой. Поэтому, если требуется скомпоновать вместе П-секции с одинаковыми именами, то и перечни признаков у них должны быть одинаковыми. Если редактору связей попадаются П-секции с одинаковыми именами, но разными признаками, то печатается предупреждение; в этом случае используются признаки из той П-секции, которая встретилась первой.

Таблица 1

Признак

Значение

Назначение

Доступ

RW

Разрешает чтение и запись

RO

Разрешает только чтение

Тип

I

Программная секция содержит команды и данные

D

Программная секция содержит данные

Размещение

GBL

Имя программной секции распознаётся за границами оверлейного сегмента. Редактор связей распределяет память для программной секции в корневом сегменте, если к программной секции обращаются из нескольких оверлейных сегментов. Если обращение к программной секции происходит из одного сегмента, редактор связей распределяет память для программной секции в этом оверлейном сегменте

LCL

Имя программной секции распознаётся внутри оверлейного сегмента

SAV

Имя программной секции распознаётся за границами оверлейного сегмента. Редактор связей всегда распределяет память для программной секции в корневом сегменте

Перемещение

REL

Базовый адрес программной секции перемещается относительно базового адреса программы

ABS

Базовый адрес программной секции равен 0

Распределение

CON

Распределения памяти, относящиеся к программной секции, располагаются одно за другим.

Размер выделяемой области равен сумме отдельных распределений

OVR

Распределения памяти, относящиеся к программной секции, перекрываются. Размер выделяемой области памяти равен размеру наибольшего распределения

ПРИМЕЧАНИЕ. В операционной системе ФОДОС признак доступа не используется.

Признаки размещения имеют смысл только для программ оверлейной структуры. Если признак размещения программной секции имеет значение GBL, то такая секция (глобальная секция) компонуется из модулей всей программы. Если глобальная секция размещена в модулях, входящих в разные сегменты, то редактор связей помещает её в корневой сегмент. Если признак размещения программной секции имеет значение LCL (локальная секция), то для каждого сегмента эта секция компонуется только из модулей, входящих в данный сегмент. Поэтому в разных сегментах могут быть разные программные секции с одним и тем же именем.

Значение признака распределения определяет адрес загрузки и объём памяти, отводимый программной секции. Если признак распределения программной секции имеет значение OVR, то адрес загрузки для всех частей этой секции, находящихся в разных модулях, будет один и тот же. Размер отводимой области памяти равен размеру наибольшей части этой секции. После редактирования в этой области загрузочного модуля будут находиться данные из последнего объектного модуля, содержащего данную секцию. Если признак распределения программной секции имеет значение CON, то все части этой секции, находящиеся в разных модулях, редактор связей размещает в загрузочном модуле последовательно друг за другом. Объём отводимой области памяти равен сумме размеров всех частей данной секции.

Любая П-секция с признаком D, содержащая обращения к меткам, значение которых чётно, должна начинаться с чётного адреса. Это достигается с помощью директивы Ассемблера .EVEN в конце П-секции с признаком CON каждого модуля. В противном случае редактор связей может выдать сообщение:

?LINK-F-WORD RELOCATION ERROR IN FILNAM

и редактирование связей не выполняется.

Если для программной секции признаки типа и распределения имеют значения I и CON соответственно, то для всех частей этой секции, находящихся в разных модулях, редактор связей отводит память, начиная с ближайшего чётного адреса. Если признаки типа и распределения имеют значения D и CON соответственно, то редактор связей отводит память, начиная с первого свободного байта. При этом может оказаться, что адрес этого байта нечётный.

Ассемблер и редактор связей преобразуют директиву Ассемблера .CSECT в эквивалентную директиву .PSECT с фиксированными признаками.

Неименованная .CSECT эквивалентна неименованной .PSECT с признаками RW, I, LCL, REL и CON.

Именованная .CSECT эквивалентна именованной .PSECT с признаками RW, I, GBL, REL и OVR. Эти секции и их признаки приведены в табл. 2.

Таблица 2

Секция

Признак доступа

Признак типа

Признак размещения

Признак перемещения

Признак распределения

CSECT

RW

I

LCL

REL

CON

Именованная CSECT

RW

I

GBL

REL

OVR

ASECT (.ABS)

RW

I

GBL

ABS

OVR

Именованная COMMON

RW

D

GBL

REL

OVR

VSECT (.VIR)

RW

D

GBL

REL

CON

Имена, присвоенные П-секциям, глобальными именами не являются, поэтому обращаться к ним как к именам нельзя.

Например:

MOV #PNAME,R0

Эта команда (PNAME - имя П-секции) неверна, и если не существует глобального символа PNAME, то редактор связей выдаст сообщение о неопределённом глобальном имени.

Имя П-секции и глобальное имя могут совпадать, но обрабатывает их редактор связей по-разному.

3.2.1. Порядок программных секций.

Редактор связей распределяет память для П-секций в том порядке, в каком они идут во входных модулях. В табл. 3 показано, в каком порядке следуют П-секции в файлах оверлейной структуры (и неоверлейной структуры).

Таблица 3

Файлы неоверлейной структуры

Файлы оверлейной структуры

Абсолютная (.ABS)

Абсолютная (.ABS)

Неименованная

Оверлейный драйвер (¤OHAND)

Именованная (NAME)

Оверлейная таблица (¤OTABL)

 

Неименованная

 

Именованная (NAME)

Если именованных секций несколько, то они располагаются в том порядке, в каком идут во входных файлах. Например, компилятор Фортрана размещает П-секции в основном модуле программы, так что свопинг USR может осуществляться на область команд и данных в нижней памяти, а не на область данных, которые необходимы для функции, вызвавшей USR.

Если размер неименованной П-секции - нулевой, то она в карте загрузки не указывается.

3.3. Глобальные имена.

Глобальные имена обеспечивают связь между модулями программы. Рассмотрим на примере алгоритм, по которому редактор связей обрабатывает глобальные имена. Пусть требуется объединить три объектных модуля, сведения о которых приведены в табл. 4.

Таблица 4

Модуль

Определение глобального имени

Обращение к глобальному имени

M1

B1, B2

А, В, С, X

M2

А, B1

B2

M3

 

B1

Обрабатывая модуль M1, редактор связей находит определение глобальных имён B1, B2 и обращение к глобальным именам А, В, С и X. Поскольку для А, В, С и X нет определений, то разрешение этих глобальных имён откладывается. Обрабатывая модуль M2, редактор связей находит определение А, что определяет обращение в модуле M1, и обращение к B2, которое разрешается непосредственно.

После обработки всех модулей остаются три неопределённых глобальных имени - В, С и X. Предположим, что X разрешено в результате поиска в системной библиотеке. Глобальные имена В и С остаются неопределёнными, и на терминал будет выдано соответствующее сообщение.

Глобальное имя B1 определено дважды, и на терминал будет выдано сообщение об этом. Редактор связей использует первое встреченное определение этого глобального имени. Редактор связей не выдаёт сообщений о многократном определении глобального имени, которое при каждом определении получает одно и то же абсолютное значение.

Более подробно об использовании глобальных имён см. в [1].

3.4. Оверлейные программы.

Возможность создания оверлейных программ предоставляет пользователю практически неограниченную виртуальную" память.

Для создания оверлейной структуры программу необходимо сегментировать, т.е. разделить на части (сегменты). Сегменты хранятся во внешней памяти и по мере необходимости вызываются в оперативную память для выполнения.

Редактор связей создаёт программы с оверлеями в нижней памяти (физическая память от 4 до 28K слов) и расширенной памяти (физическая память свыше 28K слов) в зависимости от того, в какую область памяти (нижнюю или расширенную) вызываются сегменты.

Программы с оверлеями в расширенной памяти предполагают наличие в системе расширенной памяти и монитора ХМ.

3.4.1. Оверлеи в нижней памяти.

Редактор связей создаёт оверлейную структуру с корневым сегментом, который всегда резидентен в оперативной памяти. Корневой сегмент является необходимой частью каждой оверлейной программы. Он содержит точку входа редактируемой программы, область стека, смешанные переменные и переменные, необходимые для многих сегментов. Поэтому корневой сегмент никогда не перекрывается другими сегментами.

Оверлейные сегменты пользователь группирует в зависимости от конкретной задачи. Каждой группе сегментов ставится в соответствие отдельная область оперативной памяти - так называемая оверлейная область. Редактор связей определяет размер этой области, равный размеру наибольшего оверлейного сегмента, соответствующего этой области. Во время выполнения программы сегменты, соответствующие данной оверлейной области, по мере необходимости загружаются в эту область, т.е. в одни и те же ячейки оперативной памяти.

Для создания программ с оверлеями в нижней памяти используется переключатель /O:N, где N - номер оверлейной области (см. п. 5.2.14).

Для обеспечения выполнения программ с оверлеями как в нижней, так и в расширенной памяти, редактор связей включает в загрузочный модуль небольшую подпрограмму (оверлейный драйвер) и необходимые для её работы таблицы. Драйвер и таблицы размещаются в загрузочном модуле, начиная с младшего адреса программы.

При создании программ с оверлеями как в нижней, так и в расширенной памяти должны соблюдаться следующие правила:

  1. для создания оверлейной структуры необходимо наличие системной библиотеки SYSLIB, т.к. она содержит оверлейный драйвер;
  2. оверлейные сегменты, предназначенные для одной области, должны быть логически независимыми, т.е. компоненты одного сегмента не могут обращаться к компонентам другого сегмента, предназначенного для той же области;
  3. глобальная программная секция, к которой обращаются несколько сегментов, размещается в корневом сегменте редактором связей (например, блоки COMMON или .PSECT с размещением GBL);
  4. объектный модуль из библиотечного файла будет автоматически размещён в оверлейном сегменте, если к нему обращается только этот сегмент. Если к библиотечному файлу обращаются несколько сегментов, редактор связей размещает его в корневом сегменте (если не указан переключатель /D, (см. п. 5.2.4). Редактор связей включает также в корневой сегмент все модули из библиотеки кратных определений и модули, указанные с помощью переключателя /I (см. п. 5.2.9);
  5. все блоки COMMON, которые инициализируются оператором DATA, должны быть подобным образом инициализированы в сегменте, в который они помещены;
  6. когда происходит обращение к оверлеям, весь путь возврата должен находиться в памяти. Это имеет место, если выполнены следующие правила:
    • из оверлейного сегмента можно обращаться (с ожидаемым возвратом) к элементам того же сегмента, к корневому сегменту или к оверлейным сегментам с большими номерами областей;
    • переходы к оверлейным сегментам (без ожидаемого возврата) можно осуществлять только в точки входа этих сегментов; однако при переходах нельзя обращаться к областям оверлеев с номерами меньшими, чем номер области, из которой было произведено последнее невозвращенное сообщение. Так, если обращение было осуществлено из третьей области, то нельзя обращаться к областям 1, 2 и 3 до тех пор, пока не будет произведён возврат в третью область;
    • обращения внутри сегмента области допускаются, а обращения к другому сегменту этой области не допускаются;
  7. передавать управление в оверлейные сегменты можно только в точки входа этих сегментов. Точкой входа оверлейного сегмента является глобальное имя, определённое в программной секции, для которой признак типа имеет значение I. Такие имена помечаются в карте загрузки символом "G". Например, если ENTER - глобальный символ в оверлейном сегменте, то первая команда действительна, а вторая недопустима:
    JMP ENTER
    JMP ENTER + 6
  8. использовать точки входа оверлейных сегментов можно только для передачи управления, а не для обращения к данным. Нарушение этого правила не выявляется редактором связей и может повлечь использование программой неверных данных;
  9. редактор связей не использует оверлейный драйвер при разрешении глобальных имён, определённых в программной секции, для которой признак типа имеет значение D. Это значит, что программа пользователя должна сама загружать в память соответствующие оверлейные сегменты перед обращением к имеющимся в них данным;
  10. для передачи управления в оверлейный сегмент нельзя использовать имя .CSECT. Эта команда не приводит к загрузке нужного сегмента в память. Для передачи управления от одного сегмента другому следует использовать только глобальный символ;
  11. оверлейные области должны задаваться в возрастающем порядке и являются только считываемыми. Когда один оверлейный сегмент в области заменяет другой, текущее состояние старого сегмента не запоминается, поэтому все таблицы, переменные и команды, которые должны оставаться неизменными, следует размещать в корневом сегменте;
  12. нельзя использовать в программе канал 17 (восьмеричное), поскольку по этому каналу считываются оверлеи;
  13. редактор связей не создаёт оверлейную таблицу входов для разрешения глобальных имён, определённых в программных секциях программ, написанных на языках ФОРТРАН и Ассемблер, т.к. редактор связей пересылает программные секции из оверлейного сегмента в корневой.

3.4.2. Оверлеи в расширенной памяти.

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

Преобразовать программу оверлейной структуры для работы с расширенной памятью обычно можно не прибегая к модификации программы. Оверлейный драйвер расширенной памяти и клавиатурный монитор содержат все программные запросы, необходимые для осуществления доступа к расширенной памяти (подробно об ограничениях, накладываемых расширенной памятью, см. [3]). Дополнительные данные для этих запросов содержатся также в оверлейных таблицах, так что доступ к расширенной памяти программа пользователя может осуществлять автоматически, не используя в программе запросы расширенной памяти.

Для создания программ с оверлеями в расширенной памяти следует использовать переключатель /V (см. п. 5.2.21).

Более подробно об использовании расширенной памяти см. [3].

3.4.2.1. Виртуальное адресное пространство.

Пользователь создаёт оверлейную структуру в расширенной памяти, считая, что ему доступны все 32K слов памяти (ячейки с 0 по 177777). В действительности это не так. Большой объём физической памяти (нижней памяти) занимают монитор (с ячейки 160000 вниз) и страница ввода – вывода (страница в-в) (ячейки 160000-177777). Абсолютная секция программы пользователя обычно располагается в ячейках с 0 по 500. Однако, в результате управления памятью можно создать такую структуру программы, которая позволяет использовать 32K слов памяти. Это пространство называется виртуальным адресным пространством. Аппаратура диспетчера памяти и монитор позволяют разместить часть 32K слов адресного пространства в расширенной памяти.

Виртуальное адресное пространство разделяется на 8 секций, называемых страницами, с номерами от 0 до 7. Каждая страница содержит 4K слов памяти. Обращение к странице осуществляется с помощью регистра активной страницы (РАС). Этот регистр содержит константу перемещения, которая управляет отображением каждой страницы в расширенную память.

Виртуальное адресное пространство показано на рис. 1.

177777

Страница 7

160000

Страница 6

140000

Страница 5

120000

Страница 4

100000

Страница 3

60000

Страница 2

40000

Страница 1

20000

Страница 0

0

Рис. 1

Каждый оверлей, который находится в расширенной памяти, должен начинаться на границе страницы. Для этого редактор связей автоматически округляет размер каждого сегмента.

3.4.2.2. Физическое адресное пространство.

При создании загрузочного модуля с оверлеями в расширенной памяти редактор связей определяет, каким образом каждый оверлей будет отображён в расширенную память. Программа редактор связей обрабатывает оверлеи в расширенной памяти не так, как оверлеи в нижней памяти (см. рис. 2 и рис. 3).

Физическое адресное пространство программы с оверлеями в нижней памяти показано на рис. 2.

ФИЗИЧЕСКОЕ АДРЕСНОЕ ПРОСТРАНСТВО
ПРОГРАММЫ С ОВЕРЛЕЯМИ В НИЖНЕЙ ПАМЯТИ

177777

Страница ввода - вывода

160000

Монитор

 

Свободная память

 

Оверлейная область 2
(сегменты 3 и 4)

 

Оверлейная область 1
(сегменты 1 и 2)

 

Корневой сегмент

 

Оверлейный драйвер

 

Абсолютная секция

 

Рис. 2

Как показано на рис. 2, оверлейные сегменты совместно используют соответствующие оверлейные области. Каждый оверлей считывается в свою область со вспомогательного запоминающего устройства после вызова.

Виртуальное адресное пространство программы с оверлеями в расширенной памяти (левая диаграмма) и физическое адресное пространство этой программы (правая диаграмма) показаны на рис. 3.

Как показано на рис. 3, в виртуальном адресном пространстве расположена одна виртуальная оверлейная область, начинающаяся на границе страницы (ячейки с 20000 по 37777). Области адресного пространства, которые отображаются в расширенную память, называются виртуальными оверлейными областями. Оверлейные сегменты, отображённые в расширенную память, занимают в расширенной памяти смежные области, называемые разделами. Таким образом, после вызова сегменты с 1 по 4 (рис. 3) находятся одновременно в расширенной памяти.

 

Виртуальное и физическое адресные пространства с оверлеями в расширенной памяти.

Рис. 3

3.4.2.3. Виртуальные и привилегированные задания.

Объём виртуального адресного пространства, распределённого для программы, зависит от типа программы.

Фоновые, основные и системные задания разделяются на:

  1. виртуальные;
  2. привилегированные.

Виртуальные задания могут использовать все 32K слов виртуального адресного пространства, но они не имеют прямого доступа к странице в-в, монитору, векторам и другим заданиям.

Привилегированные задания также могут использовать 32K слов памяти, но защищённые области (монитор, страница в-в, векторы) являются частью этого адресного пространства.

Виртуальные и привилегированные задания могут отображаться в расширенную память. Поэтому можно создавать как привилегированные задания (основные, фоновые, системные), так и виртуальные задания (основные, фоновые, системные) с оверлеями в расширенной памяти.

Более подробно об использовании виртуальных и привилегированных заданий см. [3].

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

Для вызова редактора связей с системного устройства следует ввести с терминала команду R LINK <ВК> после того, как монитор выведет на терминал точку.

После вызова редактор связей выводит на терминал звёздочку и ожидает ввода командной строки. Если в это время нажать клавишу <ВК>, то редактор связей выводит на терминал номер своей версии.

ПРИМЕЧАНИЕ. Операции, выполняемые редактором связей, могут быть выполнены монитором по команде LINK (см. [2]).

5. КОМАНДА ОПЕРАТОРА

5.1. Режим работы.

Режим работы редактора связей задаётся введением с терминала одной или нескольких командных строк. Формат первой командной строки:

[загрспф], [картспф], [опрспф]=обспф [,обспф...][/прк...]

формат последующих командных строк:

обспф [, обспф...] [ /прк...],

где

загспф

- спецификация файла загрузочного модуля (устройство, имя и тип файла);

 

картспф

- спецификация файла карты загрузки;

 

опрспф

- спецификация файла определений имён;

 

обспф

- спецификация объектного или библиотечного файла;

 

/прк

- переключатель (см. табл. 5).

Последующие командные строки используются:

  1. при создании оверлейных программ;
  2. если спецификации входных файлов не могут быть размещены в одной командной строке.

По умолчанию типом файла предполагается:

Указанные в командной строке устройства ввода - вывода должны быть устройствами с произвольным доступом. Исключение составляют устройства вывода для файла загрузочного модуля в формате LDA, файла карты загрузки и файла определений имён. Эти файлы могут быть выведены на любое устройство вывода системы.

Если в командной строке не указана спецификация какого-либо выходного файла, то редактор связей предполагает, что создание этого файла не требуется. Например, если в командной строке не указаны спецификации выходных файлов, то результатом работы редактора связей будут выдаваемые на терминал сообщения об обнаруженных ошибках (см. п. 7).

Для выхода из редактора связей и передачи управления монитору следует ввести команду СУ/C, если редактор связей ожидает ввода с терминала, или дважды СУ/C, если редактор связей выполняет редактирование.

Для повторного пуска редактора связей следует ввести с терминала команду REENTER.

После завершения редактирования редактор связей выводит на терминал звёздочку и ожидает ввода командной строки.

5.2. Переключатели.

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

Переключатели должны указываться в первой командной строке. Исключение составляют переключатели:

Таблица 5

Переключатель

Назначение

/A

Расположить глобальные имена в карте загрузки в алфавитном порядке

/B:N

Использовать значение N в качестве младшего адреса редактируемой программы (не допускается использование совместно с /H и /R)

/C

Ввести ещё одну командную строку (не допускается использование совместно с //)

/D

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

/E:N

Увеличить размер указываемой программной секции до N байтов

/F

Использовать для разрешения глобальных имён библиотеку SY:FORLIB.OBJ

/G

Изменить размер буфера библиотечного справочника

/H:N

Использовать значение N в качестве старшего адреса редактируемой программы (не допускается использование совместно с /B, /R, /Y и /Q)

/I

Включить в загрузочный модуль указываемые модули из библиотек, заданных в командной строке

/K:N

Занести значение N (N=2, 3 ... 28) по адресу 56 нулевого блока загрузочного модуля. Ограничивает отводимую по запросу .SETTOP память величиной NK. Не допускается использование совместно с /R

/L

Сформировать загрузочный модуль в формате LDA

/M [:N]

Использовать в качестве начального значения указателя стека значение указываемого глобального имени или значение N. Не следует использовать совместно с /R

/N

Включить в карту загрузки таблицу перекрёстных ссылок глобальных имён

/O:N

Сформировать оверлей в нижней памяти; N - номер оверлейной области. Не допускается использование совместно с /L

/P

Изменить размер таблицы имён библиотечных программ

/Q

Указать абсолютные базовые адреса программных секций. Не допускается использование совместно

с /H или /R

/R[:N]

Сформировать загрузочный модуль в формате REL: N - размер стека в байтах. Не допускается использование совместно с /B, /H, /K и /L

/S

Использовать максимально возможный объём памяти для таблицы имён (только в случае переполнения таблицы имён)

/T:N

Использовать в качестве точки входа редактируемой программы значение указываемого глобального имени или значение N

/U:N

Увеличить размер указываемой программной секции корневого сегмента так, чтобы размер корневого сегмента (в байтах) увеличился до величины, кратной N

/V

Позволяет использовать специальные функции запроса .SETTOP и директивы .LIMIT в режиме ХМ. Не допускается использование совместно с /L

/V:N[:M]

Сформировать оверлей в расширенной памяти; N - номер виртуальной оверлейной области; М - номер раздела в расширенной памяти

/W

Сформировать широкоформатную карту загрузки

/X

Не включать в загрузочный модуль карту использования памяти, если старший адрес редактируемой программы меньше 400 (восьмеричное)

/Y:N

Расположить указанную программную секцию в корневом сегменте, начиная с указанного адреса. Не допускается использование совместно с /H

/Z:N

Занести значение N в неиспользуемые программой адреса загрузочного модуля.

//

Вводить командные строки до следующего задания переключателя //. Не допускается использование совместно с /C

Если в командной строке не указан переключатель /L или /R, то редактор связей формирует загрузочный модуль в формате SAV.

5.2.1. Переключатель /A.

Переключатель /A формирует карту загрузки, в которой глобальные имена по каждой программной секции записываются в карте загрузки в алфавитном порядке. Если переключатель /A не указан, глобальные имена записываются в порядке возрастания их значений.

5.2.2. Переключатель /B:N.

Переключатель /B:N указывает значение младшего адреса редактируемой программы. N (младший адрес) должно быть чётным, не более чем шестизначным восьмеричным числом без знака.

Если значение N не указано, редактор связей выдаёт сообщение:

 ?LINK-F-/B NO VALUE.

По умолчанию, вне зависимости от формата загрузочного модуля, редактор связей полагает значение младшего адреса равным 1000 (восьмеричное). Если размер абсолютной секции программы больше 1000, то значение младшего адреса полагается равным старшему адресу абсолютной секции плюс 2.

Не допускается задавать переключатель /B:N одновременно с переключателем /H или /R.

5.2.3. Переключатели /C и //.

Переключатели /C и // используются, когда для задания режима работы требуется ввести несколько командных строк.

Переключатель /C указывает редактору связей на необходимость ввести ещё одну командную строку. После ввода командной строки, в которой указан переключатель /C, редактор связей выводит на терминал звёздочку и ожидает ввода следующей командной строки.

Пример:

*OUTPUT, LP: = INPUT/C
*

Переключатель // указывает редактору связей на необходимость вводить командные строки до тех пор, пока не будет задан ещё один переключатель //.

Одновременное задание переключателей /C и // недопустимо.

Пример:

*LINK,LINK = LINK0/B:700//
*LINK1/O:1
*LINK2/O:1
*LINK3/O:1
*LINKM/O:1//

5.2.4. Переключатель /D.

Переключатель /D позволяет поместить библиотечные модули одновременно в несколько оверлейных сегментов, которые обращаются к этим модулям.

Если указан переключатель /D, то после ввода последней командной строки, редактор связей выдаёт сообщение:

DUPLICATE SYMBOL?

В ответ необходимо ввести глобальное имя из библиотечного модуля, который следует поместить в тех сегментах, которые обращаются к этим именам, и нажать клавишу <ВК>. Если введено имя, редактор связей вновь выдаёт:

DUPLICATE SYMBOL?

и ожидает ответа. Нажатие клавиши <ВК> означает конец списка глобальных имён.

Если указано глобальное имя не из библиотечного модуля, глобальное имя не дублируется, и редактор связей выдаёт сообщение:

?LINK-W-DUPLICATE SYMBOL 'SYMBOL' DEFINED IN DEV:FILNAM.TYP.

Когда не указан переключатель /D, и к глобальному имени, определённому в библиотечном модуле, обращаются из другого сегмента, редактор связей помещает библиотечный модуль в корневой сегмент.

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

В этом случае глобальное имя не дублируется, и редактор связей выдаёт сообщение:

?LINK-W-DUPLICATE SYMBOL 'SYMBOL' IS FORCED ТО THE ROOT

Если к дублируемому библиотечному модулю не обращаются из корневого сегмента, все глобальные секции из этого модуля, к которым обращаются из нескольких сегментов, всегда помещаются в корневой сегмент. Если локальные секции из этого библиотечного модуля нет необходимости связывать друг с другом, следует определить глобальную секцию с помощью признака CON. После этого редактор связей размещает отдельную копию глобальной секции в корневом сегменте для каждой копии локальной секции дублированного библиотечного модуля, размещённого в оверлеях. Несмотря на то, что глобальные секции резидентны в корневом сегменте, в то время, как локальные секции резидентны в оверлеях, каждая копия библиотечного модуля остаётся тождественной ему, как отдельная копия модуля.

Если дублированный библиотечный модуль содержит секцию глобальных данных, к которой будут обращаться локальные секции в пределах модуля, но глобальная секция не обращается к локальной секции в пределах модуля, копию глобальной секции следует переслать в корневой сегмент. Для этого следует определить секцию с помощью уникального имени и признаков GBL и OVR. После размещения глобальной секции в корневом сегменте локальная секция из дублированного библиотечного модуля, которая резидентна в оверлее, может обращаться к глобальной секции в корневом сегменте.

Секция глобальных данных с признаком CON

MOD:

Секция глобальных данных с признаком CON

 

B

 

 

 

 

 

B

 

Сегмент 1

 

Сегмент 2

 

Локальная секция B

 

 

A для сегмента 2

 

 

A для сегмента 1

 

 

Корневой сегмент

Рис. 4

На рис. 4 показан дублированный библиотечный модуль MOD, из которого секция глобальных данных А помещена в корневой сегмент с признаком CON. Каждой локальной секции В доступна информация из копии глобальной секции, размещённой в корневом сегменте. Однако, локальные секции не могут обмениваться данными, поскольку их обращения ограничены для разных ячеек.

На рис. 5 показан тот же дублированный библиотечный модуль MOD, из которого глобальная секция А помещена в корневой сегмент с признаком OVR. В этом случае локальные секции B могут обращаться к одним и тем же ячейкам в глобальной секции А для обмена информацией.

Секция глобальных данных с признаком OVR

MOD:

Секция глобальных данных A с признаками GBL, OVR

 

Локальная секция B

 

 

 

 

Локальная секция B

 

Сегмент 1

 

Сегмент 2

 

Локальная секция B

 

 

 

 

 

Секция глобальных данных A

 

 

Корневой сегмент

Рис. 5

5.2.5. Переключатель /E:N.

Переключатель /E:N позволяет увеличить размер одной из программных секций корневого сегмента редактируемой программы до величины N байтов. N должно быть чётным, не более чем шестизначным восьмеричным числом без знака.

Если указан переключатель /E:N, то после ввода последней командной строки редактор связей выводит на терминал:

EXTEND SECTION?

В ответ необходимо ввести имя программной секции, размер которой требуется увеличить. Если значение N меньше фактического размера указанной программной секции, то переключатель /E:N игнорируется, редактирование продолжается.

Оператор может увеличить размер только одной программной секции.

Пример:

*X,TT:=LK001/E:100
EXTEND SECTION?CODE

В приведённом выше примере размер программной секции CODE увеличен до 100 байтов.

5.2.6. Переключатель /F.

Переключатель /F включает в редактируемую программу модули из библиотеки FORLIB.OBJ для разрешения глобальных имён. Файл FORLIB.OBJ должен находиться на системном устройстве SY:.

Пример:

*FILE,LP:=AB/F

По этой команде происходит редактирование объектного файла AB.OBJ и модуля из библиотеки фортрана FORLIB.OBJ, в результате которого формируется загрузочный модуль FILE.SAV.

Переключатель /F используется только для совместимости с другими версиями ФОДОС.

5.2.7. Переключатель /G.

Переключатель /G позволяет изменить размер внутреннего буфера таблицы точек входа редактора связей для модулей из библиотеки кратных определений.

Если размер внутреннего буфера таблицы точек входа слишком мал, редактор связей выдаёт сообщение:

?LINK-F-LIBRARY ЕРТ ТОО BIG,
INCREASE BUFFER WITH /G

Переключатель /G следует использовать только в случае переполнения таблицы имён, поскольку он замедляет процесс редактирования.

5.2.8. Переключатель /H:N.

Переключатель /H:N задаёт старший адрес редактируемой программы. N (старший адрес) должно быть чётным, не более чем шестизначным восьмеричным числом без знака.

Если значение N не указано, редактор связей выдаёт сообщение:

?LINK-F-/H NO VALUE.

Если указано нечётное значение N, редактор связей выдаёт сообщение:

?LINK-F-/H ODD VALUE.

Если задан переключатель /H:N, то младший адрес редактируемой программы определяется в соответствии с размером программы.

Если значение N меньше допустимого, то редактор связей выдаёт сообщение:

?LINK-F-/H VALUE ТОО LOW.

Недопустимо задание переключателя /H:N одновременно с переключателем /R, /Y пли /B.

5.2.9. Переключатель /I.

Переключатель /I позволяет включить в редактируемую программу модули из указанных в командных строках библиотек, т.е. включить в программу библиотечные модули, необходимые для разрешения глобальных имён. Эти модули размещаются в корневом сегменте.

Если задан переключатель /I, то после ввода последней командной строки редактор связей выводит на терминал:

 LIBRARY SEARCH?

В ответ необходимо ввести глобальное имя из библиотечного модуля, включаемого в программу, или нажать клавишу <BK>. Если введено имя, редактор связей выводит на терминал:

LIBRARY SEARCH?

и ожидает ответа. Нажатие клавиши <BK> означает конец списка глобальных имён.

Пример:

*SCCA=SCCA/I
LIBRARY SEARCH? ¤SHORT
LIBRARY SEARCH?

В данном примере глобальное имя ¤SHORT включается в загрузочный модуль SCCA.

5.2.10. Переключатель /K:N.

Переключатель /K:N позволяет записать значение N (N - число блоков памяти размером 1K, требуемых программе) по адресу 56 нулевого блока загрузочного модуля. N должно быть натуральным числом от 2 до 28.

Переключатель /K позволяет ограничить количество памяти, распределённой с помощью запроса .SETTOP (см. [3]), до NK слов.

Не допускается задавать переключатель /K:N одновременно с переключателем /R.

5.2.11. Переключатель /L.

Переключатель /L формирует загрузочный модуль в формате LDA. Такой загрузочный модуль предназначен для работы в перфоленточной операционной системе. Недопустимо задание переключателя /L одновременно с переключателями /O, /R или /V. В следующем примере показано создание загрузочного модуля в абсолютном формате:

*OUT,LP:=IN1,IN2/L

5.2.12. Переключатель /M[:N].

Переключатель /M[:N] устанавливает начальное значение указателя стека по адресу 42. Если /M:N используется совместно с /R:N, то редактор связей игнорирует значение, указанное в /R:N. N (начальное значение указателя стека) должно быть чётным, не более чем шестизначным восьмеричным числом без знака. Если N не указано, то после ввода последней командной строки, редактор связей выводит на терминал:

STACK SYMBOL?

В ответ необходимо ввести глобальное имя (число указывать не следует), значение которого будет начальным значением указателя стека. Это глобальное имя должно быть определено в корневом сегменте редактируемой программы.

Если указано несуществующее имя, на терминал выводится сообщение об ошибке, и стековый адрес устанавливается равным 1000 (для файлов типа .SAV) или значению младшего адреса редактируемой программы, если использован переключатель /B. Если размер абсолютной программной секции больше 1000 байтов, то область стека по умолчанию начинается после наибольшего адреса ASECT. Следует отметить, однако, что прямое присвоение (с помощью ASECT) адреса стека в программе предпочтительнее присвоения с помощью переключателя /M. Для этого используются операторы в программе MACRO:

.ASECT
.=42
.WORD INITSP   ; задаётся начальное значение указателя
               ; стека
.PSECT         ; возврат в предыдущую программную сек-
               ; цию

В следующем примере адрес стека указывается с помощью переключателя /M:

*OUTPUT=INPUT/M STACK SYMBOL? BEG

He допускается задавать переключатель /M:N одновременно с переключателем /R.

5.2.13. Переключатель /N.

Переключатель /N включает в карту загрузки таблицу перекрёстных ссылок глобальных имён (глобальные имена перечислены в алфавитном порядке). За каждым глобальным именем стоит имя модуля (имена модулей также перечислены в алфавитном порядке). Знак "#", следующий за именем модуля, указывает, что глобальное имя определено в этом модуле, знак "+" указывает, что модуль из библиотеки.

5.2.14. Переключатель /O:N.

Переключатель /O:N используется для создания загрузочных модулей оверлейной структуры в нижней памяти (см. п. 3.4.1). N (номер оверлейной области) должно быть не более, чем шестизначным восьмеричным числом без знака. Оверлейные области необходимо указывать в командных строках в порядке возрастания их номеров, причём в одной командной строке может быть задан только один переключатель /O:N.

Все модули, указанные до следующего переключателя /O, будут находиться в памяти одновременно. Если в очередном переключателе /O:N указать уже использованный номер оверлейной области, то указанные в этом переключателе модули займут те же ячейки памяти, но уже в другое время. В следующем примере модули R и S занимают ту же область памяти, что и T, но в разное время:

*MAIN,LP:=ROOT/C
*R,S/O:1/C
*T/O:1

В следующем примере установлены две оверлейные области:

*OUTPUT,LP:=INPUT//
*OBJA/O:1
*OBJB/O:1
*OBJC/O:2
*OBJD/O:2//

В приведённом ниже примере оверлейные области указаны в порядке возрастания их номеров:

*A=A/C
*B/O:1/C
*C/O:1/C
*D/O:1/C
*G/O:2

В следующем примере оверлейные области указаны не в возрастающем порядке, поэтому на терминал выдаётся сообщение об ошибке:

*X=LIBR0//
*LIBR1/O:1
*LIBR2/O:0
?LINK-W-/O OR /V OPTION ERROR, RE-ENTER LINE
*

5.2.15. Переключатель /P:N

Переключатель /P:N позволяет изменить размер таблицы имён библиотечных программ, являющейся составной частью общей таблицы имён. N представляет собой количество библиотечных программ (имён), на которое должна быть рассчитана таблица. По умолчанию для таблицы имён отводится область памяти на 170. имён, что эквивалентно заданию переключателя /P:170. или /P:252 (восьмеричное).

При переполнении таблицы имён необходимо указать значение N меньше 170. Это уменьшит размер области, используемой таблицей имён библиотечных программ, и увеличит размер области, используемой общей таблицей имён. Если указанное значение N слишком мало, редактор связей выдаёт сообщение:

?LINK-F-LIBRARY LIST OVERFLOW, INCREASE SIZE WITH /Р

Это означает, что необходимо увеличить размер области, используемой таблицей имён библиотечных программ.

5.2.16. Переключатель /Q.

Переключатель /Q позволяет указывать абсолютные базовые адреса программных секций. Таких программных секций может быть не более 8. Этот переключатель особенно удобен, если программные секции в абсолютном формате предполагается разместить в ПЗУ.

Если указан переключатель /Q, то после ввода последней командной строки редактор связей выводит на терминал:

LOAD SECTION: ADDRESS?

В ответ необходимо ввести имя и адрес загрузки программной секции и нажать клавишу <ВК>. Если введено имя и адрес загрузки программной секции, редактор связей выводит на терминал:

LOAD SECTION: ADDRESS?

Нажатие клавиши <ВК> означает конец списка программных секций.

При использовании переключателя /Q должны соблюдаться следующие правила:

  1. имя программной секции не должно превышать 6-ти символов;
  2. адрес загрузки программной секции должен быть чётным восьмеричным числом. Если адрес загрузки не указан, редактор связей выдаёт сообщение:
    ?LINK-W-NO LOAD ADDRESS 

    Если указан нечётный адрес, редактор связей выдаёт сообщение:

    ?LINK-W-LOAD ADDRESS ODD.
  3. недопустимо задание переключателя /Q с переключателем /H или /R.

    Пример:

    *FILE,TT: = FILE,FILE1/Q/L
    LOAD SECTION: ADDRESS? PSECT1:1000
    LOAD SECTION: ADDRESS? PSECT2:2500
    LOAD SECTION: ADDRESS? PSECT3:4000
    LOAD SECTION: ADDRESS? <ВК> *

5.2.17. Переключатель /R[:N].

Переключатель /R[:N] формирует загрузочный модуль в формате .REL для использования в качестве основного задания в режимах FB и ХМ. Загрузочный модуль типа .REL не используется с монитором одного задания. N (размер стека в байтах) должно быть чётным восьмеричным числом без знака. По умолчанию - 128.

Пример:

*FILEO,LP:=FILEI,NEXT/R:200

По этой команде происходит редактирование объектных файлов FILEI.OBJ и NEXT.OBJ, в результате которого вырабатывается загрузочный модуль FILEO.REL.

Недопустимо задание переключателя /R[:N] одновременно с переключателем /B, /H, /L или /K.

5.2.18. Переключатель /S.

Переключатель /S указывает редактору связей на необходимость предоставить максимально возможную область памяти для таблицы имён (за счёт буферов ввода - вывода). Использовать переключатель /S следует только в случае переполнения таблицы имён, поскольку он замедляет процесс редактирования. Если задан переключатель /S, не следует указывать в командной строке файл определений имён или карты загрузки.

5.2.19. Переключатель /T[:N].

Переключатель /T:N указывает точку входа (адрес, с которого начинается выполнение редактируемой программы). N (точка входа) должно быть чётным, не более чем шестизначным восьмеричным числом без знака. Если N не указано, то после ввода последней командной строки редактор связей выдаёт сообщение:

TRANSFER SYMBOL?

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

Если указано несуществующее имя, на терминал выводится сообщение об ошибке и адрес точки входа устанавливается равным 1. Это вызывает прерывание программы.

Если указан нечётный адрес, программа не запускается после загрузки, и управление передаётся монитору.

Загрузка программы осуществляется с помощью команды R, RUN или FRUN. Прямое присвоение (.ASECT) адреса перехода в программе имеет приоритет над присвоением с помощью /T, которое, в свою очередь, имеет приоритет над присвоением в директиве .END. Для указания точки входа в программу на языке Ассемблера используется одна из следующих конструкций:

.ASECT
.=40
.WORD START1    ; точка входа в редактируемую
                ; программу
.PSECT          ; возврат в предыдущую програм-
                ; мную секцию
START1: .
        .
        .
или
START2: .       ; адрес перезапуска
        .
        .
.END START2

В следующем примере объединяются файлы LIBRO.OBJ и ODT.OBJ. Выполнение начинается с адреса ODT (O.ODT - адрес точки входа в программу):

*LBRODT,LBRODT=LIBRO,ODT/T/W//
*LIBR1/O:1
*LIBR2/O:1
*LIBR3/O:1
*LIBR4/O:1
*LIBR5/O:1
*LIBR6/O:1
*LBREM/O:1//
TRANSFER SYMBOL? O.ODT
*

5.2.20. Переключатель /U:N.

Переключатель /U:N позволяет увеличить размер одной из программных секций корневого сегмента так, что размер корневого сегмента (в байтах) увеличивается до величины, кратной N. N должно быть восьмеричным числом степени 2.

Если указан переключатель /U:N, то после ввода последней командной строки редактор связей выводит на терминал:

ROUND SECTION?

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

Пример:

*LK007,TT: = LK007/U:200
ROUND SECTION? CHAR

В данном примере увеличивается секция CHAR.

Если указанная программная секция не найдена, редактор связей выдаёт сообщение:

?LINK-W-ROUND SECTION NOT FOUND.

В этом случае переключатель /U:N игнорируется, редактирование продолжается.

5.2.21. Переключатель /V.

Переключатель /V:N[:M] используется для создания загрузочных модулей оверлейной структуры в расширенной памяти (см. п. 3.4.2). N - номер виртуальной оверлейной области (область виртуального адресного пространства), M - номер раздела (область физического адресного пространства). Виртуальные оверлейные области необходимо указывать в командных строках в порядке возрастания их номеров, причём в одной командной строке может быть указан только один переключатель /V:N[:M].

ПРИМЕЧАНИЕ. Если переключатель /V указан в первой командной строке без аргументов, виртуальные или привилегированные задания (основные, фоновые) будут отображены в рабочую область расширенной памяти с помощью программного запроса .SETTOP. Более подробно об использовании программного запроса .SETTOP см. [3].

Пользователь может комбинировать в одной программе оверлейные сегменты в нижней памяти и оверлейные сегменты в расширенной памяти. Оверлейные области и виртуальные оверлейные области указываются в командных строках в возрастающем порядке, причём оверлейные сегменты в нижней памяти указываются перед оверлейными сегментами в расширенной памяти.

Рассмотрим на следующем примере использование переключателей /V:N[:M] и /O:N:

.R LINK
*PROG=PROG//
*SEG1/O:1
*SEG2/O:1
*SEG3/V:2
*SEG4/V:2
*SEG5/V:2:1
*SEG6/V:2:1
*SEG7/V:2:1
*SEG8/V:2:2
*SEG9/V:2:2
*SEG10/V:3//

В этом примере сегменты SEG1 и SEG2 делят одни и те же ячейки в нижней памяти. Сегменты SEG3 и SEG4, соответствующие виртуальной оверлейной области 2, используют собственные разделы в расширенной памяти, сегменты SEG5, SEG6 и SEG7 делят одни и те же ячейки в расширенной памяти, SEG8 и SEG9 также используют один раздел. SEG10, соответствующий виртуальной оверлейной области 3, использует в расширенной памяти собственный раздел. Распределение памяти для этого примера показано на рис. 6.

Виртуальное и физическое адресные пространства программы с оверлеями в нижней и расширенной памяти

Рис. 6

5.2.22. Переключатель /W.

Переключатель /W формирует карту загрузки, в которой глобальные имена и их значения записываются в шесть колонок (с шириной строки 132 символа) вместо трех.

5.2.23. Переключатель /X.

Переключатель /X запрещает редактору связей включать в загрузочный модуль карту использования памяти, если старший адрес редактируемой программы меньше 400 (восьмеричное). Карта использования памяти находится в ячейках с 360 по 377 нулевого блока загрузочного модуля. Каждый разряд представляет один 256-словный блок памяти. Разряд 7 байта 360 соответствует ячейкам с 0 по 777; разряд 6 - ячейкам с 1000 по 1777 и т.д. Эта информация используется командами R, RUN или FRUN при загрузке программы.

5.2. 24, Переключатель /Y:N.

Переключатель /Y:N позволяет изменить значение адреса загрузки одной из программных секций корневого сегмента редактируемой программы. Значение этого адреса увеличивается до величины, кратной N. N должно быть восьмеричным числом, представляющим целую степень числа 2. Если указан переключатель /Y:N, то после ввода последней командной строки редактор связей выводит на терминал:

BOUNDARY SECTION?

В ответ необходимо ввести имя программной секции, адрес загрузки которой требуется изменить.

Если указанная программная секция не найдена, редактор связей выдаёт сообщение:

?LINK-W-BOUNDARY SECTION NOT FOUND

Переключатель /Y:N игнорируется, редактирование продолжается.

Недопустимо использование переключателя /Y:N с переключателем /H.

Пример:

*FMONSJ.SYS = BISJ,RMSJ,KMSJ,TBSJ/Y:200
BOUNDARY SECTION? OVLYO

В данном примере изменяется значение адреса загрузки программной секции OVLYO.

5.2.25. Переключатель /Z:N.

Переключатель /Z:N указывает редактору связей на необходимость записать значение N в неиспользуемые программой адреса загрузочного модуля. По умолчанию предполагается переключатель /Z:0.

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

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

6.1. Объектные модули.

Входными данными для редактора связей являются объектные модули, создаваемые трансляторами ФОДОС-2. Структура объектного модуля описана в [4].

6.2. Загрузочный модуль.

Загрузочный модуль может быть сформирован редактором связей в одном из трех форматов:

  1. в формате отображения памяти (SAV);
  2. в перемещаемом формате отображения памяти (REL);
  3. в абсолютном двоичном формате (LDA).

Структура загрузочных модулей в формате SAV и REL показана на рис. 7.

СТРУКТУРА ЗАГРУЗОЧНОГО МОДУЛЯ В ФОРМАТЕ SAV

Корневой сегмент

Оверлейные сегменты (необязательно)

Рис. 7

 

На рис. 8 приведена структура загрузочного модуля в формате REL:

Корневой сегмент

Оверлейные сегменты (необязательно)

Информация о перемещениях

Рис. 8

Загрузочный модуль в формате LDA используется для совместимости с перфоленточной операционной системой.

Загрузочный модуль в формате SAV содержит программу в том виде, в котором она будет находиться в памяти (нулевой блок соответствует адресам памяти 0-776, первый блок - адресам 1000-1776 и т.д.). В случае оверлейной программы оверлеи загружаются в память с адресов, записанных редактором связей в таблице оверлейного драйвера.

Загрузочный модуль в формате REL содержит программу в перемещаемом виде (нулевой блок соответствует адресам памяти 0-776, остальные блоки загружаются в память с адреса, определяемого монитором). Перемещаемость программы обеспечивается содержащейся в загрузочном модуле информацией о перемещении. Информация о перемещении состоит из списка адресов, содержимое которых требуется изменить при загрузке. Эти адреса рассматриваются относительно начала перемещаемой части программы пользователя (адрес 1000 в загрузочном модуле). Информация о перемещении записывается в следующем виде (рис. 9):

В разрядах 0-14 записывается делённое на 2 значение адреса ячейки слова, которое требуется изменить. Содержимое разряда 15 определяет тип изменения. Изменение выполняется следующим образом: константа, равная адресу загрузки программы, складывается или вычитается из слова по указанному адресу в зависимости от содержимого 15-го разряда (0 - сложение, 1 - вычитание). Код 177776 является признаком окончания информации о перемещении. Для оверлейных программ информация о перемещении каждого сегмента заканчивается кодом 177777.

15

14

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.
.
.
.
.

177776

Рис. 9

В нулевом блоке загрузочного модуля редактор связей размещает информацию о программе, используемую при загрузке (табл. 6).

Таблица 6

Адрес

Назначение

40

Стартовый адрес программы

42

Начальное значение указателя стека

44

Слово состояния программы

46

Адрес загрузки программы обслуживания пользователя

50

Старший адрес программы

360-376

Карта использования памяти

Редактор связей записывает по адресам 40, 42 и 50 значения, вычисляемые во время редактирования, или значения, указанные в командной строке. По адресу 44 редактор связей записывает 1000, если программа оверлейная. По адресу 46 редактор связей записывает 0. Это указывает на то, что адрес загрузки USR определяется монитором.

Карта использования памяти (адреса 360-376) показывает, какие блоки загрузочного модуля должны загружаться в оперативную память при вызове программы.

Для загрузочных модулей в формате REL редактор связей определяет дополнительную информацию (табл. 7).

Таблица 7

Адрес

Назначение

14, 16

Вектор прерывания по команде BPT

20, 22

Вектор прерывания по команде IOТ

34

Вектор прерывания по команде TRAP

52

Размер корневого сегмента в байтах

54

Размер стека в байтах (по умолчанию 128)

56

Размер оверлейной области в байтах

60

Признак формата (REL в коде RADIX-50)

62

Номер блока файла загрузочного модуля, с которого начинается информация о перемещениях

Для программ с оверлеями в расширенной памяти редактор связей определяет дополнительную информацию (табл. 8).

Таблица 8

Адрес

Назначение

0

Идентификация программы (см. [3]), которая была создана с помощью переключателя /V:N[:M]

2

Старший адрес виртуальной памяти, используемый программой

64

Стартовый адрес оверлейной таблицы (используемый также программами с оверлеями в нижней памяти)

66

Начало информации о виртуальном оверлейном сегменте в оверлейной таблице драйверов

Любое слово нулевого блока загрузочного модуля может быть установлено в абсолютной секции программы. Это даёт возможность пользователю самому устанавливать слова с адресами, приведёнными в табл. 6, табл. 7 и табл. 8.

6.3. Карта загрузки.

Карта загрузки показывает распределение памяти для загрузочного модуля.

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

Затем идёт информация о распределении памяти для программных секций. Для каждой программной секции эта информация включает в себя: имя, адрес загрузки, размер в байтах, значения признаков, список глобальных имён, определённых в секции, и их значения. В последней строке карты загрузки записывается точка входа программы и размер загрузочного модуля в байтах (в восьмеричной системе) и словах (в десятичной системе). Для оверлейных программ информация о распределении памяти для сегментов записывается в карте загрузки в порядке возрастания номеров сегментов независимо от того, где расположены оверлейные сегменты, в нижней или расширенной памяти.

Если в командной строке указан переключатель /N (см. п. 5.2.13), в карту загрузки будет включена таблица перекрёстных ссылок глобальных имён (пример 2).

Адреса в карте загрузки, полученной для загрузочного модуля в формате REL, не являются абсолютными. Для вычисления абсолютного адреса необходимо адрес, указанный в карте загрузки, сложить с адресом загрузки и вычесть 1000 (1000 - это базовый адрес программы, предполагаемый редактором связей).

Пример 1.

Ниже показана карта загрузки фоновой программы:

1  FODOS  LINK B03.00 LOAD МАР FRIDAY 11-JAN-85 11:25 PAGE 1
2  TEST      .SAV    TITLE:   TEST   IDENT:
3
4  SECTION ADDR  SIZE GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
5
6  .ABS.  000000 001000 = 256. WORDS  (RW, I, GBL, ABS, OVR)
7         001000 000200 = 64.  WORDS  (RW, I, LCL, REL, CON)
8  TEST   001200 000174 = 62.  WORDS  (RW, I, LCL, REL, CON)
9                            START 001200  EXIT 001240
10
11 TRANSFER ADDRESS = 001200, HIGH LIMIT = 001372=381. WORDS

Подробное описание этой карты загрузки приведено в табл. 9.

Таблица 9

Номер строки

Содержание

1

Номер версии редактора связей, дата и время выполнения редактирования

2

Имя файла загрузочного модуля - TEST.SAV, наименование TEST (по умолчанию .MAIN) и номер версии (по умолчанию не указывается) первого объектного модуля

4

Информация о программной секции Заголовок описания программной секции "SECTION" обозначает имя; "ADDR" - стартовый адрес, "SIZE" - длину и признаки (см табл. 1); "GLOBAL" и "VALUE" обозначают глобальные имена и соответствующие им восьмеричные значения

6

Абсолютная программная секция - .ABS. Эта строка включает стартовый адрес, длину и признаки (см. табл. 1) абсолютной программной секции

7

Неименованная программная секция. Эта секция следует в карте загрузки за абсолютной программной секцией. Для оверлейных программ неименованная программная секция следует за оверлейной таблицей (см. пример 2)

8-9

Программная секция TEST. В девятой строке указаны глобальные имена START и EXIT и их значения

11

Точка входа, старший адрес и количество слов редактируемой программы

Пример 2.

Ниже показана карта загрузки для загрузочного модуля PROG.SAV, оверлейная структура которого определена следующим образом:

*PROG,PROG=MOD//
*MOD1/O:1
*MOD2/O:1
*MOD3/V:2
*MOD4/V:3//
1 FODOS LINK B03.00 LOAD MAP THURSDAY 03-JAN-85 14:15 PAGE 1
2 PROG    .SAV    TITLE: .MAIN.  IDENT:
3
4 SECTION ADDR  SIZE  GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
5
6  .ABS.  000000 001000 = 256. WORDS  (RW, I, GBL, ABS, OVR)
7  ¤OHAND 001000 000252 = 85.  WORDS  (RW, I, GBL, REL, CON)
8               ¤OVRHV 001000  ¤OVRH   001004 V¤REAB  001034
9               V¤DONE 001046  ¤VDF5   001234 ¤VBF4   001236
10              ¤VDF1  001246  ¤VDF2   001250
11  ¤OTABL 001252 000114 = 38. WORDS  (RW, D, GBL, REL, OVR)
12        001366 000410 = 132. WORDS  (RW, I, LCL, REL, CON)
13  MAIN   001776 000070 = 28. WORDS  (RW, I, LCL, REL, CON)
14                   START 001776 RET1  002010 RET2  002014
15                   LIMIT 002024
16  LML4   002066 000026 = 11. WORDS  (RW, I, GBL, REL, CON)
17                      MSGL  002066
18  LML5   002114 000026 = 11. WORDS  (RW, I, GBL, REL, CON)
19                      MSGL2  002114
20  SEGMENT SIZE = 002142 =561. WORDS
21
22 OVERLAY REGION  000001  SEGMENT 000001
23  LML2   002144  000032 = 13. WORDS (RW, I, LCL, REL, CON)
24                      START1@ 002144
25  SEGMENT SIZE = 000032 = 13.  WORDS
26
27 OVERLAY REGION  000001  SEGMENT 000002
28  LML3   002144  000036 = 15. WORDS (RW, I, LCL, REL, CON)
29                      START2@ 002144
30  SEGMENT SIZE = 000036 = 15.  WORDS
31
32  --------------------------------------------------------
33
34  VIRTUAL OVERLAY REGION  000002
35  ------------------------ 
36
37 PARTITION       000001 SEGMENT 000003
38  LML7  020002   000034 = 14. WORDS (RW, I, LCL, REL, CON)
39                      START3 020002
40  LML6  020036   000042 = 17. WORDS (RW, I, GBL, REL, CON)
41                      MSGL3  020036   RET4   020050
42  SEGMENT SIZE = 000076 = 31. WORDS
43
44  VIRTUAL OVERLAY REGION 000003
45  ----------------------
46
47 PARTITION       000002 SEGMENT 000004
48  LML9  040002   000076 = 31. WORDS (RW, I, GAL, REL, CON)
49                      MSGL9@ 040002
50 SEGMENT SIZE = 000076 = 31.  WORDS
51
52
53  TRANSFER ADDRES = 001776, HIGH LIMIT =002200 =576. WORDS
54
55
56 VIRTUALHIGHLIMIT=040076=8223.WORDS,NEXTFREEADDRESS=060000
57
58
59 EXTENDED MEMORY REQUIRED = 000200 = 64. WORDS
60 FODOS LINK B03.00GLOBALSYMBOLCROSS REFERENCE TABLE PAGE 1
61
62
63  ¤OVDF1 VHANDL+
64  ¤OVDF2 VHANDL+
65  ¤OVBF3 VHANDL+
66  ¤OVDF4 VHANDL+
67  ¤OVDF5 VHANDL+
68  ¤OVRH  VHANDL#+
69  ¤OVRHV VHANDL#+
70  ¤VDFl  VHANDL#+
71  ¤VDF2  VHANDL#*
72  ¤VDF4  VHANDL#+
73  ¤VDF5  VHANBL#+
74  LIMIT  .MAIN.#
75  MSGL   .MAIN.#
76  MSGL2  .MAIN.#
77  MSGL3  .MAIN.#
78  MSGL9  .MAIN.    .MAIN.#
79  RET1   .MAIN.#
80  RET2   .MAIN.#
81  RET4   .MAIN.#
82  START  .MAIN.#
83  START1 .MAIN.    .MAIN.#
84  START2 .MAIN.    .MAIN.#
85  START3 .MAIN.#
86  V¤DONE VHAND#+
87  V¤READ VHAND#+

Подробное описание этой карты загрузки приведено в табл. 10.

Таблица 10

Номер строки

Содержание

1-6

См. пример 1

7-10

Программная секция ¤OHAND содержит оверлейный драйвер для программ с оверлеями в нижней и расширенной памяти

11

Программная секция ¤OTABL содержит таблицы данных, используемые оверлейным драйвером

12

Неименованная программная секция. В карте загрузки оверлейных программ неименованная программная секция располагается после оверлейных таблиц

20

Указывает размер корневого сегмента

22

Информация о сегменте 1 оверлейной области 1

23-24

Программная секция LML2. В 24-й строке символ "@" указывает, что доступ к глобальному имени START1 осуществляется через оверлейную таблицу ¤OTABL, находящуюся в корневом сегменте

25

Указывает размер оверлейного сегмента отделяет часть

32

карты загрузки, предназначенную нижней памяти, от части, предназначенной расширенной памяти

34

Информация о виртуальной оверлейной области 2

37

Информация о разделе 1 сегмента 3

41

Программная секция LML6. Отсутствие символа "@" означает, что к программной секции LML6 обращаются только в пределах сегмента 3

42

Указывает размер оверлейного сегмента 3

44

Информация о виртуальной оверлейной области 3

47

Информация о разделе 2 сегмента 4

50

Указывает размер сегмента 4. Заметим, что сегменты 3 и 4 имеют одинаковую длину. Редактор связей автоматически округляет размер виртуального оверлейного сегмента до величины, кратной 32. словам или 100(8) байтам. Для этого редактор связей суммирует слово, содержащее номер оверлейного сегмента, с его размером (число 000076, которое следует за 040002 в строке 48)

53

Точка входа и старший адрес (последний адрес нижней памяти, используемый корневым и неотображёнными сегментами) редактируемой программы

56

Виртуальный старший адрес (указывает последний виртуальный адрес, используемый частью программы, расположенной в расширенной памяти), очередной свободный адрес (адрес очередной страницы, которая не используется программой)

59

Количество расширенной памяти, требуемое программе. Следует убедиться, что оно достаточно

60-87

Таблица перекрёстных ссылок глобальных имён (см. п. 5.2.13)

6.4. Файл определений имён.

Файл определений имён - это файл в объектном формате, содержащий каталог глобальных имён, определённых во входных объектных модулях. Этот файл можно использовать для разрешения глобальных имён при раздельном редактировании модулей.

6.5. Использование библиотек.

Библиотеки объектных модулей могут использоваться редактором связей для поиска модулей, включаемых в редактируемую программу. В редактируемую программу включаются из библиотеки только те модули, к которым обращаются из небиблиотечных файлов. Количество указываемых библиотек не ограничено. Системная библиотека SY:SYSLIB.OBJ обрабатывается по умолчанию.

Библиотечные файлы должны указываться в командных строках, в которых указываются файлы для формирования корневого сегмента. Указываются библиотечные файлы так же, как и объектные файлы. Недопустимо указывать библиотечные файлы в одной командной строке с оверлейными сегментами.

Редактор связей обрабатывает библиотечные файлы следующим образом. Во время первого прохода редактор связей обрабатывает входные файлы в том порядке, в котором они указаны в командной строке. При этом на начальном этапе первого прохода обрабатываются только небиблиотечные файлы. На конечном этапе первого прохода обрабатываются только библиотечные файлы. В это время разрешаются неопределённые глобальные имена, к которым были обращения из небиблиотечных файлов. Файл системной библиотеки всегда обрабатывается последним.

Пример:

*TASK01,LP: = MAIN,MEASUR

В этом примере библиотечный модуль MEASUR.OBJ служит для разрешения глобальных имён, неопределённых в программе MAIN.OBJ. Для разрешения оставшихся неопределённых глобальных имён используется системная библиотека SY:SYSLIB.OBJ.

Модули одной библиотеки могут вызывать модули других библиотек, поэтому для правильного разрешения глобальных имён следует соблюдать в командных строках определённый порядок задания библиотек.

Пусть модуль X из библиотеки ALIB вызывает модуль Y из библиотеки BLIB. Тогда в командной строке спецификация библиотеки ALIB должна предшествовать спецификации библиотеки BLIB:
*Z = B,ALIB,BLIB. Модуль В - корневой.

6.5.1. Библиотеки кратных определений.

Кроме обычных библиотек, редактор связей обрабатывает библиотеки кратных определений. Основная цель этих библиотек состоит в обеспечении специальных функций для систем реального времени. Библиотеки кратных определений отличаются от обычных библиотек тем, что они содержат несколько определений одного глобального имени. Библиотеки кратных определений указываются в командных строках так же, как и обычные библиотеки.

Модули из библиотек кратных определений всегда помещаются в корневой сегмент. При обработке этих модулей редактор связей помещает справочник библиотеки кратных определений, называемый таблицей точек входа, во внутренний буфер. Если размер внутреннего буфера недостаточен для размещения таблицы точек входа, редактор связей выдаёт сообщение:

?LINK-F-LIBRARY ЕРТ ТОО BIG, INCREASE BUFFER WITH /G

Переключатель /G увеличивает размер буфера в соответствии с наибольшим размером таблицы точек входа.

Когда глобальное имя из модуля библиотеки кратных определений совпадает с неопределённым глобальным именем, редактор связей удаляет из списка неопределённых глобальных имён другие глобальные имена, определённые в этом модуле. Таким образом, два модуля с одинаковыми именами не будут находиться в редактируемой программе.

ПРИМЕЧАНИЕ. Порядок модулей в библиотеках кратных определений влияет на их использование редактором связей.

7. СООБЩЕНИЯ ОПЕРАТОРУ

Часть сообщений, выдаваемых редактором связей, относится к действию переключателей, для реализации которых требуется дополнительная информация (см. табл. 11). Действия по этим сообщениям описаны в п. 5.2.

Таблица 11

Сообщение

Переключатель

TRANSFER SYMBOL?

/T

STACK SYMBOL?

/M

EXTEND SECTION?

/E:N

BOUNDARY SECTION?

/Y:N

ROUND SECTION?

/U:N

LOAD SECTION: ADDRESS?

/Q

LIBRARY SEARCH?

/I

DUPLICATE SYMBOL?

/D

 

Сообщения приведены в том порядке, в котором они выдаются на терминал. Это следует учитывать при создании косвенных файлов.

Ниже приведены сообщения об ошибках, выдаваемые редактором связей.

?LINK-F-ADDRESS SPACE EXCEEDED

Причина.

Размер программы превышает 32K слов.

Действие.

Сократить размер программы, используя оверлейную структуру. Повторить редактирование.

?LINK-F-ASECT ТОО BIG

Причина.

Наложение абсолютного кода программы на относительный код.

Действие.

Сократить размер абсолютной или относительных программных секций. Повторить редактирование.

?LINK-F-/B NO VALUE

Причина.

Не указан аргумент переключателя /B.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/B ODD VALUE

Причина.

Значение аргумента переключателя /B нечётно.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-CROSS REFERENCE DEVICE FULL DEV:FILNAM.TYP

Причина.

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

Действие.

Освободить место на томе или использовать другой том. Повторить редактирование.

?LINK-F-/E NO VALUE

Причина.

Не указан аргумент переключателя /E.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/E ODD VALUE

Причина.

Значение аргумента переключателя /E нечётно.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/H NO VALUE

Причина.

Не указан аргумент переключателя /H.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/H ODD VALUE

Причина.

Значение аргумента переключателя /H нечётно.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/H VALUE ТОО LOW

Причина.

Значение аргумента переключателя /H:N меньше допустимого.

Действие.

Получить карту загрузки редактируемой программы и определить объём памяти, требуемый программе. Повторить редактирование, указав переключатель /H:N с допустимым значением аргумента.

?LINK-F-INPUT ERROR DEV:FILNAM.TYP

Причина.

Ошибка при чтении входного файла.

Действие.

Проверить готовность и исправность оборудования. Повторить редактирование.

?LINK-F-INSUFFICIENT MEMORY

Причина.

Недостаточно памяти.

Действие.

Освободить часть оперативной памяти (удалить основное задание, использовать монитор одного задания, удалить ненужные драйверы). Повторить редактирование.

?LINK-F-INTERNA1 ERROR

Причина.

Ошибка при обращении к программе LINK.

Действие.

Повторить редактирование. При повторении этой же ошибки использовать новую копию программы редактор связей.

?LINK-F-INVALID CHARACTER

Причина.

Введён знак, не используемый в RADIX-50.

Действие.

Ввести правильное имя. Повторить редактирование.

?LINK-F-INVALID COMPLEX RELOCATION IN DEV:FILNAM.TYP

Причина.

Ошибка в записи составного перемещения в объектном модуле входного файла.

Действие.

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

?LINK-F-INVALID DEVICE DEV:

Причина.

Указанное устройство не обслуживается системой.

Действие.

Установить в системе обслуживание требуемого устройства или использовать другое устройство. Повторить редактирование.

?LINK-F-INVALID GSD IN DEV:FILNAM.TYP

Причина.

Ошибка в каталоге глобальных имён объектного модуля входного файла.

Действие.

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

?LINK-F-INVALID RECORD TYPE IN DEV:FILNAM.TYP

Причина.

Недопустимый формат входного файла.

Действие.

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

?LINK-F-INVALID RLD IN DEV:FILNAM.TYP

Причина.

Ошибка в словаре перемещений объектного модуля входного файла.

.Действие.

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

?LINK-F-INVALID RLD SYMBOL IN DEV:FILNAM.TYP

Причина.

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

Действие.

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

?LINK-F-/K INVALID VALUE

Причина.

Указано недопустимое значение аргумента переключателя /K.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/K NO VALUE

Причина.

Не указан аргумент переключателя /K.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-LIBRARY EPT ТОО BIG, INCREASE BUFFER WITH /G

Причина.

Переполнение таблицы точек входа.

Действие.

Повторить редактирование, указав переключатель /G в первой командной строке.

?LINK-F-LIBRARY LIST OVERFLOW, INCREASE SIZE WITH /P

Причина.

Переполнение таблицы имён библиотечных программ.

Действие.

Повторить редактирование, увеличив с помощью переключателя /P размер таблицы имён библиотечных программ.

?LINK-F-/M ODD VALUE

Причина.

В качестве адреса стека указано нечётное значение.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-MAP DEVICE FULL DEV:FILNAM.TYP

Причина.

На томе, используемом для вывода файла карты загрузки, недостаточно свободного места или полностью заполнен справочник.

Действие.

Освободить место на томе или использовать другой том.

?LINK-F-OLD LIBRARY FORMAT IN DEV:FILNAM.TYP

Причина.

Формат библиотечного файла не соответствует формату, используемому в ФОДОС-2 версии B03.00.

Действие.

Вновь сформировать библиотечный файл с помощью программы библиотекарь. Повторить редактирование.

?LINK-F-PROTECTED FILE ALREADY EXISTS DEV:FILNAM.TYP

Причина.

Попытка открыть файл с таким же именем, как у имеющегося защищённого файла.

Действие.

Отменить защиту имеющегося файла или использовать другое имя для открытия нового файла. Повторить редактирование.

?LINK-F-/R ODD VALUE

Причина.

Значение аргумента переключателя /R нечётно.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-REL WRITE BEYOND EOF

Причина.

Переполнение файла загрузочного модуля в формате REL при записи информации о перемещениях.

Действие.

Повторить редактирование, используя в командной строке конструкцию [N] для задания размера файла загрузочного модуля.

?LINK-F-SAV DEVICE FULL DEV:FILNAM.TYP

Причина.

На томе, используемом для вывода файла загрузочного модуля, недостаточно свободного места или полностью заполнен справочник.

Действие.

Освободить место на томе или использовать другой том. Повторить редактирование.

?LINK-F-SAV READ ERROR

Причина.

Ошибка при считывании формируемого файла загрузочного модуля.

Действие.

Проверить готовность и исправность оборудования. Повторить редактирование.

?LINK-F-SAV WRITE ERROR

Причина.

Ошибка при записи файла загрузочного модуля.

Действие.

Проверить готовность и исправность оборудования. Проверить том на плохие блоки. Повторить редактирование.

?LINK-F-SIZE OVERFLOW OF SECTION AAAAAA

Причина.

Размер программной секции превышает 32K слов.

Действие.

Сократить размер программной секции AAAAAA или всей программы. Повторить редактирование.

?LINK-F-STB DEVICE FULL DEV:FILNAM.TYP

Причина.

На томе, используемом для вывода файла определений имён, недостаточно свободного места или полностью заполнен справочник.

Действие.

Освободить место или использовать другой том. Повторить редактирование.

?LINK-F-STB NOT ALLOWED WITH /S AND А МАР

Причина.

Попытка получить файл определений имён и карту загрузки одновременно с указанием переключателя /S.

Действие.

Отдельно получить файл определений имён или карту загрузки. Повторить редактирование.

?LINK-F-STB WRITE ERROR

Причина.

Ошибка при записи файла определений имён.

Действие.

Проверить готовность и исправность оборудования. Проверить том на наличие плохих блоков. Повторить редактирование.

?LINK-F-STORING TEXT BEYOND HIGH LIMIT

Причина.

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

Действие.

Вновь получить объектные модули и повторить редактирование.

?LINK-F-SYMBOL TABLE OVERFLOW

Причина.

Переполнение таблицы имён.

Действие.

Повторить редактирование, указав переключатель /S. При появлении этой же ошибки освободить часть оперативной памяти (удалить основное задание, использовать монитор одного задания, удалить ненужные драйверы) и повторить редактирование.

?LINK-F-/T ODD VALUE

Причина.

В качестве адреса точки входа редактируемой программы указано нечётное значение.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-ТОО MANY PROGRAM SEGMENTS

Причина.

Указано более 1777 (восьмеричное) программных сегментов.

Действие.

Сократить число оверлейных сегментов. Повторить редактирование.

?LINK-F-ТОО MANY VIRTUAL OVERLAY REGIONS

Причина.

Указано более 8 оверлейных областей (окон) в расширенной памяти, включая корневой сегмент.

Действие.

Сократить число оверлейных областей в расширенной памяти. Повторить редактирование.

?LINK-F-/U OR /Y VALUE NOT А POWER OF2

Причина.

Значение аргумента переключателя /U или /Y не является степенью числа 2.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-WORD RELOCATION ERROR IN FILNAM

Причина.

Попытка обратиться к слову по нечётному адресу во время объединения данных программных секций.

Действие.

Поместить директиву Ассемблера .EVEN в конце программных секций, содержащих данные, чтобы обеспечить правильность обращения к данным.

?LINK-F-/Y NO VALUE

Причина.

Не указан аргумент переключателя /Y.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-/Y ODD VALUE

Причина.

Значение аргумента переключателя /Y нечётно.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-F-VIRTUAL OVERLAY LOGICAL ADDRESS SPACE EXCEEDED

Причина.

Размер оверлеев превышает 96K слов расширенной памяти.

Действие.

Повторить редактирование, указав раздел M в переключателе /V:N[:M] (см. п. 5.2.21), который совместно используют несколько сегментов.

?LINK-W-ADDITIVE REVERENCE OF NNNNNN AT SEGMENT #MMMMMM

Причина.

Попытка передать управление в оверлейный сегмент MMMMMM не в точку входа этого сегмента;

NNNNNN - точка входа. Редактор связей формирует команду передачи управления непосредственно в точку входа сегмента. Редактирование продолжается.

Действие.

Исправить исходную программу. Повторить редактирование.

?LINK-W-BOUNDARY SECTION NOT FOUND

Причина.

В корневом сегменте нет программной секции, к которой относится действие переключателя /Y. Переключатель /Y игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, указав имя требуемой программной секции.

?LINK-W-BYTE RELOCATION ERROR AT NNNNNN

Причина.

Ненулевой старший байт перемещаемой величины. NNNNNN - адрес, по которому находится эта величина. Редактор связей усекает перемещаемую величину до 8 разрядов, если формат загрузочного модуля SAV или LDA. Для загрузочного модуля в формате REL усечение не производится. Редактирование продолжается.

Действие.

Исправить исходную программу и повторить редактирование.

?LINK-W-COMPLEX RELOCATION DIVIDE BY 0 IN DEV:FILNAM.TYP:

Причина.

Деление на 0 в записи составного перемещения в указанном файле. Результат операции равен 0. Редактирование продолжается.

Действие.

Исправить исходную программу. Повторить редактирование.

?LINK-W-COMPLEX RELOCATION OF AAAAAA

Причина.

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

Действие.

Удалить все составные перемещения. Повторить редактирование.

?LINK-W-CONFLICTING SECTION ATTRIBUTES NNNNNN

Причина.

При повторном описании программной секции NNNNNN значения признаков отличаются от значений из первого описания. Редактор связей использует признаки из первого определения. Редактирование продолжается.

Действие.

Исправить исходную программу. Повторить редактирование.

?LINK-W-CROSS REFERENCE INPUT ERROR

Причина.

Ошибка при чтении таблицы перекрёстных ссылок. Часть карты загрузки, содержащая таблицу перекрёстных ссылок, удаляется, редактирование продолжается.

Действие.

Проверить готовность и исправность оборудования. Повторить редактирование.

?LINK-W-CROSS REFERENCE OUTPUT ERROR

Причина.

Ошибка при записи таблицы перекрёстных ссылок. Часть карты загрузки, содержащая таблицу перекрёстных ссылок, удаляется, редактирование продолжается.

Действие.

Проверить готовность и исправность оборудования. Повторить редактирование.

?LINK-W-DEFAULT SYSTEM LIBRARY NOT FOUND SYSLIB.OBJ

Причина.

Не найден файл системной библиотеки SY:SYSLIB.OBJ.

Действие.

Сформировать файл системной библиотеки или исправить исходную программу. Повторить редактирование.

?LINK-W-DUPLICATE SYMBOL 'SYMBOL' DEFINED IN DEV:FILNAM.TYP

Причина.

Попытка дублировать небиблиотечный файл с помощью переключателя /D.

Действие.

Поместить модуль, содержащий глобальное имя "SYMBOL", в библиотеку объектных модулей. Повторить редактирование.

?LINK-W-DUPLICATE SYMBOL 'SYMBOL' IS FORCED ТО THE ROOT

Причина.

Модуль, содержащий глобальное имя "SYMBOL", помещён в корневой сегмент.

Действие.

Устранить все обращения к глобальному имени "SYMBOL". Повторить редактирование.

?LINK-W-EXTEND SECTION NOT FOUND

Причина.

Не найдена программная секция, к которой относится действие переключателя /E. Переключатель /E игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, указав имя требуемой программной секции.

?LINK-W-FILE NOT FOUND DEV:FILNAM.TYP

Причина.

Не найден указанный входной файл.

Действие.

Проверить, существует ли файл с указанным именем. Ввести правильную командную строку. Повторить редактирование.

?LINK-W-INVALID OPTION: /X

Причина.

Переключатель /X недопустим или используется в недопустимой комбинации. Если ошибка допущена в первой командной строке, то редактор связей игнорирует эту командную строку. Если ошибка допущена в последующих командных строках, то редактор связей игнорирует только переключатель /X.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-W-LOAD ADDRESS ODD

Причина.

Указан нечётный адрес загрузки программной секции, к которой относится действие переключателя /Q.

Действие.

Ввести правильную командную строку, повторить редактирование.

?LINK-W-LOAD ADDRESS ТОО LOW PSECT

Причина.

Значение адреса загрузки программной секции меньше допустимого.

Действие.

Повторить редактирование, указав больший адрес загрузки программной секции.

? LINK-W-LOAD SECTION NOT FOUND PSECT

Причина.

Не найдена указанная секция загрузки в корневом сегменте. Секция игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, поместив секцию загрузки в корневой сегмент.

?LINK-W-MAP WRITE ERROR

Причина.

Ошибка при записи файла карты загрузки. Файл карты загрузки не выводится. Редактирование продолжается.

Действие.

Проверить готовность и исправность оборудования. Проверить том на наличие плохих блоков. Повторить редактирование.

?LINK-W-MULTIPLE DEFINITION OF 'SYMBOL'

Причина.

Многократное определение глобального имени "SYMBOL". Редактор связей использует первое встреченное определение имени "SYMBOL". Редактирование продолжается.

Действие.

Исправить исходную программу. Повторить редактирование.

?LINK-W-NO LOAD ADDRESS

Причина.

Не указан адрес загрузки программной секции, к которой относится действие переключателя /Q.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-W-/O OR /V OPTION ERROR RE-ENTER LINE

Причина.

Переключатели /O или /V указаны в неправильном порядке или используются в недопустимой комбинации.

Действие.

Ввести правильную командную строку. Повторить редактирование.

?LINK-W-ROUND SECTION NOT FOUND AAAAAA

Причина.

В корневом сегменте нет программной секции, к которой относится действие переключателя /U. Переключатель /U игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, указав имя требуемой программной секции.

?LINK-W-STACK ADDRESS UNDEFINED OR IN OVERLAY

Причина.

В корневом сегменте не определено глобальное имя, к которому относится действие переключателя /M. Переключатель /M игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, указав требуемое глобальное имя.

?LINK-W-TRANSFER ADDRESS UNDEFINED OR IN OVERLAY

Причина.

В корневом сегменте не определено глобальное имя, к которому относится действие переключателя /T. Переключатель /T игнорируется, редактирование продолжается.

Действие.

Повторить редактирование, указав требуемое глобальное имя.

?LINK-W-UNDEFINED GLOBALS:
AAAAAA
BBBBBB
 .
 .
 .
 .

Причина.

Глобальные имена AAAAAA, BBBBBB .... не определены.

Действие.

Проверить правильность командной строки. Исправить исходную программу. Повторить редактирование.

ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ

  1. Операционная система ФОДОС-2
    Ассемблер. Описание языка
    589.7545471.00042-01 35 01
  2. Операционная система ФОДОС-2
    Командный язык системы
    589.7545471.00042-01 90 01
  3. Операционная система ФОДОС-2
    Монитор расширенной памяти
    Руководство программиста
  4. Операционная система ФОДОС-2
    Ассемблер
    Руководство программиста
    589.7545471.00042-01 33 02