函数调用过程以及栈帧详解

本文详细介绍了函数调用过程中的栈帧概念,通过分析C语言代码的反汇编,展示了栈帧如何分配和释放,以及参数传递、局部变量存储和返回值的处理。通过示例展示了如何在VC6.0环境下利用栈帧特性进行代码修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的调用是一个过程,那么在函数的调用过程中要开辟栈空间,用来对本次函数的调用中需要的临时变量保存。这块空间叫栈帧。这个过程调用包括将数据和控制从代码的一部分传递到另一部分。过程调用的任务:为过程的局部变量分配空间,并在退出时释放这些空间,俗称保存现场/恢复现场。栈的作用:参数传递、局部变量分配、保存调用的返回地址、保存寄存器以供恢复栈帧:为单个过程分配的那部分栈称为栈帧

这是代码在内存的分布:

一般栈形图如下:

下面,我们用一个简单的函数调用过程来看这个过程。我们写了一段简单的代码:

#include<stdio.h>
int Add(int x,int y)
{
 int z = 0;
 z = x + y;
 return z;
}
int main()
{
 int a = 10;
 int b = 20;
 int ret = Add(a, b);
 printf("result: %d\n", ret);
 return 0;
}

对应的反汇编为:

int main()
{

008C17D0  push        ebp  //把ebp压入栈中,方便返回
008C17D1  mov         ebp,esp  //把esp赋值给ebp
008C17D3  sub         esp,0E4h  //产生新的esp

(这一部分的功能就是开辟新的栈帧)


008C17D9  push        ebx 
008C17DA  push        esi 
008C17DB  push        edi 
008C17DC  lea         edi,[ebp-0E4h] 
008C17E2  mov        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值