
книги из ГПНТБ / Система математического обеспечения ЕС ЭВМ
..pdfПри использовании макрокоманды LOAD передача управления с возвратом может осуществляться макрокомандой CALL. Рас смотренную выше программу можно записать следующим обра зом;
МО |
L O A D |
|
L R |
M l' |
C A L L |
М 2 |
C A L L |
М 4 |
D E L E T E |
* . * |
« |
W |
D C . . |
X |
D C . . |
Y |
D C . . |
Z |
D C . . |
E P = A 15,0
( 1 5 ) , (X , Y, Z ) , V L
(1 5 ), (W , Y, Z ) , V L
E P = A
*
Макрокоманда LOAD выдает адрес точки входа в регистре 0. Макрокоманда CALL требует, чтобы адрес точки входа находился в регистре 15. Производится пересылка содержимого регистра О в регистр 15. Программа с использованием макрокоманды CALL будет выполняться быстрее, так как в этом случае передача и возврат управления осуществляются без участия управляющей программы, как это делается при использовании макрокоманды
LINK.
Использование макрокоманды LOAD экономит время, но ведет к расходу оперативной памяти. Использование операнда DE в макрокоманде LINK в сочетании с использованием макрокоманды BLDL является компромиссным вариантом, который не требует большого расхода памяти и экономит время при загрузке про граммы. Вариант заключается в том, что с помощью макро команды BLDL в память загружается один раз элемент оглавле ния библиотеки для требуемой программы и затем при каждом обращении к программе в операнде DE указывается адрес этого элемента. В результате загрузка программы из библиотеки произ водится за одно обращение к устройству. Поиск элемента оглав ления не производится, так как он уже находится в оперативной памяти.
Макрокоманда BLDL может одновременно загрузить элементы оглавления для нескольких разделов библиотеки. Для этого в основной памяти резервируется память для будущих элементов оглавления и в зарезервированные области для каждого элемента записывается имя соответствующего раздела библиотеки. Для каждого элемента необходимо 58 байтов. Кроме того, в начале списка элементов два байта отводятся для указания числа эле ментов и два байта для указания длины каждого элемента. Спи сок должен начинаться на границе полуслова.
Ш
Рассмотрим |
пример: |
|
МО |
BLDL |
0,M5 |
мГ |
LINK |
DE = NAME1, PARAM=(X, Y, Z), VL=l |
М2 |
LINK |
DE = NAME2, PARAM= (X), VL=l |
М3 |
LINK |
DE = NAME1, PARAM=(W, Y, Z), VL=1 |
М4 |
LINK |
DE = NAME2, PARAM= (W), VL=I |
М5 |
DC |
H’2’ |
NAME1 |
DC |
H’58’ |
DC |
CL8’A’ |
|
NAME2 |
DS |
CL50 |
DC |
CL8’B’ |
|
|
DS |
CL50 |
V |
DC . . |
|
XDC . . .
YDC . .
ZDC . . ■
Макрокоманда МО строит список элем ентов оглавлен ия
вый операнд, равный нулю, говорит о том, что используется биб лиотека пункта задания, библиотека задания или общая библио тека. Если необходимо использовать личную библиотеку, то пер вым операндом должен быть адрес блока управления данными. Второй операнд определяет адрес списка элементов оглавления М5. В начале списка указывается, что он состоит из двух элемен тов, каждый из которых занимает 58 байтов. Далее размещаются два поля для элементов оглавления. Первые 8 байтов каждого элемента содержат имя раздела библиотеки или альтернативное
имя. Остальные 50 байтов заполняются |
макрокомандой BLDL |
информацией из оглавления, необходимой |
для последующей за |
грузки программы, являющейся разделом |
библиотеки. |
Макрокоманды Ml, М2, М3 и М4 осуществляют загрузку про грамм за одно обращение к библиотеке, так как элементы оглав ления уже загружены в память макрокомандой BLDL.
До сих пор рассматривались макрокоманды, представленные в стандартной форме. Ряд макрокоманд может иметь описатель ную и исполнительные формы. Описательная форма применяется для того, чтобы обеспечить список параметров, который должен быть передан либо управляющей программе, либо другой про блемной программе. Макрорасширение описательной формы не содержит выполняемых кодов. Это значит, что в описательной форме нельзя использовать регистры.
Исполнительная форма используется с одним или двумя спи сками параметров, полученными описательными формами. Мак рорасширение исполнительной формы представляет собой выпол няемые коды команд, необходимые для изменения списков пара метров и передачи управления требуемой программе,
112
Наличие описательной и исполнительной форм макрокоманд связано с тем, что не все макрокоманды являются реентерабель ными, а нереентерабёльные макрокоманды нельзя использовать при разработке реентерабельных программ.
Макрокоманды, в которых параметры передаются списком, имеют исполнительную и описательную формы. Расширение стан дартной формы этих макрокоманд имеет своим результатом список параметров, и выполняемые команды, которые обходят список, загружают адрес списка и передают управление на нужную под программу управляющей программы. Расширения описательной и исполнительной форм макрокоманд разграничивают функции, объединенные в расширение стандартной формы: описательная форма обеспечивает только список параметров, а исполнительная форма обеспечивает выполняемые команды для изменения списка и передачи управления. Команды загрузки адреса списка в регистр обеспечивает программист. В реентерабельной программе необхо димо применять описательную и исполнительную формы макро команд.
Описательная и исполнительная формы макрокоманд использу ются совместно, что обеспечивает возможности, доступные в случае применения стандартной формы макрокоманды. Преимущества использования описательной и исполнительной форм заключаются в том, что операнды, которые остаются постоянными при каждом использовании макрокоманды, могут кодироваться в описательной форме. Эти операнды могут быть затем опущены в каждой из исполнительных форм макрокоманды, которая использует описа ние. В результате можно заметно сократить время кодирования и области основной памяти, когда макрокоманда используется не сколько раз. Исполнительная форма макрокоманды, как правило, может изменять любой из ранее определенных операндов. Описа ние, используемое исполнительной формой макрокоманды, может быть перенесено в часть основной памяти, которая была выделена по макрокоманде GETMAIN, что гарантирует реентерабельность программы.
Рассмотрим пример использования описательной и исполни тельной формы макрокоманды LINK. Эта макрокоманда использу ет два списка: список параметров управляющей программы (ЕР, EPLOC, DE, DCB), адрес которого помещается в регистр 15, и спи сок параметров вызываемой программы (PARAM, VL), адрес которого помещается в регистр 1. Существует исполнительная форма макрокоманды LINK и описательная форма для парамет ров управляющей программы. Для параметров вызываемой про граммы необходимо использовать описательную форму макро команды CALL. Предположим, что очень часто в программе ис пользуется следующая запись макрокоманды:
L I N K Е Р = А , D C B = M 5 , P A R A M = ( X , Y, Z ) , V L = 1
Для формирования списка управляющей программы может быть использована описательная форма макрокоманды LINK:
М К L I N K Е Р = А , D C B = M 5 , S F = L
8, Заказ 3414. |
ИЗ |
Для формирования списка вызываемой программы может быть использована описательная форма макрокоманды CALL:
М С C A L L ,( Х , Y, Z ) , V L , M F = L
Так как описательные формы макрокоманд не формируют ис полнительных кодов команд, они должны быть расположены среди массива констант и рабочих полей. В случае, если они расположе ны среди команд, необходимо предусмотреть команды обхода описательных форм, чтобы управление не попадало на них.
Для передачи управления вызываемой программе используется исполнительная форма макрокоманды LINK, которая ссылается на две описательные формы:
L I N K M F = ( E , М С ) , S F = ( E , М К )
Возврат управления в динамической структуре происходит та ким же образом, как и возврат управления между программами в одном и том же загрузочном модуле. Программа, осуществляю
щая возврат управления, восстанавливает |
регистры |
2—14, уста |
|||
навливает в регистре 15 код |
возврата |
и |
передает |
управление |
|
с использованием регистра 14. |
Для программы, |
которой возвра |
|||
щается управление, содержимое регистров 2—13 не |
меняется, в |
||||
регистре 14 находится адрес точки возврата, а |
регистр 15 содер |
||||
жит код возврата. Возврат управления |
может |
быть |
осуществлен |
либо с помощью команды перехода, либо макрокомандой RETURN.
Если управление было передано без участия управляющей про граммы, то это все, что происходит при возврате. Если управление в вызываемую программу было передано с помощью управляющей программы, то сначала происходит возврат к управляющей про грамме, а потом уже к вызывающей программе.
Рассмотрим передачу управления без возврата. Когда при пере даче управления между загрузочными модулями не требуется воз врата управления, применяется макрокоманда XCTL. Можно так же передавать управление командой перехода.
Для передачи управления без возврата с помощью команды перехода необходимо выполнять следующие действия. Для загруз
ки модуля в память должна быть выдана |
макрокоманда |
LOAD. |
||
Адрес точки входа, полученный |
в регистре |
0, загружается в ре |
||
гистр 15. Соглашения о связях |
при передаче управления |
между |
||
загрузочными модулями те же, |
что и при |
передаче |
управления |
|
между программами в случае |
простой структуры: |
в регистр 13 |
нужно снова загрузить адрес старой области сохранения; с помо щью этой области восстанавливаются регистры 14 и 2 —12. Ре гистр 1 используется для передачи списка параметров. Для пере дачи управления выдается команда перехода по адресу в реги стре 15.
Попеременное использование команд перехода и макрокоманд XCTL не рекомендуется.
] 14
Макрокоманда XCTL имеет следующий формат:
[ и м я ] X C T L |
[ ( р е г и с т р |
1 [ , реги стр |
2 1 ) 1 , |
/ ГГ1 |
имя |
точки |
в х о д а |
||
L |
J |
r |
r |
v |
1 |
| Ь Р = |
|||
|
|
|
|
|
|
| E P L O C = |
а д р е с |
им ени точки в х о д а |
|
|
|
|
|
|
|
[ О Е = |
а д р е с эл е м е н т а списка |
[, DCB= адрес]
Регистр 1 и регистр 2 — адреса регистров общего назначения в диапазоне от 2 до 12, которые должны быть восстановлены из об ласти сохранения, адрес которой находится в регистре 13. Это означает, что перед использованием макрокоманды XCTL в реги стре 13 необходимо восстановить адрес области сохранения.
Назначение остальных операндов точно такое же, как для мак рокоманды LINK. Макрокоманда XCTL, кроме передачи управле ния, указывает управляющей программе, что использование за грузочного модуля, содержащего макрокоманду XCTL, заверши лось. Следовательно, адрес старой области сохранения должен быть вновь загружен в регистр 13. Адрес точки возврата должен быть вновь загружен в регистр 14 из старой области сохранения. Восстановление регистров 2—12 может быть запрошено в самой макрокоманде XCTL или же может быть сделано предварительно. При использовании макрокоманды XCTL программист формирует список параметров, адрес которого засылается в регистр 1. Однако список параметров должен находиться в той части основной памя ти, которая расположена вне загрузочного модуля, использующего макрокоманду XCTL. Это делается потому, что копия этого загру зочного модуля может быть исключена до того, как вызываемый загрузочный модуль сможет использовать эти параметры.
По способу передачи управления макрокоманда XCTL подобна макрокоманде LINK. Управление передается с помощью управ ляющей программы. Управляющая программа загружает, если это необходимо, копию загрузочного модуля, устанавливает в регистре 15 адрес точки входа, запоминает адрес, переданный в регистр 14, помещает туда новый адрес точки возврата внутрь управляющей программы и передает управление по адресу в регистр 15.
4.6. РАСПРЕДЕЛЕНИЕ ОСНОВНОЙ ПАМЯТИ
Для выполнения пункта задания выделяется некоторая область оперативной памяти фиксированного размера. В однопрограммном режиме это вся динамическая область памяти, не используемая управляющей программой. В мультипрограммном режиме с фикси рованным числом задач это раздел памяти соответствующего клас са, размер которого устанавливается при генерации и может быть переопределен оператором в процессе загрузки или работы систе мы. В мультипрограммном режиме с переменным числом задач это раздел, размер которого определяется параметром REGION в операторах JOB или ЕХЕС.
Во всех режимах память, выделенная пункту задания, резерви руется за ним. Чтобы ее можно было использовать, необходимо
8* |
115 |
предварительно выдать запрос на область памяти требуемого раз мера. Память, зарезервированная за пунктом задания, на которую не был выдан запрос, считается свободной. Если некоторая об ласть памяти, на которую был выдан запрос, более не требуется, ее следует освободить, чтобы она могла быть использована для других запросов. Когда суммарный объем запрошенной памяти превышает размер раздела, пункт задания завершается аварийно. Исключение составляет режим с переменным числом задач, в ко тором используется средство свертки. Оно позволяет получить до полнительную область оперативной памяти за счет свободных уча стков или за счет свертки заданий.
Для запроса оперативной памяти используется макрокоманда GETMAIN. Освобождение оперативной памяти осуществляется макрокомандой FREEMAIN. С помощью этих макрокоманд произ водится динамическое распределение оперативной памяти, зарезер вированной за пунктом задания. Динамическое резервирование (распределение) оперативной памяти для пунктов заданий осуще ствляется только в режиме с переменным числом задач. Во всех остальных режимах оно носит статический характер.
Запросы на область оперативной памяти могут быть явными и неявными. Наиболее характерным примером явного запроса явля ется применение макрокоманды GETMAIN. При этом пункту зада ния выделяется область памяти, размер которой указывается в макрокоманде, из свободной зарезервированной за пунктом зада ния памяти. Выделенная память не очищается, потому не следует делать каких-либо предположений относительно ее начального со держимого: оно может быть произвольным. Память, полученная с помощью явных запросов, используется для хранения данных, а также для хранения некоторых управляющих блоков и таблиц, требуемых в процессе выполнения задачи. Освобождение запро шенных ранее областей оперативной памяти осуществляется мак рокомандой FREEMAIN, которая переводит область в состояние свободной памяти пункта задания.
Е1еявные запросы на область оперативной памяти осуществля ются макрокомандами, которые для выполнения своих функций требуют выделения области памяти. Например, в макрокоманде LINK нет явного упоминания каких-либо областей оперативной памяти. Одной из ее функций является загрузка программ в опе ративную память, что требует выделения свободного участка памяти для загрузки программы из библиотеки. Таким образом осуществляется неявный запрос.
В случае неявных запросов программист не должен указывать требуемого размера оперативной памяти. Управляющая программа определяет необходимый размер и выдает запрос на память с по мощью макрокоманды GETMAIN.
При динамическом распределении памяти в условиях мульти программирования в рамках одного пункта задания возникает проблема фрагментации памяти. В процессе выделения и освобож дения областей памяти, который осуществляется асинхронно раз
116
личными задачами, вся свободная память может оказаться раз дробленной на большое число мелких областей. При выдаче оче редного запроса может возникнуть ситуация, при которой ни одна из этих областей не сможет удовлетворить запрос, хотя суммар ный объем свободной памяти достаточно велик.
Чтобы избежать фрагментации памяти, используется понятие подпула, которое позволяет связать память с задачей. Подпул обозначается номером, который указывается в макрокомандах GETMAIN или ATTACH и образуется при первом употреблении номера данного подпула в этих макрокомандах. Макрокоманда ATTACH может создать подпул без выделения памяти. Подпул может включать память, полученную по запросам с одинаковым номером подпула одной и той же задачей. Наращивание подпулов производится блоками оперативной памяти по 2К. Подпул может находиться как в монопольном использовании задачей, так и в совместном использовании несколькими задачами. Задача может передать подпул для использования своей подзадаче. Подпул с нулевым номером является общим для всех задач пункта задания.
Рассмотрим функции макрокоманды GETMAIN, которая явля ется основным средством получения областей памяти и использует ся как в случае явных, так и в случае неявных запросов. Макро
команда GETMAIN позволяет |
осуществлять следующие |
четыре |
|||
типа запросов (тип запроса отмечается |
буквой в качестве |
первого |
|||
позиционного операнда макрокоманды): регистровый (R), |
элемент |
||||
ный (Е), списковый (L), переменный (V). |
следующий форматг |
||||
Регистровый тип макрокоманды |
имеет |
||||
[ и м я ] G E T M A I N R, |
L V = / |
чи сло |
1 |
[ , S P — ч и сло ] |
|
|
I |
(0) |
/ |
|
|
Операнд R указывает на регистровый тип макрокоманды. Опе ранд LV задает размер запрашиваемой памяти либо в форме чис ла в самой макрокоманде, либо в регистре 0. Операнд SP опреде ляет номер подпула. Если он опущен, то предполагается нулевой подпул.
Когда система удовлетворяет запрос, адрес выделенной обла сти памяти помещается в регистр I и может быть использован в программе после макрокоманды GETMAIN регистрового типа. Если система не может выделить память требуемого размера, то это приводит к аварийному завершению пункта задания. Регист ровый запрос является безусловным (условные и безусловные запросы обсуждаются ниже).
Регистровый тип запроса является реентерабельным, поскольку параметры передаются через регистры. Запросы остальных типов нереентерабельные и кроме стандартной формы имеют описатель ную и исполнительную формы.
Пусть необходимо получить область памяти размером в 320 байтов и ее адрес поместить в регистр 2.
G E T M A I N ’ R , L V = 320
L R 2,1
117
Так как адрес выделенной области памяти находится в регист ре 1, его необходимо переслать в регистр 2 командой LR.
Тот же пример с использованием регистра 0 для указания объема памяти выглядит следующим образом:
L 0 .V L M
G E T M A I N R, L V = (0)
L R |
2,1 |
V L M D C |
F* 3 2 0 ’ |
»* *
Элементный тип макрокоманды GETMAIN имеет следующий формат:
[ и м я ] G E T M A I N Е | С | , Е У = ч и с л о , А = а д р е с [ , 5 Р = ч и сл о ]
Операнд Е указывает на элементный тип макрокоманды. Раз
мер запрашиваемой памяти, как |
и раньше, задается |
операндом |
LV. Второй операнд макрокоманды С или U определяет соответ |
||
ственно условный или безусловный запрос. |
по границе |
|
Операнд А указывает адрес |
слова, выравненный |
полного слова, куда система должна поместить адрес выделенной области памяти. Параметр SP определяет номер подпула.
Если в случае безусловного запроса система не может выде лить область памяти требуемого размера, то это приводит к ава рийному завершению пункта задания. Условный запрос не приво дит к аварийному завершению. О реакции на запрос система сооб щает с помощью кода возврата в регистре 15. Если код возврата равен нулю, это значит, что область памяти выделена. Если код возврата равен 4, область памяти требуемого размера не может быть выделена.
Рассмотрим предыдущий пример запроса, выполнив его с по мощью элементного типа макрокоманды:
G E T M A I N E U , L V = 3 2 0 , A = A D D R
L 2 ,A D D R
A D D R DS* F
•*■
Выдается безусловный элементный запрос на область памяти 320 байтов. Адрес выделенной области система должна поместить в слово ADDR, которое выравнено по границе полного слова. Если система не найдет области свободной памяти размером не менее 320 байтов в разделе, отведенном пункту задания, то при выполнении макрокоманды GETMAIN возникнет аварийное завер шение.
Видоизменим предыдущий пример таким образом, что в слу чае выделения области памяти необходимо продолжать выполне ние программы, а в случае, если память выделить нельзя, необхо димо перейти по имени MIN. Для этого используем условный элементный запрос:
118
GETMAIN EC, LV=320, A=ADDR
L T R |
15,15 |
|
B N Z |
M I N |
|
L 2 . A D D R |
|
|
A D D R D S F |
|
|
M I N |
|
|
Команда |
LTR проверяет содержимое регистра |
15, в котором |
находится код возврата. Если он не равен нулю (т. |
е. равен четы |
рем, так как других кодов возврата макрокоманда GETMAIN не выдает), то команда BNZ передает управление на MIN. Если же код возврата равен нулю, то это значит, что область памяти была выделена, и ее адрес загружается в регистр 2.
Списковый тип запроса допускается только в режиме с пере менным числом задач. Списковый тип позволяет выдать запрос сразу на несколько областей памяти. Перед выдачей запроса необ ходимо сформировать два списка. В одном списке помещаются размеры каждой запрашиваемой области памяти. Список состоит из слов, выравненных по границе полного слова. Последний эле мент в списке отмечается единицей в старшем бите. Второй список предназначен для того, чтобы управляющая программа поместила в него адреса выделенных областей памяти. Этот список также состоит из слов, выравненных по границе полного слова. Оба спи ска имеют одинаковые размеры.
Списковый тип макрокоманды имеет следующий формат:
[ и м я ] G E T M A I N L |
, Ь А = а д р е с , А = » а д р е с |
[ , S P = 4ncyio] |
|
Операнд L указывает на списковый тип макрокоманды. Второй |
|||
операнд С или U определяет условный |
или безусловный запрос. |
||
Операнд LA определяет адрес списка |
размеров |
запрашиваемых |
областей. Операнд А определяет адрес списка для адресов выде ленных областей. Запрос считается удовлетворенным, если систе ма выделит все требуемые области памяти. Операнд SP опреде
ляет номер подпула. |
памяти размером 320, |
||
Пусть требуется получить три области |
|||
480 и 600 |
байтов. Адреса этих областей |
необходимо загрузить в |
|
регистры 2, 3 и 4 соответственно. Запрос безусловный. |
|||
|
G E T M A I N L U , L A = L I S T 1 , A = L I S T 2 |
|
|
|
L M 2 ,4 ,L I S T 2 |
|
|
L IS T 1 |
D C |
F ’32 0 ’ ' |
|
|
D C |
F ’4 8 0 ’ |
|
|
D C |
X ’8 0 ’ |
|
|
D C F L 3 ’6 0 0 ’ |
|
|
L I S T 2 |
D S |
3 F |
|
Имя LIST1 обозначает список размеров запрашиваемых обла стей. Последний элемент отмечается единицей в старшем бите
119
посредством команды DC Х’80’. Имя LIST2 обозначает список
адресов выделенных |
областей памяти. |
Для |
него резервируется |
|||
память из трех полных слов. |
производит |
запрос |
на одну |
|||
Переменный тип |
макрокоманды |
|||||
область памяти. При этом указываются |
максимальный и.мини |
|||||
мальный размеры |
запрашиваемой |
области. |
Система |
пытается |
||
удовлетворить запрос по максимальному |
значению. Если это ей |
|||||
не удается, то она выдает наибольшую |
область |
памяти, размер |
||||
которой не меньше минимального. |
Если |
и это не удается, то за |
||||
прос считается неудовлетворенным. |
В случае |
выделения памяти |
система помещает адрес и размер выделенной области в два по следовательных полных слова, зарезервированных программистом.
Переменный тип имеет следующий формат:
[имя] G E T M A I N V , L A = а д р е с , А*= а д р е с [ , 5 Р = ч и с л о ]
Операнд V указывает на переменный тип макрокоманды. Вто рой операнд С или U определяет условный или безусловный за прос. Операнд LA определяет адрес двух последовательных полных слов, выравненных по границе полного слова, первое из которых хранит минимальный размер области памяти, второе — максималь ный. Операнд А определяет адрес двух последовательных слов, выравненных по границе полного слова, которые резервируются для ответа системы. В первое слово она помещает адрес отведен ной Ъбласти памяти, во второе — ее размер.
Пусть требуется получить область памяти размером от 320 до 640 байтов. Адрес выделенной области поместить в регистр 2, а ее размер в регистр 5. Запрос должен быть безусловным.
|
G E T M A I N V U , L A = M I N M A X , A = A D D R S I Z E |
|
|
L 2 . A D D R S I Z E |
|
|
L 5 , A D D R S I Z E + 4 |
|
M 1 N M A X |
D C |
F ’32 0 ’ |
|
D C |
F '6 4 0 ’ |
A D D R S I Z E |
D S 2 F |
Освобождение ранее отведенной памяти осуществляется с по мощью макрокоманды FREEMAIN, которая выполняет действия, обратные действиям макрокоманды GETMAIN. Для макрокоманды FREEMAIN также существуют четыре типа запросов: регистровый, элементный, списковый и переменный. Для освобождения памятй необходимо задать не только размер, но и адрес освобождаемой области памяти. Операнды макрокоманды FREEMAIN аналогичны операндам макрокоманды GETMAIN.
Макрокоманда FREEMAIN регистрового типа имеет следующий формат:
[имя] F R E E M A I N R ,[ L V = J |
(0 ) |
I , A~= | (1) ) ] [ , Б Р = ч и с л о ] |
[ |
числ о / |
[ а д р е с / |
120