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