一、函数堆栈调用开栈过程:
第一步:自右向左 压入实参 —— 形参的初始化;
第二步:压入下一行指令地址;
第三步:压入调用方函数的栈底地址;
第四步:调转到被调用方函数的栈帧位置;
第五步:开辟被调用函数运行需要的栈空间。
堆栈调用的释放过程就是开展过程的逆过程。
二、调用约定
1、约定的形式:
_cdecl:C标准调用约定
_stdcal:Windows下的标准调用约定
_fastcall:快速调用约定
_thiscall:类成员方法的调用约定
2、约定内容:
(1)函数的额符号生成方式
(2)实参的入栈方式
(3)形参的开辟和清理
_cdecl 约定中,调用方开辟形参的存放空间,调用方负责清理空间;
_stdcall 约定中,调用方开辟形参的存放空间,被调用方负责清理空间;
_fastcall 约定中,调用方开辟形参的存放空间,被调用方负责清理空间;
三、函数返回值的带回方式
返回值的带回是通过返回值的类型大小来确定它的带回方式的。
如果返回值类型大小 < 4 字节,则存放在 eax 寄存器中被带回;
如果返回值类型大小 >4 字节 && < = 8 字节,则存放在 eax 和 edx 两个寄存器中被带回;
如果返回值类型大小 >8 字节,则重新开辟一块空间,将需要带回的内容存放在新开辟的内存中,然后将该空间的地址返回给函数。