Параметры в стеке, адрес возврата и старое значение ВР вместе называются активационной записью функции

Для удобства ссылок на параметры, переданные в стеке, внутри функции иногда используют директивы 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

Пролог
push bp;

mov bp,sp;

;

xyzzy_x equ [bp+8]

xyzzy_y equ [bp+6]

xyzzy_z equ [bp+4]

(команды, которые могут использовать стек)

mov ax,xyzzy_x;считать параметр X

(остальные команды)

Эпилог
mov sp,bp

pop bp

ret 6

xyzzy endp


Удалять параметры из стека можно:

1) в процедуре;

2) в вызывающей процедуру программе;

Если за освобождение стека от параметров отвечает вызывающая программа, то становится возможным вызвать несколько процедур с одними и теми же параметрами просто последовательными командами CALL.

Фрагмент кода, обеспечивающий корректный возврат из процедуры называется эпилог процедуры (корректировка содержимого стека, удаление из него аргументов, которые стали не нужны и которые передавались в процедуру).

Очистку стека от ненужных аргументов можно выполнить несколькими способами:


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



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