Linux 环境中,虚拟地址空间即用户程序可以看到的地址空间分为以下几个段,从上到下依次是栈,堆,bss,data,text

以下内容只适用于 32 位系统,64 位系统略微不同。
1、栈
1.1 栈的作用
在 c/c++ 中函数调用很常见,那么在底层函数调用是怎么实现的呢?c/c++ 中的函数调用,在会汇编指令中通过call 指令实现,当执行到 call 指令的时候,① 将函数所需参数从右到左依次入栈,例如调用 printf("a+b=%d\n",sum);
,sum 入栈,字符串"a+b=%d\n"的地址入栈,② CPU 首先将call 指令之后指令地址入栈,当函数 return 的时候可以继续往下执行。当进入函数内部的时候,首先执行:
push %ebp
mov %esp,%ebp
此时 ebp 代表该函数的栈顶地址,一个栈帧表示一个函数的调用过程,此时在该函数内部可以自由使用 ebp 以下的内存空间,可以通过将 sp 寄存器减去特定的值,来为函数的局部变量预留空间,变量地址可以通过 bp 指针获取。如下图所示:

当函数返回的时候,要确保栈的内容和调用之前一模一样。
1.2 栈的工作过程
现在通过代码来观察栈的工作过程。以下代码定义了一个求和函数,在 main 函数中将m,n,x,y 的和 保存在sum 变量中。 其中 sum 是未初始化变量,这主要为了测试,记得不要使用未初始化的变量。
int getSum(int a,int b,int c,int d){
return a+b+c+d;
}
int main(){
<