Шаг 3.
Директива INVOKE

    На этом шаге мы рассмотрим назначение и использование директивы INVOKE.

    Эта команда не требует дописывать конструкцию @N. Во-вторых, она сама заботится о помещении передаваемых параметров в стек. Последовательность команд:

PUSH par1
PUSH par2
PUSH раrЗ
PUSH par4
CALL NAME_PROC@N ;N - количество отправляемых в стек байт.
заменяется на:
INVOKE NAME_PROC, par4, раrЗ, par2, par1

    Причем параметрами могут являться регистр, непосредственное значение или адрес. Кроме того, для адреса может использоваться как оператор OFFSET, так и оператор ADDR. Видоизменим теперь модуль PROG2_2.ASM (модуль PROG2_1.ASM изменять не придется).

.386P
;Плоская модель памяти.
.MODEL FLAT, STDCALL
;-----------------------------------
 PROC1 PROTO
;Сегмент данных.
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
_DATA ENDS
;Сегмент кода.
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
      INVOKE PROC1
      RET   ;Выход.
_TEXT ENDS 
      END START
Текст этого модуля можно взять здесь.

    Как видите, внешняя процедура объявляется теперь при помощи директивы PROTO. Данная директива позволяет при необходимости указывать и наличие параметров. Например, строка:

PROC1   PROTO   :DWORD,  :WORD

будет означать, что процедура требует два параметра длиной в четыре и два байта (всего 6, то есть @6).

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

    На следующем шаге мы приведем общие правила использования библиотек.




Предыдущий шаг Содержание Следующий шаг