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