首页
社区
课程
招聘
[原创]深入理解C语言一-函数调用流程
发表于: 2021-7-1 18:02 5735

[原创]深入理解C语言一-函数调用流程

2021-7-1 18:02
5735

栈是一种用来存储逻辑关系为一对一数据的线性存储结构,需要注意的是,栈只能从表的一端存取数据,另一端是封闭的。在栈中,存取数据必须遵循先进后出的原则,即最先进栈的元素最后出栈。栈的开口端被称为栈顶,封口端被称为栈底。

进栈:向栈中添加数据。
出栈:从栈中提取出指定元素。

一个函数(调用者caller)调用另一个函数(被调用者callee),使用栈结构记录函数之间的调用关系,便于函数执行结束后,确定执行流程的出口。

1、按照调用约定传参,保存参数(约定传参的顺序、约定参数的存储媒介、约定释放参数空间者、约定返回值的存储媒介)。
2、保存返回地址(函数返回后程序继续执行的代码地址)。
3、保存caller的栈底地址。
4、更新当前栈底地址为callee的栈底地址。
5、保存局部变量数据(调试时会把局部变量的空间初值置为0xcccccccc)。
6、保存其他受影响的寄存器(存储数据的媒介)。
7、开始执行函数体。

1、恢复受到影响的寄存器。
2、释放局部变量空间。
3、恢复caller的栈底地址。
4、取出返回地址并按此更新EIP(保存返回地址的寄存器)。
5、回到caller释放参数空间(_cdecl调用约定)。

  • 在函数定义中使用函数自身。
  • 把规模较大的问题重复转化为规模更小的相似子问题。
  • 解决问题的函数必须有明确的结束条件。
  • 循环适合解决线性问题,递归不适合解决线性问题。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-7-5 00:26 被流照君编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//