shootingstars

菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。尘埃乃虚幻,亦何惧之来?

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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;

}

 

以上代码通过VC8编译

 

posted on 2008-07-22 13:52  shootingstars  阅读(876)  评论(0编辑  收藏  举报