Область действия имен

Если для аргументов и локальных переменных, а также меток операторов в подпрограмме, не заданы имена с предшествующим префиксом локального идентификатора, все аргументы, заданные в заголовке процедуры, определены ли они с помощью директивы arg или local и метки имеют глобальную область действия.

Идентификаторы с локальной областью действия разрешает ди­ректива locals (не путать с директивой local).

Например:

locals __
TST1 proc
arg __A: word, __B: word, __C: byte
local __X: word, __Y: dword
...

В этом примере директива locals __ определяет двойной символ подчеркивания как префикс локальных имен. Это означает, что все имена, начинающиеся с данной пары символов, будут счи­таться локальными в пределах подпрограммы.

Итоги

Соединив все, что было сказано в предыдущих параграфах, можно предложить следующий шаблон подпрограммы:


locals __

...
Func proc near
arg __p1: word, __p2: word, ... = __ArgSize
local __v1: byte, __v2: word, ... = __LocSize
;Действие: ...
;Входные параметры: ...
;Выходные параметры: ...
;Возвращает: ...
;Обращение: ...
;Замечания:
; регистры не модифицирует
; стек чистит от параметров

push BP ;+ BP - указатель
mov BP, SP ;- кадра стека
sub SP, __LocSize ;выделение памяти для лок. переменных
push SI, DI ;сохранение регистров
...
mov SI, __p1 ;доступ к параметру
...
mov __v2, SI ;доступ к локальной переменной
...
pop DI, SI ;восстановление регистров
mov SP, BP ;чистка стека от лок. переменных
pop BP ;восстановление BP
ret __ArgSize ;возврат и чистка стека от параметров
Func endp