40. Определение и вызов процедуры с параметрами

Процедуры в assembler имеют следующий синтаксис

имя PROC [[модификатор_языка] язык] [расстояние]
             [ARG список_аргументов] [RETURN список_элементов];
                [LOCAL список_аргументов]
                   [USES список_элементов]
                   .
                   .
                   .
[имя] ENDP

После Uses идут списки регистров через пробел. Сохраняет значение в списке в порядке. Перед выполнением макрокоманды RET автоматически восстанавливаются указанные регистры.
Local создает в стеке локальные переменные.
Для объявления подпрограммы с параметрами, необходимо перечислить их после слова ARG (обычно входные параметры) или RETURN (обычно выходные параметры).

Пример: Данная процедура суммирует два числа.
Sum PROC PASCAL NEAR ;объявляем ближнею процедуру Sum с использованием PASCAL 
ARG x, y             ;объявляем входящие параметры
RETURN z             ;объявляем исходящие параметры 
USES ax              ;указываем регистр, значение которого необходимо сохранить
Mov ax, x
Add ax, y
Mov bx, z
Mov [bx], ax
ret 6 ;               ;удаляем принятые параметры из стека (PASCAL соглашение)
Sum ENDP              ;конец процедуры

Причем следует отметить универсальность директивы ARG. Она подстраивается под указанный модификатор языка, указанного для процедуры. Хотя стоит отметить, что если использовать данную директиву, то параметры обязаны быть переданы через стек!

Следует заметить, что можно встретить и такое определение аргументов, параметров функции:

ARG x
ARG y
или
ARG x:word:1, y:word:1

Что касается последнего, то его необходимо трактовать так:

ARG имя_параметра[:тип[:количество]]

Например, если мы передаем массив, то можем передавать не адрес, а все элементы
ARG masiv: word: 10; то есть masiv – это первый элемент, masiv + 1 – второй, … , masiv + 9 – последний.
Например, когда мы пишем ARG x:word, и где-то дальше mov ax, x, то на этапе компиляции, x заменяется на адрес в стеке:

Для вызова процедуры с параметрами удобно использовать директиву INVOKE, она имеет следующий синтаксис:

INVOKE имя_процедуры [, параметр_1 [параметр_2 …]]

Размещает указанные параметры в стеке в необходимом порядке и вызывает указанную процедуру с помощью команды CALL
В качестве параметра может выступать: переменная, непосредственное выражение, адресное выражение, имя регистра и ADDR имя_переменной.

17.07.2015