1. __stdcall调用
__stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。
2. __cdecl调用
__cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护。
3. __fastcall调用
__stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。
2. __cdecl调用
__cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护。
3. __fastcall调用
_fastcall调用较快,前两个参数通过ecx和edx传递,其它参数从右向左的顺序压栈,被调函数自身在返回前清空堆栈。
示例:
#include <stdio.h>
#include <stdlib.h>
int __stdcall s_add(int i, int j)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int __cdecl c_add(int i, int j)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int __fastcall f_add(int i, int j, int k)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("k = %d\n",k);
return i+j+k;
}
int main(int argc, const char* argv[])
{
int num;
// 汇编调用__stdcall函数
// 参数由右至左压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在eax中
__asm
{
push 2
push 1
call s_add
mov num, eax
}
printf("num = %d\n", num);
// 汇编调用__cdecl函数
// 参数由右至左压栈
// 调用返回时,堆栈由调用者调整
// 返回值在eax中
__asm
{
push 4
push 3
call c_add
mov num, eax
add esp, 4*2
}
printf("num = %d\n", num);
// 汇编调用__fastcall函数
// 函数的前两个参数通过ecx和edx传递,其它参数从右向左的顺序压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在eax中
__asm
{
mov ecx, 5
mov edx, 6
push 7
call f_add
mov num, eax
}
printf("num = %d\n", num);
return EXIT_SUCCESS;
}