int _stdcall s_addint(int i, int j)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int __cdecl c_addint(int i, int j)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int _fastcall f_addint(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 _tmain(int argc, _TCHAR* argv[])
{
int num;
// 汇编调用_stdcall函数
// 参数由右至左压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在EAX中
_asm
{
push 2
push 1
call s_addint
mov num,eax
}
printf("num = %d\n",num);
// 汇编调用__cdecl函数
// 参数由右至左压栈
// 调用返回时,堆栈由调用者调整
// 返回值在EAX中
_asm
{
push 4
push 3
call c_addint
mov num,eax
add esp,4*2
}
printf("num = %d\n",num);
// 汇编调用_fastcall函数
// 函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在EAX中
_asm
{
mov ecx,5
mov edx,6
push 7
call f_addint
mov num,eax
}
printf("num = %d\n",num);
return 0;
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int __cdecl c_addint(int i, int j)
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return i+j;
}
int _fastcall f_addint(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 _tmain(int argc, _TCHAR* argv[])
{
int num;
// 汇编调用_stdcall函数
// 参数由右至左压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在EAX中
_asm
{
push 2
push 1
call s_addint
mov num,eax
}
printf("num = %d\n",num);
// 汇编调用__cdecl函数
// 参数由右至左压栈
// 调用返回时,堆栈由调用者调整
// 返回值在EAX中
_asm
{
push 4
push 3
call c_addint
mov num,eax
add esp,4*2
}
printf("num = %d\n",num);
// 汇编调用_fastcall函数
// 函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈
// 调用返回时,堆栈由被调函数调整
// 返回值在EAX中
_asm
{
mov ecx,5
mov edx,6
push 7
call f_addint
mov num,eax
}
printf("num = %d\n",num);
return 0;
}
以上代码通过VC8编译