<<
>>

Директива INVOKE

Для более удобного вызова процедур с параметрами, передающимися через стек, MASM предоставляет специальное средство в виде директивы INVOKE: INVOKE имя_процедуры [.аргументы] Основная ее задача — сформировать код, который, во-первых, размещает аргу- менты в стеке, во-вторых, вызывает процедуру и, в третьих, чистит стек после за- вершения работы процедуры.
Например, традиционный способ вызова процеду- ры выглядит так: push параметр_п push ∩араметр_2 push параметр_l call имя_процедуры С использованием INVOKE тот же самый вызов будет выглядеть следующим об- разом: INVOKE имя_процедуры, параметр_l, ∩араметр_2 . . . .параметр_п Для INVOKE аргумент имя_процедуры не должен быть опережающей ссылкой на адрес. Чтобы исключить подобные ситуации, существует «парная» для INVOKE ди- ректива PROTO: имя_процедуры PROTO [расстояние] [язык] [, [параметр] :тип] ... Эта директива информирует ассемблер о количестве и типах аргументов, кото- рые принимает процедура. Использование данной директивы позволяет ассемб- леру выполнять проверку типов. Обычно все директивы PROTO для процедур соби- раются в начале исходного текста программы либо в отдельном включаемом файле. Директива PROTO принимает три типа аргументов — расстояние, язык, параметры процедуры с указанием их типов. т Аргумент расстояние (NEAR, FAR, NEAR16, NEAR32, FАRlб или FAR32) влияет на раз- мер адреса, формируемого ассемблером для вызова процедуры. По умолчанию значение этого параметра определяется исходя из текущей модели памяти и типа процессора. ϋ Аргумент язык для определения стиля и соглашения по вызову процедуры в ка- честве значения принимает имя языка (табл. 15.1). * Аргумент параметр представляет собой последовательность перечисленных че- рез запятую параметров процедуры. Исходя из этой информации, при вызове процедуры ассемблер преобразует последовательность параметров в последо- вательность команд PUSH с формированием соответствующих адресов парамет- ров процедуры в стеке.
И Аргументтип — один из допустимых ассемблером простых типов данных. В ка- честве типа может быть указано слово VARARG. Оно предназначено для опреде- ления процедур с переменным числом аргументов. Тип VARARG указывается с последним параметром, заданным в директиве PROTO. Тип VARARG можно ис- пользовать, если аргументом язык является С, SYSCALL или SТDСАLL.
Таблица 15.1. Передача аргументов в языках высокого уровня

Приведем типовую последовательность действий в программе для вызова про- цедуры в MASM: ;задание прототипа процедуры prod proci PROTO stdсаll :dwоrd, :dwоrd ;вызов процедуры invoke prod, аrgl, arg2 Следует отметить разницу в описании процедур в MASM и TASM. Общий вид представления процедуры в MASM похож на стиль TASM, но имеет отличия в синтаксисе и содержании: имя_процедуры РRОС [расстояние] [язык] [видимость] . [«аргументы пролоrа\эпилоrа>] 1 [USES список_регистров] [.аргумент [: тип]]... [LOCAL список_переменных] тело процедуры [RET [количество_байтов]] имя__процедуры ЕNDР Параметры расстояние, язык и видимость имеют сходные с описанием процеду- ры в TASM значения. Параметр расстояние показывает локализацию места, из ко- торого может быть вызвана процедура, с помощью одного из ключевых слов: NEAR, FAR, NЕАR16, NЕАRЗ2, FАRlб или FАRЗ2. Параметр язык — один из допустимых типов языков (см. табл. 15.1). Параметр видимостьопределяетдоступностьпроцедуры для других модулей и имеет одно из значений PRIVATE (по умолчанию), PUBLIC или EXPORT. Этот параметр можно изменить директивой OPTION PROC. Последней командой процедуры обычно является RET. В качестве ее операнда можно указать число байтов, которые процедура должна удалить из стека при воз- врате управления в точку вызова. Ассемблер автоматически генерирует код пролога и эпилога для правильной передачи аргументов в процедуру через стек и очистки стека при возврате из нее.

Код пролога и эпилога можно несколько изменить применением директив OPTION PROLOGUE и OPTION EPILOGUE. Локальные переменные объявляются в процедуре директивой LOCAL (перед любыми командами). В процедуре может быть несколько директив LOCAL. Аргументы пролога/эпилога — аргументы, определяющие особенности пролога и эпилога процедуры. Аргументы по умолчанию — PROLOGUE и EPILOGUE. Другие значения: г- FORCEFRAME — генерация сегмента стека; f!! LOADDS — сохранение регистра DS в прологе процедуры и восстановление его в эпилоге. Если аргументов несколько, то они разделяются запятыми. При вызове процедуры можно указать регистры общего назначения, которые нужно сохранить в стеке и назначить символические имена адресам в стеке, кото- рые логически являются параметрами процедуры. Все это делает директива USES. Имена перечисляемых регистров разделяются пробелами, а имена переменных — запятыми. Для переменных может указываться тип. В качестве значения типа мо- жет быть либо имя простого типа (например, DWORD), либо VARARG. Служебное слово VARARG позволяет задать переменное число параметров. При его использовании оно должно быть последним в списке параметров процедуры. Служебное слово VARARG указывается только, если параметр язык равен С, $Y$САLL или SТDСАLL, По умолчанию параметр тип равен WORD для 16-разрядного сегмента и DWORD — для 32-разрядного сегмента.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Директива INVOKE:

  1. Антисценарий
  2. Транзиты Меркурия, Венеры и Марса:
  3. Родительские образцы
  4. Акты Президента
  5. Возражения с позиций психологии развития
  6. Возраженияс позиций психологии развития
  7. 1.4ДВИЖЕНИЕПЛАНЕТ
  8. Перемешивание элементов сценария
  9. Нормативные правовые акты правительства
  10. Перемешивание элементов сценария