Передача параметров

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

Чаще всего применяется передача параметров через регистры или через стек.

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

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

Для доступа к параметрам, переданным в стеке, в начале подпрограммы обычно выполняются команды:

push BP
mov BP, SP

После этого можно адресовать величины в стеке, указывая их смещения относительно верхушки стека, адрес которой – в реги­стре BP. При подсчете смещения нужно учитывать, что команда call, как отмечалось выше, помещает в стек адрес возврата (одно или два слова). Удобно для адресации параметров описать соответ­ствующую структуру данных.

Можно применять смешанные способы передачи параметров. В частности, для подпрограмм-функций удобно возвращать резуль­тат в регистре, даже если входные параметры получены в стеке.

Рассмотрим пример. Пусть подпрограмма типа near имеет два словных параметра, передаваемых через стек. В этом случае после вызова подпрограммы, сохранения и загрузки регистра BP (см. выше), стек будет выглядеть, как показано ниже:

   
BP Ü SP сохраненное значение BP
IP адрес возврата
2-й параметр параметр, занесенный в стек вторым
1-й параметр параметр, занесенный в стек первым
...  

Если описать следующую структуру:

__arg struc

__saveBP dw?

__retAddr dw?

__Param2 dw?

__Param1 dw?

__arg ends,

то доступ к параметрам можно осуществить с помощью команд:

mov AX, __Param1[BP]; загрузить в AX значение первого параметра
mov BX, __Param2[BP]; загрузить в BX значение второго параметра

Для облегчения чистки стека от переданных параметров ис­поль­зуется разновидность команды ret с операндом – числом бай­тов, которые нужно убрать из стека сразу после возврата. Это позво­ляет вызы­вающей программе не заботиться об удалении па­раметров из стека. Для нашего примера команда возврата из под­программы может выглядеть следующим образом:

ret 4


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: