Локальные переменные процедуры могут располагаться в регистрах, в переменной в сегменте данных (процедуру, использующую этот метод, нельзя вызывать рекурсивно), в стеке. Принято располагать локальные переменные в стеке сразу после сохраненного значения регистра ВР, так что на них можно ссылаться изнутри процедуры, как [ВР-2], [ВР-4], [ВР-6] и т.д.:
Proc1 proc near
|
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
….. (тело процедуры)
|
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