<一>从指令角度了解函数堆栈调用过程
代码
点击查看代码
#include <iostream>
using namespace std;
int sum(int a,int b){
int temp=0;
temp= a +b;
return temp;
}
int main(){
int a =10;
int b=20;
int ret =sum(a,b);
return 0;
}
以上代码考虑2个问题:
问题1:main函数调用sum,sum执行完成以后,怎么知道回到哪个函数中?
问题2:sum函数执行完后,回到main后,怎么知道从哪一行指令继续执行的?
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
函数参数压栈
//------------------------------------------------------------------------------------------------------------------
函数参数压栈
//------------------------------------------------------------------------------------------------------------------
下一条汇编指令地址入栈
//------------------------------------------------------------------------------------------------------------------
main函数栈底指针入栈
//------------------------------------------------------------------------------------------------------------------
移动ebp,进入被调函数
//------------------------------------------------------------------------------------------------------------------
为sum函数开辟函数栈帧
//------------------------------------------------------------------------------------------------------------------
将返回值放入寄存器
//------------------------------------------------------------------------------------------------------------------
回退esp栈指针
//------------------------------------------------------------------------------------------------------------------
将ebp指回main函数栈底
//------------------------------------------------------------------------------------------------------------------
取出下一条执行的汇编指令地址并执行
//------------------------------------------------------------------------------------------------------------------
此时 esp ,ebp 又指向了main函数的栈底指针和栈顶指针
//------------------------------------------------------------------------------------------------------------------
最新文章
- [转]struts2处理.do后缀的请求
- java方法与构造
- 浅析word-break work-wrap区别
- CSS应用心得
- ckeditor使用
- 使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中
- Linux卸载系统自带的JDK
- 下载的时候如果文件名是中文就变成zip.zip
- .NET中开源CMS目录
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
- poj 1458 Common Subsequence(区间dp)
- 六星经典CSAPP-笔记(3)程序的机器级表示
- html2canvas 识别 svg 解决方案
- Spring拓展接口之BeanFactoryPostProcessor,占位符与敏感信息解密原理
- script 修改 plist遇到的问题
- vue学习-自动行合并的table
- River Problem HDU - 3947(公式建边)
- [转] php die()与exit()的区别实例详解
- Day6------------磁盘用满的两种情况
- Elasticsearch 开启