C语言函数调用机制

本文使用一个简单的C语言的例子探索一下函数的调用机制,函数调用关系如下:

int g(int x)
{
    return x + 10;
}

int f(int x)
{
    return g(x);
}

int main(void)
{
    return f(10) + 5;
}

这里写图片描述

通过编译生成汇编代码分析调用过程:
gcc –S –o main.s main.c -m32
生成汇编代码如下(main.s文件的原始内容):
这里写图片描述
这里写图片描述
这里写图片描述

简化代码后:
这里写图片描述
注释后代码:
这里写图片描述

函数的参数传递是通过堆栈传递的, *在函数调用之前将要传递的参数压入栈中,然后调用call指令
跳转到被调函数地址,同时先把当前PC指针压入栈中。跳转到被调函数之后,要先建立栈帧(通过
指令pushl %ebp 和 movl %esp %ebp完成),通过ebp加偏移取得调用函数的参数值,在函数返回
时通过leave 完成上述的逆过程,使堆栈恢复到调用函数的栈帧,再通过ret使代码恢复到调用函数,
这样就可以完整的回到调用函数中了*

计算机的工作原理
用户程序运行在操作系统提供的虚拟的环境中,它有自己的内存空间, 分为代码段、数据段、bss段、
堆空间和堆栈,代码段、数据段和bss段是从可执行文件中加载的,堆空间和堆栈是动态创建的。程序
使用堆栈来完成函数的调用过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值