1.调用惯例
调用惯例函数调用方和被调用函数对函数调用的统一理解,一般包含如下几个方面的内容:
- 函数参数的传递顺序和方式: 最常见的方式是通过栈传递,也可以使用寄存器传递参数,提高性能
- 栈的维护方式: 函数调用后,被压入栈中的参数需要被弹出,以使得栈在函数调用前后保持一致。这个弹出的工作可以由调用函数来完成,也可以有被调用函数来完成
- 名字修饰策略: 不同的调用管理有着不同的修饰策略
| 调用惯例 | 出栈方 | 参数传递 | 名字修饰 |
|---|---|---|---|
| cdecl | 函数调用方 | 从右至左的顺序入栈 | 下划线+函数名 |
| stdcall | 函数本身 | 从右至左的顺序入栈 | 下划线+函数名+@+参数的字节数 |
| fastcall | 函数本身 | 头两个类型存放到寄存器,其他剩下参数从右到左的顺序入栈 | @+函数名+@+参数的字节数 |
2.相关寄存器
x86_64中的常见寄存器和位数如下两幅图所示。


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

被折叠的 条评论
为什么被折叠?



