Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 17. Команды вызова процедур.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
210.43 Кб
Скачать

17.3. Передача параметров при вызове подпрограмм

Вызывая подпрограмму, программа должна передать ей параметры (операнды), или же их адреса. Закончив свою работу, подпрограмма вернет другие параметры — результаты выполнения. Такой обмен информацией между вызывающей программой и подпрограммой называ­ется передачей параметров. Передача параметров может выполняться нескольки­ми способами. Например, параметры можно помещать в регистры или в оперативную память, от­куда подпрограмма сможет их считать. В качестве альтернативы параметры можно поместить в стек, используемый для хранения адресов возврата.

Использование регистров ядра процессора — способ простой и эффективный. В таблице 17.2 показано, как реализовать программу, выполняющую сложение последовательности чисел, в виде подпрограммы с передачей параметров через регистры.

Таблица 17.2

Метка

Команда

Операнды

Комментарий

Вызывающая программа

Move

N, R1

R1 играет роль счетчика

Move

#NUM,R2

R2 указывает на последовательность

Call

LISTADD

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

Move

R0,SUM

Сохранение результата

……..

Подпрограмма

LISTADD

LOOP

Clear

R0

Инициализация суммы значением 0

Add

(R2)+,R0

Добавление числа из последовательности

Decrement

R1

Уменьшение счетчика

Branch>0

LOOP

Если счетчик не равен 0, возврат на цикл

Return

Возврат в вызывающую программу

Длина последовательности п, информация о которой хранится в оперативной памяти по адресу N, и адрес первого числа NUM1 передаются под­программе через регистры R1 и R2. Вычисленная подпрограммой сумма возвра­щается вызывающей программе через регистр R0. Первые две команды загружают в регистры R1 и R2 значения N и NUM1. Команда CALL выполняет переход к подпрограмме, начинающейся по ад­ресу LISTADD. Кроме того, эта команда помещает в стек адрес воз­врата из подпрограммы. Подпрограмма вычисляет сумму и помещает ее в регистр R0. После возврата из подпрограммы вызывающая программа сохраняет эту сум­му в оперативной памяти по адресу SUM.

Если у подпрограммы много параметров, для их передачи может просто не хватить регистров общего назначения. С другой стороны, стек — структура гиб­кая, в него можно поместить много параметров. Следующий пример показывает, как выполняется передача параметров через стек. В таблице 17.3 приведена та же программа, выполняющая сложение последовательности чисел, но реализованная в виде подпрограммы LISTADD. Любая другая программа может вызвать указанную подпрограмму для сложения последовательности чисел. Подпрограмме LISTADD передается адрес первого числа в последовательности и количество ее элементов. Подпрограмма выполня­ет сложение и возвращает полученную сумму. Ее параметры помещаются в стек процессора, на который указывает регистр SP. Предположим, что до вызова под­программы вершина стека располагается на уровне 1 (рис.17.4). Вызывающая программа помещает в стек адрес NUM1 и значение п и вызывает подпрограмму LISTADD. Кроме того, команда CALL помещает в стек адрес возврата из подпро­граммы. Теперь вершина стека располагается на уровне 2.

Таблица 17.3

Метка

Команда

Операнды

Комментарий

Предполагается, что вершина стека расположена на уровне 1

Move

#NUM1,-(SP)

Помещение параметров в стек

Move

N,-(SP)

Call

LISTADD

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

( вершина стека на уровне 2)

Move

4(SP),SUM

Сохранение результата

Add

#8,SP

Восстановление вершины стека

( вершина стека на уровне 1)

…….

LISTADD

MoveMultyple

R0-R2,-(SP)

Сохранение регистров

( вершина стека на уровне 3)

Move

16(SP),R1

Инициализация счетчика значением n

Move

20(SP),R2

Инициализация указателя на последовательность чисел

Clear

R0

Инициализация суммы значением 0

LOOP

Add

(R2)+,R0

Добавление числа из последовательности чисел

Decrement

R1

Уменьшение счетчика

Branch>0

LOOP

Проверка цикла

Move

R0,20(SP)

Помещение результата в стек

MoveMultyple

(SP)+,R0-R2

Восстановление регистров

Return

Возврат в вызывающую программу

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

Подпрограмма использует три регистра. Поскольку в них могут содержаться данные, принадлежащие вызывающей программе, их содержимое сохраняется в стеке. Для помещения в стек содержимого регистров от R0 до R2 использована команда MoveMultiple. Подобные команды имеются у многих архитектур. Те­перь вершина стека располагается на уровне 3. С помощью индексной адресации подпрограмма считывает из стека параметры п и NUM1. Значение указателя сте­ка при этом не меняется, поскольку на вершине стека по-прежнему располагают­ся нужные элементы данных. Значение п загружается в регистр R1, который будет играть роль счетчика, а адрес NUM1 — в регистр R2, который будет слу­жить указателем при сканировании списка значений. Регистр R0 должен содер­жать результат суммирования. Перед возвратом из подпрограммы содержимое ре­гистра R0 помещается в стек, заменяя параметр NUM1, который больше не нужен. Затем из стека восстанавливается содержимое трех регистров, использовав­шихся подпрограммой. Теперь верхним элементом стека является адрес возврата, расположенный на уровне 2. После возврата из подпрограммы вызывающая программа сохраняет результат в оперативной памяти по адресу SUM и возвращает вершину сте­ка на ее исходный уровень, уменьшая значение SP на 8.