Главная -> Книги

(0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) (88) (89) (90) (91) (92) (93) (94) (95) (96) (97) ( 98 ) (99) (100) (101) (102) (103) (104) (105) (106) (107) (108) (109) (110) (111) (112) (113) (114) (115) (116) (117) (118) (119) (120) (121) (122) (123) (124) (98)

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

При разработке прикладной программы пользователь выполняет действия в такой последовательности: 1) ввод текста исходной программы с помощью редактора текста; 2) трансляция программы посредством вызова необходимого транслятора; 3) редактирование связей; 4) загрузка и выполнение модуля; 5) отладка программы путем связи прикладной программы с программой-отладчиком и выполнения полученного загрузочного модуля.

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

7-5. ОРГАНИЗАЦИЯ ПОДПРОГРАММ

Во всех прикладных программах, кроме самых простых, одни и те же операции, но с различными данными должны выполняться несколько раз. Примерами могут служить операции умножения чисел в машинах, не имеющих команд умножения, сортировки массива, ввода символа с терминала и т. п. Каждая из таких операций реализуется последовательностями команд, образующих почти автономные программы. Целесообразно эти «программы в программе» включать в исходную и объектную программы только один раз и в нужных местах вызывать их для выполнения с текущими данными. Такие программы называются подпрограммами или процедурами.

Подпрограмма представляет собой сравнительно автономный программный модуль, который может «приводиться в действие» любое число раз. Широкое использование пбдпрограмм имеет большое значение в силу следующих причин: сложную программу можно разделить на более простые и управляемые модули (подпрограммы), которые могут параллельно разрабатываться несколькими программистами; каждая подпрограмма допускает автономную отладку, что ускоряет и упрощает отладку всей программы;



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

Вызов подпрограмм и возврат из подпрограмм. Иниции-pOBaHjie подпрограммы называется вызовом подпрограммы или переходом к подпрограмме. Эту функцию может выполнить команда перехода, целевым адресом которой, загружаемым в программный счетчик, является начальный адрес (т. е. адрес первой команды) подпрограммы, называемый также точкой входа. Однако в отличие от обычного перехода необходим некоторый механизм, обеспечивающий поле заверщения подпрограммы продолжения программы с точки зрения вызова. В ЭВМ применяется несколько таких механизмов.

В первых мини-ЭВМ передача управления подпрограмме осуществлялась командой перехода JMS SUBR, где SUBR - метка точки входа. Эта команда выполняет переход (PC-t-SUBR) и записывает адрес возврата (т. е. адрес команды, следующей за командой JMS SUBR) в первую ячейку подпрограммы. При завершении подпрограммы ее последняя команда косвенного перехода JMP I SUBR возвращает управление в точку вызова путем перехода косвенно, через первую ячейку подпрограммы. При этом способе необходима только одна специальная команда JMS и автоматически обеспечивается любая глубина вложения подпрограмм, т. е. вызов одних подпрограмм другими. Однако здесь имеются и недостатки: невозможно прервать и повторно вызвать ту же самую пэдпрограмму, а кроме того, подпрограммы должны находиться в оперативной памяти.

В современных ЭВМ для организации подпрограмм предусматриваются две специальные команды. Команда вызова CALL или перехода к подпрограмме JSR временно запоминает адрес возврата и загружает в РС начальный адрес подпрограммы. Последняя команда подпрограммы, называемая возвратом из подпрограммы с мнемониками RET или RTS загружает в РС запомненный адрес возврата. Команды вызовов и возвратов могут быть условными, когда выполнение соответствующего действия зависит от удовлетворения некоторого условия (состояния флажка), указанного в коде операции.

Связь вызывающей программы с подпрограммой осуществляется через стек. В микропроцессоре КР580 команда вызова CALL SUBR записывает адрес возврата в стек и загружает в РС начальный адрес SUBR подпрограммы, а



команда возврата RET извлекает из стека адрес возврата и загружает его в PC.

В процессорах СМ реализована более сложная организация подпрограмм, с использованием регистра связи reg, который определяется пользователем для запоминания адреса возврата. При выполнении команды перехода к подпрограмме JSR reg, SUBR содержимое регистра связи reg включается в аппаратный стек, в регистре связи запоминается адрес возврата (содержимое PC после выборки из памяти команды JSR), а в PC загружается начальный адрес подпрограммы. Важно подчеркнуть, что эффективный адрес SUBR, определяемый в любом режиме адресации, находится первым и временно запоминается в программно-недоступном регистре процессора.

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

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

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



(0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) (88) (89) (90) (91) (92) (93) (94) (95) (96) (97) ( 98 ) (99) (100) (101) (102) (103) (104) (105) (106) (107) (108) (109) (110) (111) (112) (113) (114) (115) (116) (117) (118) (119) (120) (121) (122) (123) (124)