函数调用过程

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

循环

C语言种有三种循环:

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

函数

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

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

函数的调用过程

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

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

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

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

1. 按照调用约定传参

2. 保存返回地址

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

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

5. 开辟局部变量空间

6. 保存程序环境

7. 开始执行被调用函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数调用过程是程序中常见的一种操作,它通常涉及到参数传递、栈帧的建立与销毁、返回值的传递等多个方面。从汇编的角度来看,函数调用过程可以分为以下几个步骤: 1. 将函数的参数压入栈中。在调用函数时,需要将函数所需的参数传递给它。这些参数通常以一定的顺序压入栈中,以便在函数内部使用。在 x86 架构中,参数的传递是通过将参数压入栈顶实现的。 2. 调用函数。函数调用的指令通常是 CALL 指令。在调用函数前,需要将函数的入口地址压入栈中,以便在函数执行完毕后返回到调用位置。CALL 指令会将当前的程序计数器(PC)压入栈中,并将函数的入口地址作为新的 PC。 3. 建立栈帧。在函数被调用时,需要为函数建立一个独立的栈帧,以便在函数内部使用局部变量和临时变量。栈帧通常包括以下几个部分:返回地址、旧的基址指针、局部变量和临时变量。在 x86 架构中,栈帧的建立是通过将 ESP 寄存器减去一个固定的值实现的。 4. 执行函数。在函数被调用后,CPU 会跳转到函数的入口地址并开始执行函数。函数内部可以通过栈中的参数和局部变量完成相应的计算和操作。 5. 返回值传递。在函数执行完毕后,需要将函数的返回值传递给调用者。在 x86 架构中,函数的返回值通常通过 EAX 寄存器传递。 6. 销毁栈帧。在函数执行完毕后,需要将栈帧销毁,以便释放栈空间。栈帧的销毁通常是通过将 ESP 寄存器还原到旧的基址指针处实现的。 7. 返回到调用位置。在函数执行完毕后,需要返回到函数被调用的位置。在 x86 架构中,返回指令通常是 RET 指令。RET 指令会将栈顶的返回地址弹出,并将其作为新的 PC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值