汇编语言堆栈帧简介
在之前的章节中,子程序接收的是寄存器参数。比如在 Irvine32 链接库中就是如此。接下来将展示子程序如何用堆栈接收参数。
在 32 位模式下,堆栈参数总是由 Windows API 函数使用。然而在 64 位模式下,Windows 函数可以同时接收寄存器参数和堆栈参数。
堆栈帧 (stack frame)( 或活动记录 (activation Tecord)) 是一块堆栈保留区域,用于存放被传递的实际参数、子程序的返回值、局部变量以及被保存的寄存器。
堆栈帧的创建步骤如下所示:
1) 被传递的实际参数。如果有,则压入堆栈。
2) 当子程序被调用时,使该子程序的返回值压入堆栈。
3) 子程序开始执行时,EEP 被压入堆栈。
4) 设置 EBP 等于 ESP。从这时开始,EBP 就变成了该子程序所有参数的引用基址。
5) 如果有局部变量,修改 ESP 以便在堆栈中为这些变量预留空间。
6) 如果需要保存寄存器,就将它们压入堆栈。
程序内存模式和对参数传递规则的选择直接影响到堆栈帧的结构。
学习用堆栈传递参数有个好理由:几乎所有的高级语言都会用到它们。比如,如果想要在 32 位 Windows 应用程序接口 (API) 中调用函数,就必须用堆栈传递参数。而 64 位程序可以使用另一种不同的参数传递规则。
在 32 位模式下,堆栈参数总是由 Windows API 函数使用。然而在 64 位模式下,Windows 函数可以同时接收寄存器参数和堆栈参数。
堆栈帧 (stack frame)( 或活动记录 (activation Tecord)) 是一块堆栈保留区域,用于存放被传递的实际参数、子程序的返回值、局部变量以及被保存的寄存器。
堆栈帧的创建步骤如下所示:
1) 被传递的实际参数。如果有,则压入堆栈。
2) 当子程序被调用时,使该子程序的返回值压入堆栈。
3) 子程序开始执行时,EEP 被压入堆栈。
4) 设置 EBP 等于 ESP。从这时开始,EBP 就变成了该子程序所有参数的引用基址。
5) 如果有局部变量,修改 ESP 以便在堆栈中为这些变量预留空间。
6) 如果需要保存寄存器,就将它们压入堆栈。
程序内存模式和对参数传递规则的选择直接影响到堆栈帧的结构。
学习用堆栈传递参数有个好理由:几乎所有的高级语言都会用到它们。比如,如果想要在 32 位 Windows 应用程序接口 (API) 中调用函数,就必须用堆栈传递参数。而 64 位程序可以使用另一种不同的参数传递规则。
所有教程
- 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视频