INVOKE 伪指令,只用于 32 位模式,将参数入栈(按照 MODEL 伪指令的语言说明符所指定的顺序)并调用过程。INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:
ArgumentList 是可选项,它用逗号分隔传递给过程的参数。例如,执行若干 PUSH 指令后调用 DumpArray 过程,使用 CALL 指令的形式如下:
使用等效的 INVOKE 则将代码减少为一行,列表中的参数逆序排列(假设遵循 STDCALL 规范):
INVOKE 对参数数量几乎没有限制,每个参数也可以独立成行。下面的 INVOKE 语句包含了有用的注释:
参数类型如下表所示。
类型 | 例子 | 类型 | 例子 |
---|---|---|---|
立即数 | 10, 3000h, Offset mylist, TYPE array | 寄存器 | eax, bl, edi |
整数表达式 | (10*20), COUNT | ADDR name | ADDR myList |
变量 | myLIst, array, my Word, myDword | OFFSET name | OFFSET myList |
地址表达式 | [myList+2], [ebx+esi] |
如果向过程传递的参数小于 32 位,那么在将参数入栈之前,INVOKE 为了扩展参数常常会使得汇编器覆盖 EAX 和 EDX 的内容。有两种方法可以避免这种情况: