Для удобства ссылок на параметры, переданные в стеке, внутри функции иногда используют директивы EQU, чтобы не писать каждый раз точное смещение параметра от начала активационной записи (то есть от ВР), например так:
push X
push Y
push Z
call xyzzy
[...]; x = 2 байта FF
xyzzy proc near; y = 2 байта FD
; z = 2 байта FB
; ip =2 байта F9 < IP
; SP=F7 BP<SP; BP=F7
|
mov bp,sp;
;
xyzzy_x equ [bp+8]
xyzzy_y equ [bp+6]
xyzzy_z equ [bp+4]
(команды, которые могут использовать стек)
mov ax,xyzzy_x;считать параметр X
(остальные команды)
|
pop bp
ret 6
xyzzy endp
Удалять параметры из стека можно:
1) в процедуре;
2) в вызывающей процедуру программе;
Если за освобождение стека от параметров отвечает вызывающая программа, то становится возможным вызвать несколько процедур с одними и теми же параметрами просто последовательными командами CALL.
Фрагмент кода, обеспечивающий корректный возврат из процедуры называется эпилог процедуры (корректировка содержимого стека, удаление из него аргументов, которые стали не нужны и которые передавались в процедуру).
Очистку стека от ненужных аргументов можно выполнить несколькими способами: