Команды, оперирующие с подпрограммами

 Операции с подпрограммами отличаются от обычных переходов по программе тем^что вычислительный процесс должен вернуться после исполнения подпрограммы к первоначальной программе. Например, программе ЗАРПЛАТА нужны подпрограммы, которые занимаются выборкой файлов данных, сортировкой данных, подсчетом заработной платы, налогов и печатают результаты. Очевидно, что многие из этих подпрограмм могут использоваться другими программами или в различных местах этой же программы. Электронно-вычислительная машина должна выполнить подпрограмму и затем вернуться к основной программе в то место, где ее выполнение было приостановлено подпрограммой.



Основные команды с подпрограммами — это команды CALL (ВЫЗОВ ПОДПРОГРАММЫ) и RETURN (ВОЗВРАТ К ОСНОВНОЙ ПРОГРАММЕ). Команда CALL передает управление подобно команде JUMP; разница заключается в том, что по команде CALL сохраняется содержимое счетчика команд с тем, чтобы иметь возможность вернуться к основной программе. По команде RETURN ЭВМ возвращается к первоначальной программе, т. е. в счетчике команд восстанавливается значение, запомненное командой CALL.



В некоторых ЭВМ по команде CALL запоминается содержимое счетчика, команд в ячейке памяти, к которой осуществляется переход. Эта разновидность команд CALL называется JUMP AND MARK LACE или JUMP AND SAVE (ПЕРЕЙТИ И ОТМЕТИТЬ МЕСТО или ПЕРЕЙТИ И ЗАПОМНИТЬ). На рис. 3.16 показано выполнение команды JUMP AND MARK PLACE. Электронно-вычислительная машина помещает прежнее содержимое счетчика команд в ячейку памяти 700 и начинает выполнение подпрограммы с ячейки 701. Чтобы вернуться к основной программе, нет необходимости в специальной команде RETURN. Команда косвенного перехода (JUMP @ 700) в конце подпрограммы обеспечить переход к адресу, сохраняемому в ячейке памяти 700. Так как ячейка памяти 700 содержит ад^ес команды, следующей непосредственно за JUMP AND MARK PLACE, ЭВМ возвращается к основной программе.

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

Другой разновидностью команды CALL является команда JUMP AND LINK (ПЕРЕЙТИ И СОЕДИНИТЬ), которая помещает старое содержание счетчика команд в соединительный регистр. На рис. 3.17 дан пример комнды JUMP AND LINK- Когда ЦП выполняет команду, извлеченную из ячейки памяти 200, он засылает число 700 в счетчик команд, а инкрементированное содержимое счетчика команд (201) — в регистр. Команда RETURN в конце подпрограммы (ячейка памяти 730) помещает содержимое регистра в счетчик команд и, таким обра-зом* возвращается управление основной программе. Этот метод управления подпрограммами быстрее метода, использующего команду JUMP AND MARK PLACE, так как ЦП не нужно запоминать старое содержимое счетчика команд или выполнять длительный косвенный переход в конце подпрограммы. Однако этот метод не позволяет осуществлять вложение подпрограмм, т. е. подпрограмма не может вызвать другую подпрограмму, пока она загружает регистр. Регистры, которые используются для соединения подпрограмм, непригодны для других целей.

Еще одной разновидностью команды CALL является команда, по которой запоминается адрес возврата в стеке (см. рис. 2.19). В этом случае команда RETURN является командой безусловного перехода, которая использует стековую адресацию. Команда CALL запоминает адрес возврата в стеке; команда RETURN восстанавливает его в счетчику команд по окончании выполнения подпрограммы. Этот метод требует дополнительного времени, так как происходит обращение к стеку. Использование стека позволяет иметь много уровней вложения подпрограммы (в зависимости от емкости стека) и обрабатывать рекурсивные выражения.

Многие ЭВМ имеют специальную команду для вызова подпрограмм, размещенных по нескольким специальным адресам. Эта команда называется TRAP или SOFTWARE (ЛОВУШКА или ПРОГРАММНОЕ ПРЕРЫВАНИЕ). Команды TRAP имеют короткий формат и выполняются быстро, так как их адресные части обычно фиксируются либо изготовителем ЭВМ, либо операционной системой. В некоторых ЭВМ подцрограмдоы обслуживания программных прерываний размещаются в специальном ПЗУ, к которым ЭВМ может обращаться при возникновении ошибок или сбоев в вычислительном процессе.

Команды ОСТАНОВ И ОТСУТСТВИЕ ОПЕРАЦИЙ Команды ОСТАНОВ (HALT) заставляет ЭВМ приостановить на время работу до поступления внешнего сигнала. По команде ОТСУТСТВИЕ ОПЕРАЦИЙ (NO OPERATION) не выполняется никакой операции, она только занимает цикл команды и увеличивает содержимое счетчика команд на единицу. Эта команда очень полезна. Команды NO OPERATION могут обеспечивать короткие задержки, замещать ошибочные команды, они предоставляют возможность для внесения исправлений в программу и замещают подпрограммы, которые возможно еще и не написаны.