2. 指令角度分析函数调用堆栈详细过程
Posted 阿龙亡命天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. 指令角度分析函数调用堆栈详细过程相关的知识,希望对你有一定的参考价值。
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);
cout<<"ret:"<<ret<<endl;
return 0;
问题一:main函数调用sum,sum执行完以后,怎么知道回到那个函数中?
问题二:sum函数执行完,回到main以后,怎么知道从哪一行指令继续运行的?
为什么是ebp-4 ebp-8 ?
ebp是main函数栈底地址,esp栈顶地址,栈的生长方向是高地址向低地址,所以将a压入时,是-4,b压入时是-8。
调用sum函数阶段:
将栈底的ab,取出来压入栈顶即esp,esp要移动:
接下来是调用函数:call sum
调用函数前 会将下一行代码的地址入栈:
开始调用sum函数:
- 先将main函数栈帧栈底地址入栈:push ebp
- mov ebp , esp
- sub sep ,4ch (4ch举例的)
2、3 两步骤是在给sum函数开辟栈帧 - 执行函数体
- 执行完sum函数后:
所以,执行完sum后,pc直接跳到sum函数下一行继续执行了!
以上是关于2. 指令角度分析函数调用堆栈详细过程的主要内容,如果未能解决你的问题,请参考以下文章