函数调用堆栈过程

一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int sum(int a, int b)
{
int temp = 0;
temp = a + b;
return temp;
}
int main()
{
int a = 10;
int b = 20;
int res = sum(a, b);
cout << "res:" << res << endl;
return 0;
}

问题1:main函数调用sum,sum执行完后,怎么知道回到哪个函数中?

问题2:sum函数执行完后,回到main后,怎么知道下一条指令在哪?

栈帧

有两个与栈底、栈顶地址有关的寄存器。

ebp全称Extended Base Pointer,扩展基址指针寄存器,用于存放函数栈底指针。

esp全称Extended Stack Pointer,扩展栈指针寄存器,用于存放函数栈顶指针,指向栈的栈顶(下一个压入栈的活动记录的顶部)。

先分析main函数的栈帧。

1
2
mov dword ptr[ebp-4], 0Ah	# int a = 10;
mov dword ptr[ebp-8], 14h # int b = 20;