0988b24c

Синтаксис директив ARG и LOCAL


Приведем синтаксис определения передаваемых процедуре аргу- ментов:

ARG аргумент [,аргумент] . [=идентификатор] [RETURNS аргумент] [,аргумент]]

При определении локальных переменных процедуры используется следующий синтаксис:

LOCAL аргумент [,аргумент] . [=идентификатор]

Отдельные аргументы имеют следующий синтаксис:

имя_аргумента [[выражение_счетчик_1]] [: сложный_тип [:выражение_счетчик_2]]

где "сложный_тип" - это тип данных аргумента. Он может быть либо простым типом, либо сложным выражением-указателем. Подробнее о синтаксисе сложных типов рассказывается в Главе 5.

Если вы не задаете поле "сложный_тип", Турбо Ассемблер пред- полагает WORD. При выборе 32-разрядной модели он предполагает DWORD.

"Выражение_счетчик_2" задает, сколько элементов данного типа определяет аргумент. Например, в определении аргумента:

ARG tmp:DWORD:4

определяется аргумент с именем "tmp", состоящий из 4 двойных слов.

По умолчанию "выражение_счетчик_2" имеет значение 1 (кроме аргументов типа BYTE. Так как вы не можете занести в стек байто- вое значение, для аргументов типа BYTE значение счетчика по умол- чанию равно 2, что обеспечивает для них в стеке размер в слово. Это согласуется с языками высокого уровня, которые интерпретируют передаваемые в качестве параметров символьные переменные. Если вы действительно хотите задать аргумент, как один байт в стеке, нуж- но явным образом определить значение поля "выражение_счетчик_2", равное 1. Например:

ARG realbyte:BYTE:1

"Выражение_счетчик_1" представляет собой число элементов массива. Общее пространство, резервируемое для аргумента в стеке, равно произведению "выражения_счетчик_2" на длину, заданную полем "тип_аргумента" и на "выражение_счетчик_1". Если поле "выражение_ счетчик_1" не задано, то по умолчанию оно равно 1. Общее число аргументов задает произведение "выражения"_счетчик_1" на "выраже- ние_счетчик_2".


Если вы завершаете список аргументов символом равенства (=) и идентификатором, то Турбо Ассемблер будет приравнивать этот идентификатор к общему размеру блока аргументов (в байтах). Если вы не используете автоматическое использование соглашений языков высокого уровня в Турбо Ассемблере, то можете использовать данное значение в конце процедуры в качестве аргумента инструкции RET. Заметим, что это вызывает очистку стека от всех занесенных туда перед возвратом аргументов (это соглашения по вызову, принятые в Паскале).
Аргументы и переменные определяются в процедуре как операнды в памяти относительно BP. Передаваемые аргументы, определенные с помощью директивы ARG, имеют положительное смещение относительно BP. Локальные переменные, определенные с помощью директивы LOCAL, имеют отрицательное смещение от BP. Приведем пример:
. . . func1 PROC NEAR ARG a:WORD,b:WORD:4,c:BYTE=d LOCAL x:DWORD,y=WORD:2=z . . .
Здесь a определяется, как [bp+4], b определяется, как [bp+6], c определяется, как [bp+14], а d - как 20. x - это [bp-2], y - [bp-6], а z - 8.

Содержание раздела