Возможен следующий синтаксис описания процедуры:
ИМЯ proc [[МОДИФИКАТОР_ЯЗЫКА] ЯЗЫК] [РАССТОЯНИЕ]
[arg СПИСОК_АРГУМЕНТОВ]
[local СПИСОК_АРГУМЕНТОВ]
...
[ИМЯ] endp
Приведем синтаксис определения передаваемых процедуре аргументов:
arg АРГУМЕНТ [, АРГУМЕНТ ]... [ =ИМЯ ]
При определении локальных переменных процедуры используется следующий синтаксис:
local АРГУМЕНТ [, АРГУМЕНТ ]... [ =ИМЯ ]
Отдельные аргументы имеют следующий синтаксис:
ИМЯ_АРГУМЕНТА [[ СЧЕТЧИК_1 ]] [: ТИП [: СЧЕТЧИК_2 ]]
Здесь ТИП – это тип данных аргумента – byte, word, dword и т.п.
СЧЕТЧИК_2 задает, сколько элементов данного типа определяет аргумент.
Например, в определении аргумента:
arg TMP: dword: 4
определяется аргумент с именем TMP, состоящий из 4 двойных слов. По умолчанию СЧЕТЧИК_2 имеет значение 1 (кроме аргументов типа byte. Так как вы не можете занести в стек байтовое значение, для аргументов типа byte значение счетчика по умолчанию равно 2, что обеспечивает для них в стеке размер в слово.
Например:
arg REALBYTE: byte: 1
СЧЕТЧИК_1 представляет собой число элементов массива. Если поле СЧЕТЧИК_1 не задано, то по умолчанию оно равно 1.
|
|
Если список аргументов завершается символом равенства (=) и идентификатором, то ассемблер будет приравнивать этот идентификатор к общему размеру блока аргументов (в байтах). Если вы не используете автоматическое использование соглашений языков высокого уровня в ассемблере, то можете использовать данное значение в конце процедуры в качестве аргумента инструкции ret.
Аргументы и переменные определяются в процедуре как операнды в памяти относительно BP. Передаваемые аргументы, определенные с помощью директивы arg, имеют положительное смещение относительно BP. Локальные переменные, определенные с помощью директивы local, имеют отрицательное смещение от BP.
Например:
FUNC1 proc NEAR
arg A:word, B:word:4, C:byte =ArgSize
local X:dword, Y:word:2 =LocSize
...
Здесь A определяется, как [BP+4], B – [BP+6], C – [BP+14], а ArgSize – 20. X – [BP-2], Y – [BP-6], а LocSize – 8.