Cтраница 3
Первые три слова этой области заполняются по макрокоманде SYNADAF следующим образом: 1-регистр параметров PARM2, 2 - регистр параметров PARM1, 3 - адрес старой области сохранения. [31]
Регистры ссязей ( см. 2.6) - регистры, которые используются для связей между модулями: регистры 0 и 1-для передачи параметров, регистр 1-для передачи адреса списка параметрои; регистр 13 - адрес области сохранения; регистр 14-адрес возврата; регистр 15-содержит адрес точки входа при передаче управления вызываемому модулю и код возврата при возврате управления вызывающему модулю. [32]
Напомним, что при обращении в подпрограмме необходимо загрузить в регистр 15 адрес точки входа в подпрограмму, в регистр 14 адрес точки возврата, а в регистр 1 - адрес таблицы адресов параметров. Адрес области сохранения для подпрограмм обычно загружается в регистр 13 в начале программы. Опыт программирования показывает, что таблицу адресов параметров удобнее записывать не в отдельной области памяти, а вместе с командами обращения к подпрограмме: программа становится нагляднее. [33]
Область сохранения размером 18 слов резервируется в каждой программной единице. Во втором слове сохраняется адрес области сохранения той программной единицы, которая вызвала данную программную единицу. В третье слово помещается адрес области сохранения вызываемой программы. Заполнение области сохранения программы производится как вызывающей, так и вызываемой программами. [34]
В случае успешного выполнения макрокоманды SYNADRLS освобождаются буфер сообщения и область сохранения, построенные по макрокоманде SYNADAF. Управляющая программа загружает регистр 13 адресом предшествующей области сохранения и устанавливает нуль в третьем слове этой области сохранения. В регистр 0 помещается нулевой код возврата ( 00), означающий успешное завершение. [35]
Вызываемый модуль производит перезапись содержимого регистров в слова 4 - 18 области сохранения вызывающего модуля и приступает к исполнению. После исполнения вызываемый модуль загружает в регистр 13 адрес области сохранения вызывающего модуля ( второе слово), а в регистры 14, 15, 0 - 12 переписывав. При написании программы на языке Ассемблера эти действия должен предусмотреть программист. Если же программа пишется на языке высокого уровня, их выполняет компилятор. [36]
Память, запятая модулем, считается свободной сразу после выдачи макрокоманды. Перед выдачей макрокоманды XCTL необходимо восстановить регистр 13, содержащий адрес старой области сохранения, чтобы затем был восстановлен регистр 14, который содержит возврат в программу более высокого уровня. [37]
Макрокоманда SYNADARLS освобождает области основной памяти, запрошенные макрокомандой SYNADAF для сохранения регистров, буфера сообщения и области сохранения параметров. При выдаче макрокоманды SYNADARLS регистр 13 должен содержать обеспечиваемый макрокомандой SYNADAF адрес области сохранения регистров. [38]
Далее следуют предложения, реализующие функцию программы. Заключительные команды: команда L восстанавливает в ОР ( 13) адрес области сохранения вызывающей программы; команда LM использует этот адрес для восстановления значений в остальных общих регистрах. Команда BCR возвращает управление вызывающей программе. [39]
Программы пользователя в ПУС могут быть открытыми и закрытыми. Регистр 12 является базовым для открытой программы, в регистре 13 содержится адрес области сохранения. [40]
В области сохранения вызывающей программы запоминается содержимое общих регистров вызывающей программы и адрес области сохранения вызываемой программы. Если вызывающая программа является также и вызываемой, то в ее области сохранения запоминается адрес области сохранения программы, которая ее вызвала. [41]
Всякий раз, когда управление передается подпрограмме, вызывающая программа должна в соответствии с принятыми соглашениями обеспечить для вызываемой программы область сохранения, в которую вызываемая программа будет записывать содержимое общих регистров. В регистр 13 - регистр области сохранения - до начала выполнения вызывающей последовательности должен быть загружен адрес области сохранения. Области сохранения связываются в цепочку по мере передачи управления программам более низкого уровня. [42]
В простейшем случае, когда в процессе обработки прерывания от второго канала других прерываний не происходит, программа, информация о которой записана в области сохранения, снова получает управление после выполнения команды JMP STACK. Эта команда переписывает информацию из области сохранения на регистры. Адрес области сохранения известен - он находится в SPR. После переноса сохраненной информации на регистры процессора выполнение прерванной программы возобновляется с нужной точки. [43]
Первое слово программист может использовать по своему усмотрению. Если вызываемая программа в свою очередь не вызывает другую программу, то слова 2 и 3 могут и не понадобиться. Слово 2 содержит адрес последней используемой области сохранения. Слово 3 содержит адрес следующей области сохранения, которая будет выделена в случае необходимости. Макрокоманда SAVE порождает команду STM, запоминающую в соответствующих словах указанные в макрокоманде регистры. [44]