C/C++函数调用分析

本文详细介绍了C/C++函数调用的调用惯例,包括参数传递方式、栈维护和名字修饰策略。讨论了x86_64架构中涉及的寄存器及其作用,解析了汇编指令如call、ret、leave在函数调用中的功能,并通过代码分析展示了函数返回值如何在寄存器和栈之间传递。

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

1.调用惯例

调用惯例函数调用方和被调用函数对函数调用的统一理解,一般包含如下几个方面的内容:

  • 函数参数的传递顺序和方式: 最常见的方式是通过栈传递,也可以使用寄存器传递参数,提高性能
  • 栈的维护方式: 函数调用后,被压入栈中的参数需要被弹出,以使得栈在函数调用前后保持一致。这个弹出的工作可以由调用函数来完成,也可以有被调用函数来完成
  • 名字修饰策略: 不同的调用管理有着不同的修饰策略
调用惯例 出栈方 参数传递 名字修饰
cdecl 函数调用方 从右至左的顺序入栈 下划线+函数名
stdcall 函数本身 从右至左的顺序入栈 下划线+函数名+@+参数的字节数
fastcall 函数本身 头两个类型存放到寄存器,其他剩下参数从右到左的顺序入栈 @+函数名+@+参数的字节数

2.相关寄存器

x86_64中的常见寄存器和位数如下两幅图所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值