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函数:

  1. 先将main函数栈帧栈底地址入栈:push ebp
  2. mov ebp , esp
  3. sub sep ,4ch (4ch举例的)

    2、3 两步骤是在给sum函数开辟栈帧
  4. 执行函数体

  5. 执行完sum函数后:


    所以,执行完sum后,pc直接跳到sum函数下一行继续执行了!

以上是关于2. 指令角度分析函数调用堆栈详细过程的主要内容,如果未能解决你的问题,请参考以下文章

从汇编指令角度理解函数调用过程

c语言中函数调用的本质从汇编角度分析

深入理解系统调用

深入理解系统调用

GDB调试汇编堆栈过程分析

Linux内核分析(第二周)