汇编语言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,在过程调用之后再恢复它们的值。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频