Система команд микропроцессора КР580вм80а на базе микро-ЭВМ "Электроника 580". Технические характеристики микро-ЭВМ, страница 15

Переход если чётный                                                     JPE, адрес

Переход если нечётный                                                 JPO, адрес

6.2.2. Команды вызова подпрограмм

Существует множество ситуаций, когда необходимо осуществить выход из главной программы, но впоследствии опять вернуться в нее. При этом возврат необходимо произвести именно в то место, из которого произошел переход.

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

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

Организация подпрограмм позволяет обойтись без повторного написания одного и того же фрагмента программы.

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

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

В то же время в стеке сохраняется старое содержимое счетчика команд. Когда выполнение подпрограммы заканчивается, по команде «возврат» значение указателя стека увеличивается на 1. Из стека извлекается хранившееся там содержимое счетчика команд.

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

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

Когда выполнение подпрограммы заканчивается, из стека извлекается последнее загруженное в него значение счетчика команд. То есть, по завершении подпрограммы второго уровня вложения из стека изымается значение счетчика команд подпрограммы первого уровня вложения. Оно загружается в счетчик команд, после чего выполнение первой подпрограммы может быть возобновлено, начиная с команды, которая следовала за командой «вызов подпрограммы».

Когда завершается выполнение подпрограммы первого уровня, из стека извлекается очередное значение счетчика команд. Теперь возобновляется выполнение главной программы, начиная с команды следовавшей за командой «вызов подпрограммы».