【C语言】函数运行过程-----栈帧调用

本文详细解析了C语言中函数调用的过程,特别是栈帧的创建与销毁,以及寄存器如何在函数调用中保存和恢复状态。通过示例代码和汇编分析,阐述了参数传递、局部变量存储以及函数返回值的处理方式,揭示了程序执行的底层机制。

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

每次函数调用,都为函数开辟一块空间,成为栈帧。

首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),我们称为栈底指针,寄存器esp指向当前的栈帧的顶部(低地址),我们称为栈顶指针。

注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。

给段代码,剖析下面函数运行过程。
运行环境:VC6.0,(相比VS,更容易查看内存)

#include<stdio.h>
int Sub(int x,int y)
{
    int t=0;
    t=x-y;
    return t;
}
int main()
{
    int a=10;
    int b=20;
    int c=0;
    c=Sub(a,b);

    return 0;
}

给出这段代码的汇编代码

8:    int main()
9:    {
00401060   push        ebp
00401061   mov         ebp,esp
00401063   sub         esp,4Ch
00401066   push        ebx
00401067   push        esi
00401068   push        edi
00401069   lea         edi,[ebp-4Ch]
0040106C   mov         ecx,13h
00401071   mov         eax,0CCCCCCCCh
00401076   rep stos    dword ptr [edi]
10:       int a=10;
00401078   mov         dword ptr [ebp-4],0Ah
11:       int b=20;
0040107F   mov         dword ptr [ebp-8],14h
12:       int c=0;
00401086   mov         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值