Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11592
  • 博文数量: 10
  • 博客积分: 420
  • 博客等级: 下士
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 15:42
文章分类
文章存档

2010年(10)

我的朋友
最近访客

分类: C/C++

2010-08-03 12:38:29

调用函数前,会把参数入栈操作,如下面函数
void func(arg1,arg2);
 
push arg2
push arg1
 
参数入栈的顺序和编译器还有函数调用约定有关,函数调用约定请查看相关资料。这里假设入栈顺序是从右到左,因为大部分入栈顺序都是从右到左的。
 
参数入栈之后,会调用函数
call func
 
这个操作会将eip入栈,用来保证函数结束后,cpu执行call func下一个指令。
 
然后会将ebp入栈
push ebp
 
之后将ebp赋值给esp
move ebp,esp
 
这时ebp==esp
 
现在看下栈里面的内容,由于栈地址是从高到低的
所以ebp地址中保存的是以前的ebp,ebp+4保存的是eip,ebp+8保存的是arg1,ebp+12保存的是arg2
 
函数返回之前会将ebp恢复,esp是在函数返回之前恢复还是在函数返回之后恢复,就和调用约定有关了。
stdcall返回前是这样的ret 8,这样表示esp+8
cdecl返回前直接ret,这样esp是在函数返回后恢复esp+8。
 
 
阅读(367) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:类的结构

给主人留下些什么吧!~~