汇编语言INVOKE伪指令:将参数入栈并调用过程

< 上一页递归及应用详解 ADDR运算符下一页 >

INVOKE 伪指令,只用于 32 位模式,将参数入栈(按照 MODEL 伪指令的语言说明符所指定的顺序)并调用过程。INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:

INVOKE procedureName [, argumentList]

ArgumentList 是可选项,它用逗号分隔传递给过程的参数。例如,执行若干 PUSH 指令后调用 DumpArray 过程,使用 CALL 指令的形式如下:

push TYPE array
push LENGTHOF array
push OFFSET array
call DumpArray

使用等效的 INVOKE 则将代码减少为一行,列表中的参数逆序排列(假设遵循 STDCALL 规范):

INVOKE DumpArray, OFFSET array, LENGTHOF array, TYPE array

INVOKE 对参数数量几乎没有限制,每个参数也可以独立成行。下面的 INVOKE 语句包含了有用的注释:

INVOKE DumpArray,         ;显示数组
OFFSET array,                    ;指向数组
LENGTHOF array,              ;数组长度
TYPE array                         ;数组元素的大小类型

参数类型如下表所示。

类型 例子 类型 例子
立即数 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]     

覆盖 EAX 和 EDX

如果向过程传递的参数小于 32 位,那么在将参数入栈之前,INVOKE 为了扩展参数常常会使得汇编器覆盖 EAX 和 EDX 的内容。有两种方法可以避免这种情况:
  • 其一,传递给 INVOKE 的参数总是 32 位的;
  • 其二,在过程调用之前保存 EAX 和 EDX,在过程调用之后再恢复它们的值。
< 上一页递归及应用详解 ADDR运算符下一页 >