反汇编代码之函数的调用

一、C++中函数的调用方式主要有以下三种:

1._cdecl:是c++中默认的调用方式,所用参数从右到左入栈,这些参数由调用者清除

2._stdcall:入栈方向一致,参数由被调用者清除

3._fastcall:是快速调用方式,一般是前两个参数由寄存器传递,其他参数还是用栈传递,参数由被调用者清除

这里的东西比较简单,其实就是add esp,xxxx 是放到被调用函数内部还是放在调用语句之后的区别

如果你有时在call之后看到add esp,xxxx就知道是消除参数用的了

二、被调函数****(参数及返回值和局部变量存放位置)栈帧形成****

1----函数 调用 入口会遇到这三行代码(如下)

 push ebp ; 

mov ebp ,esp ;

sub esp,xxx;

其实就是用来形成栈帧的(如下图)

这个栈帧(地址)用于存放被调函数信息,包括在被调用函数内部声明的局部变量。这个在真正开始调用函数时才开始形成的,而参数却是在栈帧形成前就已经被压入栈中了。  
其实,[EBP]中存放的应该是栈帧生成前的EBP的值,因为被调函数的开始有个push ebp。而[EBP+4]中存放的应该是函数的返回地址,因为调用函数时压入参数之后还会把下一条语句的地址压入栈中。

2-----参数和局部变量的使用

mov ecx,ss:[ebp+0x08]; 参数获取 //当内存中括号中包含ESP或者EBP的话  用SS

mov ecx,ss:[esp+0x0C]; 局部变量获取 

mov eax,dword ptr ds:[edx+0x13C];//当内存中括号中包含EAX或者EDX的话  用DS

3-----函数返回-----

MOV ESP,EBP;
POP EBP ; //恢复堆栈

RETN       

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值