Команды для работы с подпрограммами. Стеки. В практике программирования широко используется такой прием, как организация подпрограмм. Подпрограмма описывается один раз, а использоваться (вызываться) может из различных мест программы. При этом, после того как подпрограмма закончила свою работу, управление должно быть передано туда, откуда подпрограмма была вызвана на команду, следующую в памяти сразу за командой обращения к подпрограмме. Адрес команды, на которую управление передается после окончания работы подпрограмм, называется адресом возврата. Очевидно, для того, чтобы начать выполнять подпрограмму, в программный счетчик необходимо загрузить адрес первой команды подпрограммы. Для осуществления возврата из подпрограммы необходимо запомнить в каком-то месте адрес возврата. Можно, например, сохранить адрес возврата в одном из регистров процессора. Такой способ сохранения адреса возврата очень прост и легко реализуется. Однако он обладает одним существенным недостатком. Достаточно часто встречаются подпрограммы, которые вызывают другие подпрограммы. Пусть основная программа вызвала подпрограмму А. Она в свою очередь обратилась к подпрограмме В. Если адрес возврата для подпрограммы А хранится в регистре процессора, то куда девать адрес возврата при вызове подпрограммы В?
Для организации подпрограмм большинство ЭВМ используют аппаратно поддерживаемую структуру данных, называемую стеком. Стек — это структура данных, организованная по принципу: последним вошел — первым вышел, т.е. последние записанные в стек данные извлекаются из него первыми. В переводе с англ, stack — стопка. Аналогом стека может служить стопка тарелок. Положить тарелку в стопку можно только сверху, извлечь опять-таки только верхнюю тарелку. В ЭВМ для организации стека выделяется область оперативной памяти, а для ее адресации и доступа к стеку используется упоминавшийся выше регистр — указатель стека. Указатель стека хранит адрес ячейки памяти, содержащей последнее помещенное в стек значение. При записи числа в стек указатель стека модифицируется так, чтобы он указывал на следующую свободную ячейку, и в нее записываются данные. При извлечении из стека данные считываются из ячейки, на которую указывает указатель стека, затем указатель стека модифицируется так, чтобы указывать на предпоследнее запомненное значение. Обычно стеки растут в сторону уменьшения адресов, т.е. при записи числа указатель стека уменьшается, при извлечении — увеличивается.
При организации работы с подпрограммами для сохранения адреса возврата используется стек. Команды вызова подпрограмм CALL <адрес> работают следующим образом. Когда процессор считывает из памяти команду вызова подпрограммы, программный счетчик увеличивается и показывает на команду, следующую за командой вызова подпрограммы. С этой команды выполнение программы должно продолжиться после окончания работы подпрограммы. Таким образом, программный счетчик после выборки команды вызова подпрограммы содержит адрес возврата. При выполнении обращения к подпрограмме процессор сохраняет содержимое программного счетчика в стеке. Адрес, с которого начинается подпрограмма, вычисляется процессором по адресному полю команды вызова подпрограммы и помещается в программный счетчик. Процессор приступает к выполнению подпрограммы. Если подпрограмма в процессе своей работы вызовет другую подпрограмму, новое значение адреса возврата будет также включено в стек поверх старого адреса возврата.
Для возврата из подпрограммы в основную программу служат команды возврата RETURN. Команды возврата из подпрограммы извлекают из стека верхний элемент и помещают его в программный счетчик. Если имели место несколько вложенных вызовов подпрограмм, то возврат произойдет по адресу возврата, сохраненному после последнего вызова, так как для хранения адресов возврата используется стек и последний сохраненный адрес возврата будет использован первым.
Прочие команды. В ЭВМ могут быть дополнительные (специальные) команды. К их числу можно отнести команды остановки центрального процессора, сброса внешних устройств, установки или сброса отдельных признаков и т.д.