c语言函数调用 压栈,局部变量与函数调用栈

本文介绍了C语言函数调用时的栈原理,包括参数压栈、返回地址入栈、栈帧调整等步骤。详细阐述了函数调用时的压栈顺序和函数返回时的栈帧恢复过程,以及栈中如何存储局部变量。内容涵盖函数调用的栈帧管理、CPU寄存器在函数调用中的作用,以及系统栈与进程栈的关系。
摘要由CSDN通过智能技术生成

不知道从什么时候开始,运行在OS内的程序文件,有了规范,Win系统下是PE,Linux系统下是ELF。符合规范的程序能够被OS调用并执行。

不知道从什么时候开始,程序在OS的管控下执行,每个进程都有自己的堆(heap)和栈(stack)。堆的地址从小到大,存放需要程序代码显式申请的内存块,并且也需要程序自己管理和释放。栈的地址从大到小,存放函数调用过程中的指令地址和函数的局部变量。程序员需要关注堆的管理,但是栈的相关操作,由编译器完成。

在栈中存放程序返回的地址,这个是很好理解的。在栈中存放函数的局部变量,并且在函数执行完后释放这部分空间,我理解这是当初的一个很精妙的软件设计。与全局变量存放在.data数据区不同,函数仅自己使用的变量由于只有短暂的生命周期,如果使用像堆一样显式地申请和释放的方式,必然会增加程序员的代码工作量,也会增加软件出错的概率。因此,这些函数自己使用的变量,就放在了栈中,由编译器自动完成在栈中的空间申请,赋初值和释放的动作。

CPU很配合,对于这些已经成为标准的软件设计概念,贡献出对应的寄存器来支持!

刚才是一点个人的牢骚,本文后面主要记录一些关于函数调用栈的知识点。

关于压栈出栈的不同方式

对于函数调用时的压栈和出栈,其实在细节上有一些不同的实现方式,如下图,据说是VC++的标准:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值