Локальные переменные

Локальные переменные процедуры могут располагаться в регистрах, в переменной в сегменте данных (процедуру, использующую этот метод, нельзя вызывать рекурсивно), в стеке. Принято располагать локальные переменные в стеке сразу после сохраненного значения регистра ВР, так что на них можно ссылаться изнутри процедуры, как [ВР-2], [ВР-4], [ВР-6] и т.д.:

Proc1 proc near

Пролог
push bp; сохранить предыдущий ВР

mov bp,sp; установить ВР для этой процедуры

sub sp,6; зарезервировать 6 байт для локальных переменных

push 35; l

push 36; m

push 37; n

p_x equ [bp+8]; параметры; X

p_y equ [bp+6]; Y

p_z equ [bp+4]; Z

p_l equ [bp-2]; локальные переменные; 37=n

p_m equ [bp-4]; 36=m

p_n equ [bp-6]; 35=l

….. (тело процедуры)

 
 


Эпилог
mov sp,bp; восстановить SP, выбросив из стека все локальные переменные

pop bp; восстановить ВР вызвавшей процедуры

ret 6; вернуться, удалив параметры из стека

Proc1 endp

Внутри процедуры Proc1 стек будет заполнен следующим образом (см. рис. 5).

Рис. 5. Стек при вызове процедуры Proc1


Последовательности команд, используемые в начале и в конце таких процедур, оказались настолько часто применяемыми, что в процессоре 80186 были введены специальные команды ENTER и LEAVE, выполняющие эти же самые действия:

Proc1 proc near

1_x equ [bp+8]; параметры

1_y equ [bp+6]

1_z equ [bp+4]

pr_l equ [bp-2]; локальные переменные

pr_m equ [bp-4];

pr_n equ [bp-6]

enter 6,0; push bp

; mov bp,sp

; sub sp,6

(тело процедуры)

leave; mov sp,bp

; pop bp

ret 6; вернуться, удалив параметры из стека

Proc1 endp



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



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