C语言函数栈帧解析
目录
- 一、什么是函数栈帧
- 1.寄存器:
- 2.函数栈帧
- 3.栈帧的作用和维护
- 4.栈帧结构
- 二、函数栈帧的创建
- 1.汇编代码
- 2.main函数
- 2.栈帧创建:
- 3.步骤
- 4.ADD函数栈帧的创建
- 三.函数栈帧的销毁
- 1.汇编语言
- 四.了解
- 1.函数传参
- 2.函数返回值如何返回
- 3.函数中变量如何初始化和赋值
- 总结
一、什么是函数栈帧
1.寄存器:
eax, ebx, ecx ...
ebp
- 存放了指向函数栈帧栈底的地址esp
- 存放了指向函数栈帧栈顶的地址2.函数栈帧
函数被调用时,系统会在栈区为该函数开辟一块栈空间,这个栈空间就是该函数的函数栈帧。
以main函数的调用为例
文章图片
3.栈帧的作用和维护
栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。从逻辑上讲,栈帧为一个函数提供了执行环境。
栈是先用高地址再用低地址,栈帧控制和保存了一个函数所需要的各种信息。
栈帧的维护离不开ebp和esp寄存器,ebp存放了指向栈帧的栈底地址的指针,esp则存放指向栈顶地址的指针。
4.栈帧结构
以main函数为例:
【C语言函数栈帧解析】
文章图片
二、函数栈帧的创建 环境为VS2019
??#includeint ADD(int x, int y){int z=0; z=x+y; return z; } int main(){ int a = 10; int b = 20; int c = 0; c = ADD(a, b); return 0; }?
1.汇编代码
要研究函数栈帧我们要研究c程序的汇编代码。如图所示:
文章图片
文章图片
2.main函数
文章图片
文章图片
2.栈帧创建:
文章图片
3.步骤
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
main函数的函数栈帧的创建和数据初始化就完成了。
4.ADD函数栈帧的创建
文章图片
add函数栈帧的创建和main函数栈帧创建是一样的,值得注意的是,ADD函数执行结束后的返回值保存在了寄存器eax中,就是避免ADD函数栈帧销毁时,主函数无法访问ADD返回值。由此可见函数返回值是如何返回的。
三.函数栈帧的销毁
1.汇编语言
文章图片
四.了解
1.函数传参
文章图片
2.函数返回值如何返回
文章图片
3.函数中变量如何初始化和赋值
文章图片
4.函数执行结束后系统进行了什么操作
文章图片
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 概率论/统计学|随机变量 的 分布函数 与 概率密度函数 的区别
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥