Передача параметров через стек

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

!!! Результат лучше передавать через регистр. Иначе нужно осторожно чистить стек при выходе из процедуры.

Перед обращением к процедуре основная программа должна поместить в стек фактические параметры. Модель передачи (т.е. в каком порядке) определяет программист.

; основная программа

...

push par1

push par2

...

push parN

call name

Замечание! При вызове процедуры в стек запишется адрес возврата, т.о. параметры будут находиться «под» ним.

Процедура должна получить доступ к этим элементам. Т.к. они не на вершине стека, будем пользоваться регистром BP.

Замечание! Регистр BP может использоваться в основной программе, поэтому предварительно следует запомнить его старое значение. Лучше тоже в стеке, но надо будет это учитывать!

Таким образом, обратиться к первому (сверху) (а на самом деле это N параметр списку) элементу стека можно [BP+4], к следующему - [BP+6] и т.д.

!!! Если процедура является дальней, то следует еще +2, т.к. для адреса возврата поместят два элемента в стек (CS, IP). Для доступа к параметру N - [BP+6] и т.д.

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

Необходимо

1. поместить на вершину стека адрес возврата из процедуры

2. очистить стек от параметров (они уже стали ненужными)

(мы к ним только обращались, но не удаляли из стека)

3.

mov SP,BP; восстановить SP

pop BP; восстановление старого BP

Теперь на вершине стека адрес возврата и можем выполнять RET

Очистить стек от параметров может основная программа ADD SP,2*N

Но если много обращений к процедуре, то в основной программе будет много таких команд. Поэтому лучше очищать стек в самой процедуре.

Можно воспользоваться параметром [число] команды RET. Этот параметр задает число байтов, на которое очищается стек.

Замечание! Адрес возврата не учитывать, т.к. Ret считывает его до очистки стека.

Таким образом необходимо выполнить возврат из процедуры RET 2*N

Итак, схема процедуры

name proc

push bp

mov bp,sp

...; mov ax,[bp+4]; [bp+6],...

mov sp,bp

pop bp

ret 2*n

name endp


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



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