函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall ,如果用vc开发 dll给其他语言用,则应该指定__stdcall方式 。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作, 如果是__cdecl方式的函数,则 函数本身 (如果不用汇编写)则 不需要关心 保存参数的 堆栈 的清除 ,但是如果是 __stdcall的规则,一定要在 函数 退出(ret)前恢复堆栈 。 1.__cdecl 所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是 由调用者 来维护的。 返回值在EAX中 因此,对于象printf这样变参数的函数必须用这种规则。编译器在编译的时候对这种调用规则的函数生成修饰名的饿时候,仅在输出函数名前加上一个下划线前缀,格式为 _ functionname。 2.__stdcall 按从 右至左的顺序压参数入栈,由被调用者把参数弹出栈 。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,切记: 函数 自己在退出时清空堆栈