Обратимся теперь к директиве INVOKE
III
Обратимся теперь к директиве INVOKE. Это довольно удобная команда, правда, по некоторым причинам (которые станут понятными позже) я почти не буду употреблять ее в своих программах.
Удобство ее заключается, во-первых, в том, что мы сможем забыть о добавке @N. Во-вторых, эта команда сама заботится о помещении передаваемых параметров в стек. Последовательность команд
PUSH par1 PUSH par2 PUSH par3 PUSH par4 CALL NAME_PROC@N ; N-количество отправляемых в стек байт
заменяется на
INVOKE NAME_PROC, par4, par3, par2, par1
Причем параметрами могут являться регистр, непосредственно значение или адрес. Кроме того, для адреса может использоваться как оператор OFFSET, так и оператор ADDR. Видоизменим теперь модуль PROG1.ASM (модуль PROG2.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