关于C语言的函数栈帧的创建和销毁

本文详细解释了VS2013中函数调用时栈帧的创建、参数传递、以及栈帧销毁的过程,重点介绍了ebp和esp寄存器的作用以及栈区的使用规则。
摘要由CSDN通过智能技术生成

由于使用编译器为vs2013,该电脑未配备,无代码演示

1.寄存器:eax,ebx,ecx,edx ebp,esp

ebp,esp这2个寄存器中存放的是地址,这两个地址是用来函数栈帧的

每一个函数调用都要在栈上开辟空间,开辟的空间被称为函数栈帧,由ebp(栈低指针),esp(栈顶指针)维护

栈区的使用习惯是先使用高地址在使用低地址,

在VS2013中main函数的调用逻辑,

3.main

2.__tmainCRTStartup

1.mainCRTStartup、

压栈(push):在顶上指针放进去一个元素;出栈(pop):从顶上指针拿走一个元素;

此时esp,ebp之间的空间是.__tmainCRTStartup函数的空间,接下来要进行main函数栈帧的创建

1.首先要进行一个push压栈把ebp压入函数栈帧使esp向上移动一格,

2.进行mov操作把esp地址放入ebp中

3.进行sub减法操作,把esp的值减去0E4h,esp往上移,指向一个新地址,

4.在压三个元素ebx, esi,edi,esp往上走

5.lea(load effective address加载有效地址):在edi中加载一个地址

6.mov:ecx,39h,把39h放到ecx寄存器中; 

7.mov;eax,0CCCCCCCh,从ecx到eax初始化成0CCCCCCCh;

main函数预开辟的空间全部是ccc

把结果放在eax中进行保存,eax不会销毁它是寄存器;

esp,ebp之间的空间就是为函数预开辟的空间;

函数调用的函数栈帧创建

函数每次调用的时候都会重复执行上述步骤;压栈

函数调用时候的参数是从右向左传;

形参是实参的一份临时拷贝;

call调用函数,把下一条指令的地址压进栈

函数栈帧的销毁

进行三次pop操作弹出edi,esi,ebx三个变量;

eax将结果带回,esp,ebp之间的空间没有存在的必要,进行回收;

采用move指令,将ebp的地址放入esp中;

pop ebp调用结束;

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值