一.C函数调用与堆栈的关系
C语言通过堆栈将参数传入函数内部
push和pop的时候esp用于指向栈顶——栈顶总是栈中地址最小的位置。push则esp减少,pop则esp增加。
二.函数调用规则
定义:函数调用规则是指调用者和被调用函数之间传递参数及返回参数的方法。
Windows上常用的有Pascal方式,WINAPI(_stdcall)方式以及C方式(_cdecl)。
1._cdecl方式
参数入栈:参数从右到左依次入栈
清理方式:函数返回后,调用者负责清理堆栈。这种调用会生成较大的可执行程序。
2._stdcall方式(WINAPI方式)
参数入栈:参数从右到左依次入栈
清理方式:被调用函数在返回前自行清理堆栈。生成代码比_cdecl方式小。
3.Pascal方式
入栈方式:参数从左到右依次入栈
清理方式:被调用函数在返回前自行清理堆栈
不支持可变参数的函数调用
此外Windows内核中还有常见的_fastcall快速调用;c++中有_thiscall方式。
任何调用方式,最终返回值都是写入eax,然后返回。外部从eax中取得返回值。 (全文…)
