C/C++ 调用规则
平栈:清理参数
对调用栈的操作步骤:
参数传递
三种调用约定:
cdecl (C调用约定):
从右往左传参,参数通过栈传递,调用方(caller)负责平参(支持类似printf的不定参)
stdcall (标准调用约定,其实是微软定义的调用约定):
从右往左传参,参数通过栈传递,被调方(callee)负责平栈(不支持不定参)
fastcall (只有微软自己编译器可用的调用约定):
从右往左传参,左边两个参数通过寄存器传递,其余参数通过栈传递,被调方(callee)负责平栈(不支持不定参)
在栈顶保存返回地址
保存调用方的栈信息(栈底地址)
更新栈位置到被调方的栈底处(更新SIP栈寄存器的地址)
在栈内开辟局部变量的空间
A. 编译选项有/Zi+/Od(debug模式)时,则用0xcc填充局部变量空间
保存寄存器环境
执行函数体
恢复寄存器环境
释放局部变量空间
恢复栈信息到调用方(更新SIP栈寄存器的地址)
取出调用方的返回地址
cdecl:切换到返回地址后,由调用方平栈
stdcall, fastcall:平栈,然后切换到返回地址,继续执行
内存分布图: