todo

c/c++函数调用方式

up:2015-08-23 13:02:43 edit:2015-08-23 13:13:03 view:1228

int _stdcall function(int a, int b);


stdcall的调用方式意味着:

(1) 参数从右向左一次压入堆栈

(2) 由被调用函数自己来恢复堆栈

(3) 函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸

上面那个函数翻译成汇编语言将变成:

push b     先压入第二个参数

push a     再压入第一个参数

call function   调用函数


在编译时,此函数的名字被翻译为_function@8




int function(int a, int b)  // 不加修饰符就是C调用方式



int _cdecl function(int a, int b)  // 明确指定用C调用方式



cdecl调用方式又称为C调用方式,是C语言缺省的调用方式,它的语法为:


cdecl的调用方式决定了:

(1) 参数从右向左依次压入堆栈

(2) 由调用者恢复堆栈

(3) 函数名自动加前导下划线

由于是由调用者来恢复堆栈,因此C调用方式允许函数的参数个数是不固定的,这是C语言的一大特色。

此方式的函数被翻译为:

push b   // 先压入第二个参数

push a   // 在压入第一个参数

call funtion  // 调用函数

add  esp, 8   // 清理堆栈


在编译时,此方式的函数被翻译成:_function




int fastcall function(int a, int b);


fastcall 按照名字上理解就可以知道,它是一种快速调用方式。此方式的函数的第一个和第二个DWORD参数通过ecx和edx传递,

后面的参数从右向左的顺序压入栈。

被调用函数清理堆栈。

函数名修个规则同stdcall



1.函数入栈顺序通常是:从右到左

2.从右到左的好处是,第一个参数就在栈顶,我们很方便就定位到了第一个参数的位置

3.从右往左入栈的目的是方便的可变参数的使用,获得第一个参数的位置,



not in sinaapp