函数栈帧的创建和销毁(图解)"/>
函数栈帧的创建和销毁(图解)
目录
- 基础知识介绍
- 1. 寄存器的种类与功能
- 2. 常用汇编指令
- 3. 内存模型
- 演示函数栈帧的创建销毁过程
- 1. 为main()函数开辟栈帧
- 2. 在main()函数中创建变量
- 3. 调用Add()函数前的准备
- 4. 为Add()函数开辟栈帧
- 5. 在Add()函数中创建变量并运算
- 6. Add()栈帧的销毁
- 7. 返回main()函数栈帧
- 总结
电脑中的任何指令都是在CPU上的运行的,但是CPU本身只负责运算不负责存储,数据一般都是存储在内存和寄存器(储存最常用的数据)。
想要理解函数栈帧的创建和销毁,首先必须了解三个知识点:寄存器、常用汇编指令及内存模型。
基础知识介绍
1. 寄存器的种类与功能
寄存器名称 | 功能 |
---|---|
eax | 累加寄存器,相对于其他寄存器,在运算方面比较常用。 |
ebx | 基地址寄存器,在内存寻址时存放基地址。 |
ecx | 计数寄存器,用于循环操作,比如重复的字符存储操作,或者数字统计。 |
edx | 作为EAX的溢出寄存器,总是被用来放整数除法产生的余数。 |
esi | 源变址寄存器,主要用于存放存储单元在段内的偏移量。通常在内存操作指令中作为“源地址指针”使用。 |
edi | 目的变址寄存器,主要用于存放存储单元在段内的偏移量。 |
eip | 控制寄存器,存储CPU下次所执行的指令地址(存放指令偏移地址)。 |
esp | 栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,esp 也就越来越小。在32位平台上,esp 每次减少4字节。栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。是CPU机制决定的,push 、pop 指令会自动调整esp 的值。 |
ebp | 基址指针,指栈的栈底指针。基址指针寄存器(extended base pointer),一般与esp 配合使用,可以存取某时刻的esp ,这个时刻就是进入一个函数内后,CPU会将esp 的值赋给ebp ,此时就可以通过ebp 对栈进行操作,比如获取函数参数,局部变量等。其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。 |
2. 常用汇编指令
- push指令:它首先减少
esp
的值,再将源操作数复制到栈地址,在32位平台上,esp
更多推荐
函数栈帧的创建和销毁(图解)
发布评论