函数调用方式

#include <stdio.h>
#include <stdlib.h>
//通过栈传入值的话
void _fastcall funcFast(int a, int b)
{
001C1B2F  pop         ecx  
001C1B30  mov         dword ptr [b],edx  
001C1B33  mov         dword ptr [a],ecx  
	printf("%d", a+b);
001C1B36  mov         eax,dword ptr [a]  
001C1B39  add         eax,dword ptr [b]  
001C1B3C  mov         esi,esp  
001C1B3E  push        eax  
001C1B3F  push        1CE988h  
001C1B44  call        dword ptr ds:[1D2470h]  
001C1B4A  add         esp,8  
001C1B4D  cmp         esi,esp  
001C1B4F  call        __RTC_CheckEsp (01C13CFh)  
}
001C1B54  pop         edi  
001C1B55  pop         esi  
001C1B56  pop         ebx  
001C1B57  add         esp,0D8h  
001C1B5D  cmp         ebp,esp  
001C1B5F  call        __RTC_CheckEsp (01C13CFh)  
001C1B64  mov         esp,ebp  
001C1B66  pop         ebp  
001C1B67  ret  
001C1B68  int         3  
。。。。。
001C1B7F  int         3  
void _cdecl funccde(int a,int b)
{
001C1B80  push        ebp  //栈帧已经变化,esp指向最高,跟随压入的在动
001C1B81  mov         ebp,esp  
001C1B83  sub         esp,0C0h  
001C1B89  push        ebx  
001C1B8A  push        esi //这三个值的压入是在esp基础上的压入 
001C1B8B  push        edi             //edi目的寄存器,esi源寄存器,用于大块数据的移动
001C1B8C  lea         edi,[ebp-0C0h]  
001C1B92  mov         ecx,30h  
001C1B97  mov         eax,0CCCCCCCCh  
001C1B9C  rep stos    dword ptr es:[edi]  
	printf("%d",a-b);
001C1B9E  mov         eax,dword ptr [a]  
001C1BA1  sub         eax,dword ptr [b]  
001C1BA4  mov         esi,esp  
001C1BA6  push        eax  
001C1BA7  push        1CE988h  
001C1BAC  call        dword ptr ds:[1D2470h]  
001C1BB2  add         esp,8  
001C1BB5  cmp         esi,esp  
001C1BB7  call        __RTC_CheckEsp (01C13CFh)  
}
001C1BBC  pop         edi  //cdelc自己进行栈帧的回退
001C1BBD  pop         esi  //通过堆栈进行传值
001C1BBE  pop         ebx  
001C1BBF  add         esp,0C0h  //此处也有增加 
001C1BC5  cmp         ebp,esp  
001C1BC7  call        __RTC_CheckEsp (01C13CFh)  
001C1BCC  mov         esp,ebp  
001C1BCE  pop         ebp  
001C1BCF  ret                                    //没有进行平衡
001C1BD0  int         3  
。。。
--- e:\c_study\算法\test\test\c.c ------------------------------------------------
void _stdcall funcstd(int a, int b)
{
001C1BF0  push        ebp  
001C1BF1  mov         ebp,esp  
001C1BF3  sub         esp,0C0h  
001C1BF9  push        ebx  
001C1BFA  push        esi  
001C1BFB  push        edi  
001C1BFC  lea         edi,[ebp-0C0h]  
001C1C02  mov         ecx,30h  
001C1C07  mov         eax,0CCCCCCCCh  
001C1C0C  rep stos    dword ptr es:[edi]  
	printf("%d", a*b);
001C1C0E  mov         eax,dword ptr [a]  
001C1C11  imul        eax,dword ptr [b]  
001C1C15  mov         esi,esp  
001C1C17  push        eax  
001C1C18  push        1CE988h  
001C1C1D  call        dword ptr ds:[1D2470h]  
001C1C23  add         esp,8  
001C1C26  cmp         esi,esp  
001C1C28  call        __RTC_CheckEsp (01C13CFh)  
}
001C1C2D  p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值