汇编语言INVOKE伪指令:将参数入栈并调用过程
INVOKE 伪指令,只用于 32 位模式,将参数入栈(按照 MODEL 伪指令的语言说明符所指定的顺序)并调用过程。INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:
INVOKE procedureName [, argumentList]
ArgumentList 是可选项,它用逗号分隔传递给过程的参数。例如,执行若干 PUSH 指令后调用 DumpArray 过程,使用 CALL 指令的形式如下:
push TYPE array
push LENGTHOF array
push OFFSET array
call DumpArray
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,在过程调用之后再恢复它们的值。