函数调用过程

本文详细介绍了C语言中的函数调用过程,包括循环、函数的概念,重点解析了函数调用的过程,如传参约定、栈的使用、返回值的处理,并探讨了函数的返回机制。同时,提到了不同类型的传参约定,如__stdcall和__cdecl,以及变参函数printf的传参特点。

循环

C语言种有三种循环:

do...while
while
for(初始化;条件判断;步进)

函数

主函数(main)
库函数
自定义函数

函数的发明,使得变成可以以函数为单位进行模块化,叫做面向过程。

函数的调用过程

软件工程中,有“高内聚,低耦合”的要求。 函数就是为了实现以上要求发明的产物。 函数是面向过程的“接口",其接口包含了:参数、返回值。 函数与函数之间,就是通过参数、返回值进行交互的。并且,因为低耦合的设计,函数与函数之间,互相不需要直到对方内部的实现。具体而言,函数调用过程,会从传参开始,到获取函数调用的返回值结束。 

函数是通过来存储交互信息(包括参数、局部变量、返回地址):

栈其实就是一块内存区域,一般而言(纯经验),VS系列,栈的地址为0x0018xxxx或0x0019xxxx。 代码区域,以0x0040xxxx, 0x00041xxxx开头。

具体的传参细节要复杂得多,包括:

1. 按照调用约定传参

2. 保存返回地址

3. 跳转到被调用的函数(转移流程)

4. 保存上一层函数的栈地址

5. 开辟局部变量空间

6. 保存程序环境

7. 开始执行被调用函数的代码

函数的返回

函数的返回,从最顶部的栈帧开始(较低地址),逐渐往高地址的栈帧转移。每返回一层函数,它对应的栈帧就“丢弃”。

1. 恢复寄存器环境

2. 放弃栈帧空间(也成为“平衡栈”)

3. 取返回地址并跳转到该地址 

还剩最后一个问题,返回值到底是如何返回的?答: 在x86中,函数的返回值放在寄存器eax中。

传参约定

传参约定到底约定了什么? 

答:传参的顺序、用什么传参、谁平衡栈 

1、标准约定,__stdcall

1. 从右往左依次传参
2. 使用栈传参
3. 被调用方平衡栈

2、C约定, __cdecl

1. 从右往左依次传参
2. 使用栈传参
3. 调用方平衡栈

问:printf的传参约定是什么?为什么?

C约定,因为printf是变参函数,变参函数传参的个数是变化的,只能调用方去平衡栈。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值