Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Ассемблер-IA-32.doc
Скачиваний:
62
Добавлен:
20.03.2015
Размер:
593.92 Кб
Скачать

6.6. Подпрограммы

Очень часто программа должна по многу раз выполнять определенную подзада­чу, но с разными значениями данных. Такая подзадача обычно называется под­программой. Подпрограмма может, скажем, вычислять функцию sin или сортиро­вать список в порядке возрастания или убывания значений.

Составляющий такую подпрограмму блок команд можно включать во все те места программы, где он должен выполняться. Однако на практике так никогда не поступают. Для экономии места в память помещают только одну копию блока команд, и любая программа, которой потребуется выполнить эту подпрограмму, просто переходит к ее начальному адресу. Такой переход называется вызовом подпрограммы и выполняется в помощью команды Call.

После реализации подпрограммы работа вызывающей ее программы должна быть продолжена. В таком случае говорят, что выполняется возврат из подпро­граммы в вызывающую программу. Делается это с помощью команды Return. По­скольку подпрограмма может вызываться из нескольких разных мест основной программы, при ее вызове где-то должен сохраняться адрес возврата. Иными сло­вами, для обеспечения правильного возврата из подпрограммы команда Call должна сохранить содержимое регистра PC.

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

Особой разновидностью команды перехода является команда Call, выполняю­щая такие операции, как сохранение содержимого регистра PC в регистре связи и переход по указанному в команде целевому адресу. Команда Return также явля­ется разновидностью команды перехода, но она выполняет переход по адресу, за­данному в регистре связи. Этот процесс проиллюстрирован на рис. 6.5.

Рис. 6.5. Связывание подпрограммы через регистр связи

6.6.1. Вложенность подпрограмм и стек процессора

В программировании очень распространена практика вызова одних подпрограмм из других. Такие подпрограммы, вызываемые друг из друга, называются вложен­ными. Если вложенные вызовы будут реализованы по описанной выше техноло­гии, вторая команда Call сохранит адрес возврата в регистре связи, уничтожив его текущее содержимое, после чего возврат в исходную программу станет не воз­можным. Поэтому перед вызовом очередной подпрограммы нужно где-то сохра­нять содержимое регистра связи.

Теоретически подпрограммы могут вкладываться на любую глубину. Рано или поздно последняя вызванная подпрограмма завершит свою работу и вернет управление вызвавшей ее подпрограмме. Необходимый для этого адрес возвра­та — это последний адрес, сохраненный в данной цепочке вызовов подпрограмм. Иными словами, адреса возврата сохраняются и используются в порядке LIFO (Last In First Out, что в переводе с английского значит «последним вошел — пер­вым вышел»). Очевидно, что адреса возврата, связанные с вызовами подпрограмм, должны помещаться в стек. Многие процессоры делают это автоматически, как часть работы команды Call. Для использования в качестве указателя стека (SP) вы­зовов подпрограмм выделяется отдельный регистр, именуемый стеком процессора. Команда Call помещает в стек процессора содержимое регистра PC, а команда Return выталкивает из этого стека адрес возврата и помещает его в PC.

Соседние файлы в папке Архитектура компьютеров