函数压栈,栈帧ebp,esp怎样移动
来源:互联网 发布:2010网络歌曲排行榜 编辑:程序博客网 时间:2024/05/19 17:03
函数被调用时:
1) EIP/EBP成为新函数栈的边界
函数被调用时,返回时的EIP首先被压入堆栈;创建栈框架时,上级函数栈的EBP被压入堆栈,与EIP一道行成新函数栈框架的边界
2) EBP成为栈框架指针SFP,用来指示新函数栈的边界
栈框架建立后,EBP指向的栈的内容就是上一级函数栈的EBP,可以想象,通过EBP就可以把层层调用函数的栈都回朔遍历一遍,调试 器就是利用这个特性实现 backtrace功能的
3) ESP总是作为栈指针指向栈顶,用来分配栈空间
栈分配空间给函数局部变量时的语句通常就是给ESP减去一个常数值,例如,分配一个整型数据就是 ESP-4
4) 函数的参数传递和局部变量访问可以通过SFP即EBP来实现
由于栈框架指针永远指向当前函数的栈基地址,参数和局部变量访问通常为如下形式:
+8+xx(%ebp) ; 函数入口参数的的访问
-xx(%ebp) ; 函数局部变量访问
进入main函数的时候,
1)保存ebp指针
2)使得ebp->esp
3)保持现场ebx,esi,edi
4)进入一般函数的时候,push参数,例如有n个参数 esp = esp - 4*n
5)push函数返回地址 esp = esp -4
6)调用函数 EIP指向函数地址,jmp 函数地址
7)Push ebp 保存 (故有[ebp+8]就是第一个参数的内容)
8)使得ebp ->esp, esp = esp - 40h - 临时变量需要字节数(有字节对齐问题)
9)保持现场ebx,esi,edi
10)返回值=》eax
11)恢复现场,就是依次pop出edi,esi,ebx,
12)Esp = ebp
13)Pop ebp
14)pop 函数返回地址(即ret),EIP指向下个指令地址 esp = esp +4
15)Esp + n*4 (每个字有4个字节);push是按字操作的,32位机器
假如函数A调用函数B,函数B调用函数C ,则函数栈框架及调用关系如下图所示:
下图有点乱,因此删去部分内容,要看原图可参考我的blog
+----------------------------+---->; 高地址
| EIP (上级函数返回地址) |
+----------------------------+
| EBP (上级函数的EBP) |
+----------------------------+
| Local Variables |
| .......... |
+-----------------------------+
| Arg n(函数B的第n个参数) |
+-----------------------------+
| Arg .(函数B的第.个参数) |
+-----------------------------+
| Arg 1(函数B的第1个参数) |
+-----------------------------+
| Arg 0(函数B的第0个参数) |
+-----------------------------+
EIP (A函数的返回地址) |
+-----------------------------+
| EBP (A函数的EBP) |
+-----------------------------+
| Local Variables |
| .......... |
+-----------------------------+
| Arg n(函数C的第n个参数) |
+-----------------------------+
| Arg .(函数C的第.个参数) |
+-----------------------------+
| Arg 1(函数C的第1个参数) |
+-----------------------------+
| Arg 0(函数C的第0个参数) |
+-----------------------------+
| EIP (B函数的返回地址) |
+-----------------------------+
| EBP (B函数的EBP) |
+-----------------------------+
| Local Variables |
| .......... |
+-----------------------------+--->; 低地址
图 1-1
- 函数参数压栈,栈帧ebp,esp怎样移动的?
- 函数压栈,栈帧ebp,esp怎样移动
- 函数参数压栈,栈帧ebp,esp怎样移动的?
- esp ebp eip 函数压栈
- [备忘]栈 EBP ESP
- 函数调用过程:EBP、ESP等栈帧的变化
- ESP,EBP,栈回溯基本原理
- ESP && EBP
- ESP EBP
- CSAPP:函数调用过程(ebp,esp)
- 函数帧的esp与ebp操作
- 函数调用过程(ebp,esp)
- 函数调用过程(ebp,esp)
- 观察栈帧和EBP、ESP寄存器
- 栈指针esp和帧指针ebp
- linux函数调用中eip esp ebp的作用
- 函数调用时堆栈中的EIP EBP ESP寄存器
- eip esp ebp讲解
- epoll方法实现non-blocking socket
- <深入浅出>RCU浅析
- JAVA遇到大批数据处理时会出现Java heap space的报错的解决方案
- 2012,写在世界末日年的元旦
- windows同时连接两个网络导致无法上网问题的解决
- 函数压栈,栈帧ebp,esp怎样移动
- SQL Server 2005安装错误—SQL Server Setup已停止工作
- resize2fs
- mycat命令——cat命令的自我代码实现
- 搬家去博客园了
- 分享免费的jQuery Mobile Wordpress主题 - jQMobile
- 九度OJ 1137 浮点数加法
- 卸载 SQL Server 2005
- hdu 题目分类