1.函数调用堆栈
1.压入形参变量的地址和值
2.压入函数调用返回后要执行的指令的地址
被调用函数:
1.压入调用函数的栈底指针,把栈底指针寄存器指向被调用函数的栈底
1.清理被调用函数开辟的栈帧大小
2.回退栈底指针到调用函数的栈底
3.把回退到调用函数要执行的指令地址给pc寄存器
调用函数:
1. <=4 eax 值
2. <4<=8 eax edx
3. >8 开辟一个临时量(函数调用之前就产生,被调用函数return处通过ebp-8访问)
eax 带出临时量的地址
_cdecl c的调用约定
_stdcall Windows下的标准调用约定
_fastcall 快速调用约定
_thiscall C++的成员函数调用约定
1.符号的生成方式不同
ld 合并符号表
main: 符号表 _cdecl ?sum@@YAHHH@Z *UND* global
符号解析
test: _stdcall ?sum@@YGHHH@Z .text global
_fastcall ?sum@@YIHHH@Z
2.参数的压栈方式不同(参数入栈顺序不同)
3.函数的形参内存清理
_cdecl 调用方开辟 调用方清理
_stdcall 调用方开辟 被调用方清理
_fastcall
<= 8
寄存器带值 不需要形参变量的清理
> 8
前2个形参寄存器带值 不需要形参变量的清理
后面的和stdcall调用方式一样
压栈
调用函数:1.压入形参变量的地址和值
2.压入函数调用返回后要执行的指令的地址
被调用函数:
1.压入调用函数的栈底指针,把栈底指针寄存器指向被调用函数的栈底
2.开辟被调用函数的栈帧大小,并初始化为CC
清栈
被调用函数1.清理被调用函数开辟的栈帧大小
2.回退栈底指针到调用函数的栈底
3.把回退到调用函数要执行的指令地址给pc寄存器
调用函数:
1.清理形参变量的内存
1. <=4 eax 值
2. <4<=8 eax edx
3. >8 开辟一个临时量(函数调用之前就产生,被调用函数return处通过ebp-8访问)
eax 带出临时量的地址
循环拷贝到接收返回值的变量的地址空间
_cdecl c的调用约定
_stdcall Windows下的标准调用约定
_fastcall 快速调用约定
_thiscall C++的成员函数调用约定
1.符号的生成方式不同
ld 合并符号表
main: 符号表 _cdecl ?sum@@YAHHH@Z *UND* global
符号解析
test: _stdcall ?sum@@YGHHH@Z .text global
_fastcall ?sum@@YIHHH@Z
2.参数的压栈方式不同(参数入栈顺序不同)
3.函数的形参内存清理
_cdecl 调用方开辟 调用方清理
_stdcall 调用方开辟 被调用方清理
_fastcall
<= 8
寄存器带值 不需要形参变量的清理
> 8
前2个形参寄存器带值 不需要形参变量的清理
后面的和stdcall调用方式一样