<<
>>

Вызовы подпрограмм

В процессоре 8088 есть команда, позволяющая вызывать процедуры, которые в языке ассемблера обычно называются подпрограммами (subroutines). По аналогии с командами перехода здесь существуют команды ближнего и дальнего вызова.
В интерпретаторе реализован только ближний вызов. Объект вызова либо является меткой, либо располагается по действительному адресу. Параметры, необходимые для вызова подпрограмм, первоначально размещаются в стеке в обратном порядке (рис. В.З). Применительно к языку ассемблера параметры обычно называются аргументами, хотя принципиального различия между этими терминами нет. После размещения аргументов в стеке выполняется команда CALL. В первую очередь, она вводит в стек текущее значение счетчика команд, со-

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

Рис.

В.З. Пример стека

Далее из метки или с действительного адреса загружается новый счетчик команд. При дальнем вызове значение регистра CS размещается в стеке перед значением регистра PC, а счетчик команд и регистр кодового сегмента загружаются непосредственными данными или с действительного адреса. На этом выполнение команды CALL завершается.

Команда возврата, RET, выталкивает из стека адрес возврата, сохраняет его в счетчике команд, после чего выполнение программы возобновляется с команды, следующей непосредственно за командой CALL. Иногда в команде RET роль непосредственных данных выполняет положительное число. Это число рассматривается как ряд байтов аргументов, размещенных в стеке перед вызовом; оно прибавляется к значению SP, и стек очищается.

При дальнем вызове (выполнении команды RETF) регистр кодового сегмента выталкивается после счетчика команд.

В рамках подпрограммы необходимо реализовать доступа к аргументам. По этой причине выполнение подпрограммы часто начинается с размещения в стеке указателя базы и копирования текущего значения регистра SP в регистр ВР. Таким образом, указатель базы указывает на свое предыдущее значение. После адрес возврата определяется путем прибавления к ВР двойки, а первый и второй аргументы располагаются по действительным адресам ВР + 4иВР + 6, соответственно. Если процедуре нужны локальные переменные, необходимое количество байтов можно вычесть из указателя стека; обращаться к этим переменным можно из указателя базы путем отрицательного смещения. В примере на рис. В.З имеются три однословных локальных переменных, расположенных по адресам ВР-2, ВР-4 и ВР - 6. Таким образом, весь набор текущих аргументов и локальных переменных становится доступным через регистр ВР.

В стеке, как обычно, сохраняются промежуточные результаты или подготавливаются аргументы для последующих вызовов. Чтобы восстановить стек до возврата, не высчитывая, какую часть стека заняла подпрограмма, нужно скопировать указатель базы в указатель стека, вытолкнуть из стека старое значение ВР и выполнить команду RET.

Иногда в процессе вызова подпрограммы значения регистров процессора меняются. В этой связи полезно сделать так, чтобы вызывающая программа не знала о том, какие регистры используются вызываемой программой. Для этого проще всего ввести для системных вызовов и обычных подпрограмм одни и те же соглашения. Предполагается, что в вызываемой программе могут изменяться значения регистров АХ и DX. Если в одном из этих регистров содержится ценная информация, желательно, чтобы вызывающая процедура разместила ее в стеке до выполнения аналогичной операции с аргументами. Если подпрограмма использует и другие регистры, их можно поместить в стек непосредственно в начале ее выполнения и извлечь из него перед запуском команды RET. Таким образом, желательно сделать так, чтобы вызывающая процедура сохраняла значения регистров АХ и DX (если в них содержатся значимые данные), а вызываемая — значения других регистров, которые она перезаписывает.

<< | >>
Источник: Таненбаум Э.. Архитектура компьютера. 5-е изд. 2007

Еще по теме Вызовы подпрограмм:

  1. ВЫЗОВ ВРАЧА
  2. СПТ откликается на вызов обстоятельств
  3. Быстрый вызов желаемого
  4. Бросьте себе вызов
  5. Самоубийство как вызов обществу
  6. § 14 Условное соглашение. – Предложение и вызов. – Договор посредством публичного торга или состязания. – Одностороннее обещание.
  7. § 46 Принятие наследства. – Значение вызова кредиторов и некоторых публикаций. – Отзыв о принятии и действия, служащие признаком принятия.
  8. Есть вызов – есть чудеса.
  9. § 45 Меры к охранению открывшегося наследства. – Опись. – Вызов наследников. – Утверждение в правах наследства. – Срок на явку наследников и вступление явившихся. – Особые правила для торгового сословия.
  10. § 55 Общие понятия о поклаже. – Поклажа свободная и необходи- мая, по русскому закону. – Кто может вступать в договор о поклаже. – Доказательство поклажи. – Сохранная расписка. – Когда не требуется письменное доказательство. – Обязанности приемщика. – Поклажа в запертом помещении. – Растрата. – Ответственность приемщика. – Возвращение поклажи при несостоятельности. – Вызов наследников приемщика и отдатчика. – Поклажа в гостиницах.
  11. 10 приемов воздействия на противника
  12. Непокорный
  13. Определение шестое