汇编语言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,在过程调用之后再恢复它们的值。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算