汇编语言LEA指令:返回间接操作数的地址
LEA 指令返回间接操作数的地址。由于间接操作数中包含一个或多个寄存器,因此会在运行时计算这些操作数的偏移量。为了演示如何使用 LEA,现在来看下面的 C++ 程序,该程序声明了一个局部数组 myString,并引用它来分配数组值:
void makeArray() { char myString[30]; for ( int i = 0; i < 30; i++ ) myString[i] = '*'; }与之等效的汇编代码在堆栈中为 myString 分配空间,并将地址(间接操作数)赋给 ESI。虽然数组只有 30 个字节,但是 ESP 还是递减了 32 以对齐双字边界。注意如何使用 LEA 把数组地址分配给 ESI:
makeArray PROC push ebp mov ebp,esp sub esp, 32 ;myString 位于 EBP-30 的位置 lea esi, [ebp-30] ;加载 myString 的地址 mov ecx, 30 ;循环计数器 LI: mov BYTE PTR [esi] ;填充一个位置 inc esi ;指向下一个元素 loop LI ;循环,直到 ECX=0 add esp, 32 ;删除数组(恢复ESP) pop ebp ret makeArray ENDP不能用 OFFSET 获得堆栈参数的地址,因为 OFFSET 只适用于编译时已知的地址。下面的语句无法汇编:
mov esi,OFFSET [ebp-30 ] ;错误
所有教程
- 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视频