亚洲彩票登陆

函数调用时栈是如何变化的?

202204月15日

函数调用时栈是如何变化的?

 

大家都知道函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。

栈帧的结构

函数在调用的时候都是在栈空间上开辟一段空间以供函数使用,所以,我们先来了解一下通用栈帧的结构。

如图所示,栈是由高地址向地地址的方向生长的,而且栈有其栈顶和栈底,入栈出栈的地方就叫做栈顶。

在x86系统的CPU中,rsp是栈指针寄存器,这个寄存器中存储着栈顶的地址。rbp中存储着栈底的地址。函数栈空间主要是由这两个寄存器来确定的。

当程序运行时,栈指针rsp可以移动,栈指针和帧指针rbp一次只能存储一个地址,所以,任何时候,这一对指针指向的是同一个函数的栈帧结构。

而帧指针rbp是不移动的,访问栈中的元素可以用-4(%rbp)或者8(%rbp)访问%rbp指针下面或者上面的元素。

在明白了这些之后,下面我们来看一个具体的例子: 

#include <stdio.h>  int sum (int a,int b)  {   int c = a + b;   return c;  }  int main()  {   int x = 5,y = 10,z = 0;   z = sum(x,y);   printf("%d\r\n",z);   return 0;  } 

反汇编如下,下面我们就对照汇编代码一步一步分析下函数调用过程中栈的变化。 

0000000000000000 <sum>:     0: 55                    push   %rbp      1: 48 89 e5              mov    %rsp,%rbp     4: 89 7d ec              mov    
                       
亚洲彩票登陆平台,亚洲彩票登陆官网,亚洲彩票登陆网址,亚洲彩票登陆下载,亚洲彩票登陆app,亚洲彩票登陆开户,亚洲彩票登陆投注,亚洲彩票登陆购彩,亚洲彩票登陆注册,亚洲彩票登陆登录,亚洲彩票登陆邀请码,亚洲彩票登陆技巧,亚洲彩票登陆手机版,亚洲彩票登陆靠谱吗,亚洲彩票登陆走势图,亚洲彩票登陆开奖结果