Директива INVOKE
Для более удобного вызова процедур с параметрами, передающимися через стек,
MASM предоставляет специальное средство в виде директивы INVOKE:
INVOKE
Основная ее задача — сформировать код, который, во-первых, размещает аргу-
менты в стеке, во-вторых, вызывает процедуру и, в третьих, чистит стек после за-
вершения работы процедуры. Например, традиционный способ вызова процеду-
ры выглядит так:
push
push
push
call
С использованием INVOKE тот же самый вызов будет выглядеть следующим об-
разом:
INVOKE
Для INVOKE аргумент
не должен быть опережающей ссылкой на
адрес. Чтобы исключить подобные ситуации, существует «парная» для INVOKE ди-
ректива PROTO:
342 Глава
Модульное программирование
PROTO [расстояние] [язык] [,
Эта директива информирует ассемблер о количестве и типах аргументов, кото-
рые принимает процедура. Использование данной директивы позволяет ассемб-
леру выполнять проверку типов. Обычно все директивы PROTO для процедур соби-
раются в начале исходного текста программы либо в отдельном включаемом файле.
Директива PROTO принимает три типа аргументов — расстояние, язык, параметры
процедуры с указанием их типов.
т Аргумент расстояние (NEAR, FAR, NEAR16, NEAR32,
или FAR32) влияет на раз-
мер адреса, формируемого ассемблером для вызова процедуры. По умолчанию
значение этого параметра определяется исходя из текущей модели памяти и типа
процессора.
Аргумент язык для определения стиля и соглашения по вызову процедуры в ка-
честве значения принимает имя языка (табл. 15.1).
Аргумент параметр представляет собой последовательность перечисленных че-
рез запятую параметров процедуры. Исходя из этой информации, при вызове
процедуры ассемблер преобразует последовательность параметров в последо-
вательность команд PUSH с формированием соответствующих адресов парамет-
ров процедуры в стеке.
Аргумент
— один из допустимых ассемблером простых типов данных. В ка-
честве типа может быть указано слово VARARG. Оно предназначено для опреде-
ления процедур с переменным числом аргументов. Тип VARARG указывается
с последним параметром, заданным в директиве PROTO. Тип VARARG можно ис-
пользовать, если аргументом язык является С, SYSCALL или
Таблица
Передача аргументов в языках высокого уровня
Операнд
«язык»
NOLANGUAGE
BASIC
PROLOG
FORTRAN
С
PASCAL
STDCALL
SYSCALL
Язык
аргументов
Ассемблер
Basic
Prolog
Fortran
С
C++
Pascal
—
C++
Направление передачи
стека
Слева направо
Слева направо
Справа налево
Слева направо
Справа налево
Справа налево
Слева направо
Справа налево
Справа налево
Процедура очистки
Вызываемая
Вызываемая
Вызывающая
Вызываемая
Вызывающая
Вызывающая
Вызываемая
Вызываемая
Вызывающая
Приведем типовую последовательность действий в программе для вызова про-
цедуры в MASM:
прототипа процедуры prod
PROTO
процедуры
Процедуры в языке ассемблера 343
invoke prod,
arg2
Следует отметить разницу в описании процедур в MASM и TASM. Общий вид
представления процедуры в MASM
на стиль TASM, но имеет отличия
в синтаксисе и содержании:
PROC [расстояние] [язык] [видимость]
[USES
[LOCAL
тело процедуры
[RET
ENDP
Параметры расстояние, язык и видимость имеют сходные с описанием процеду-
ры в TASM значения. Параметр расстояние показывает локализацию места, из ко-
торого может быть вызвана процедура, с помощью одного из ключевых слов:
FAR, NEAR16, NEAR32,
или FAR32. Параметр язык — один из допустимых типов
табл. 15.1). Параметр видимость
других модулей и имеет одно из значений PRIVATE (по умолчанию), PUBLIC или
EXPORT. Этот параметр можно изменить директивой OPTION PROC.
Последней командой процедуры обычно является RET. В качестве ее операнда
можно указать число байтов, которые процедура должна удалить из стека при воз-
врате управления в точку вызова.
Ассемблер автоматически генерирует код пролога и эпилога для правильной
передачи аргументов в процедуру через стек и очистки стека при возврате из нее.
Код пролога и эпилога можно несколько изменить применением директив OPTION
PROLOGUE и OPTION EPILOGUE.
Локальные переменные объявляются в процедуре директивой LOCAL (перед
любыми командами). В процедуре может быть несколько директив LOCAL.
Аргументы пролога/эпилога — аргументы, определяющие особенности пролога
и эпилога процедуры. Аргументы по умолчанию — PROLOGUE и EPILOGUE. Другие
значения:
- FORCEFRAME — генерация сегмента стека;
LOADDS —
регистра DS в прологе процедуры и восстановление его
в эпилоге.
Если аргументов несколько, то они разделяются запятыми.
При вызове процедуры можно указать регистры общего назначения, которые
нужно сохранить в стеке и назначить символические имена адресам в стеке, кото-
рые логически являются параметрами процедуры. Все это делает директива USES.
Имена перечисляемых регистров разделяются пробелами, а имена переменных —
запятыми. Для переменных может указываться тип. В качестве значения типа мо-
жет быть либо имя простого типа (например, DWORD), либо VARARG. Служебное слово
VARARG позволяет задать переменное число параметров. При его использовании
оно должно быть последним в списке параметров процедуры. Служебное слово
VARARG указывается только, если параметр язык равен С,
или
По
умолчанию параметр тип равен WORD для 16-разрядного сегмента и DWORD — для
32-разрядного сегмента.
344 Глава
Модульное программирование
Do'stlaringiz bilan baham: |