На этом шаге мы рассмотрим назначение и использование директивы 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, так как она относится к макросредствам, которые мы рассматривать не планируем.
На следующем шаге мы приведем общие правила использования библиотек.