函数调用堆栈

基于孟宁老师的Linux内核分析

  1 int g(int x){                                                               2     int y = x + 3;3     return y;4 }5 6 int f(int x){7     int z = x + 10;8     return g(z);9 }10 11 int main(){12     int a = f(8) + 1;13     return 0;14 }

对于上述源代码,我们尝试对其进行分析,先编译gcc -g -o lab1 lab1.c(注意计算机系统是32位Linux)。

堆栈能够干什么

对于C语言来说,32位下,堆栈都能干什么?

  1. 函数调用,使用call的时候,保存当前EIP的值,然后函数指向完,ret再返回来。
    call指令,能够让EIP入栈,ret指令让EIP出栈
  2. 保存函数局部变量,函数内的局部变量,就是保存在当前函数的栈空间中。
  3. 传递函数参数,参数先被放入栈空间中,然后再执行call指令调用函数(对于32位系统,从右到左依次压栈),因此来说,函数参数一定是被调用的函数的栈空间上面的(高地址)

另外,函数的返回值,会被保存到EAX中,可能是值,也可能是地址(如果是地址,地址对应的空间就不能是会被销毁的栈空间,需要是堆空间,或者是暂时不会被销毁的栈空间)。

指针和引用也可以传递返回值,他们是作为参数传过来的,修改指针指向地址的值,就相当于是传参了。

关于栈空间的构建与撤销,其实就两个重要节点

  1. 栈底保存EBP的值,ESP作为栈顶,就是栈空间的创建
  2. 栈空间创建后,随着函数对ESP的使用,栈空间会各种改变,但是可以一键还原会创建栈空间前的状态,因为EBP一直指向栈底之上的一个位置,先把ESP = EBP,然后把原来的EBP出栈,就达到了复原,这样一来,这个函数从栈空间来看,就像没有执行过一样。而栈空间也会被回收,不能再使用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

存储2个局部变量:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vivado提高综合和实现的速度

让计算机的资源尽可能给vivado,综合、实现的时候修改一个参数 jobs改为你的计算机的最大值,我的计算机是12核的。 速度会快很多!

安装Ubuntu RISC V toolchain失败(网速、git配置原因)

git获取大容量工程出错:RPC failed; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub仓库 gitee镜像仓库 如果网速不够&#xff0…

VirtualBox Ubuntu个人配置

注意这里VT-x启用,除了在BIOS启用CPU虚拟化,还得在命令行设置一次才可以勾选。 F:\>cd F:\VirtualBox # 进入VirtualBox安装目录F:\VirtualBox>VBoxManage.exe list vms # 查找所有虚拟机 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止维护版本的软件源配置和系统升级方法

这里以Ubuntu 20.10版本为例(当前是2022.2.14,该版本已经停止维护),我们现在需要正常使用该版本,并且期待升级到21.10版本,我们需要 配置正确是软件源升级该版本 配置正确的软件源 配置国内镜像源 我们…

diff and colordiff on Ubuntu

在Ubuntu中使用diff来对比文件差异,但是不是很好用,尤其是着色方面,用起来很麻烦,因此可以安装colordiff。 我们有两个文件file1和file2,使用命令 colordiff file1 file2 -y -B -W 140就可以对比文件差异&#xff0c…

帮助你成为高手的视频和资料

1. 为什么大多数人不会真正成功 博客链接 视频链接 2. TED演讲:真正拉开你与周围人之家差距的,是自学能力 视频链接 3 埃隆马斯克:第一性原理,少用类比,类比多了就不能抓住本质了 4 如何成为一个顶尖高手 文章链…

【数据结构】快速排序非递归算法及其改进

在学数据结构中排序这一章节的时候,有一道有关快速排序的作业题描述如下: 按下述要求编写快速排序的非递归算法: 定义一个栈(或队列),把整个序列的上、下界入栈(或队列)。当栈&#…

【数据结构】对快速排序原理的理解(图解,通俗易懂)

学习数据结构时,书本上直接给出了快速排序的过程以及代码,对其原理解释的不够详细,琢磨代码后,发现其原理其实十分简单,简述如下: (1)在待排序列中找一个“中枢元素”(书…

【离散数学】图论基础知识

文章目录1 图的基本概念2 图的连通性3 图的矩阵表示4 几种特殊的图4.1 二部图4.2 欧拉图4.3 哈密顿图4.4 平面图5 无向树6 生成树1 图的基本概念 无向图: 简而言之,边不带方向的图就是无向图。 有向图: 简而言之,边带方向的图就…

【运筹与优化】单纯形法解线性规划问题(matlab实现)

文章目录单纯形法步骤:1.将线性规划问题化为标准形式2.列出单纯形表3.进行最优性检验4.从一个基可行解转换到另一个目标值更大的基可行解,列出新的单纯形表5.重复3、4直到计算结束为止举例单纯形法matlab实现单纯形法是一种解线性规划问题的算法&#xf…

【Linux系统编程学习】 GCC编译器

此为牛客网Linux C课程1.2&1.3的课程笔记。 0. 简介 1. gcc和g的安装 sudo apt install gcc g2. gcc常用参数选项 3. gcc工作流程 首先是预处理器对源代码进行预处理(后缀名.i),主要做以下事情: 把头文件加入到源代码当中删…

Spring5底层原理之BeanFactory与ApplicationContext

目录 BeanFactory与ApplicationContext BeanFactory ApplicationContext 容器实现 BeanFactory实现 ApplicationContext实现 ClassPathXmlApplicationContext的实现 AnnotationConfigApplicationContext的实现 AnnotationConfigServletWebServerApplicationContext的实…

【Linux系统编程学习】 静态库的制作与使用

此为牛客网Linux C课程 1.4&1.5 的课程笔记。 0. 关于静态库与动态库 库就是封装好的、可服用的代码,而静态和动态是指链接。 这节课讲的是静态库,是指在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中&…

【Linux系统编程学习】 动态库的制作与使用

此为牛客网Linux C课程1.6&1.7 的课程笔记。 1. 动态库命名规则 2. 动态库的制作 第一步,用gcc编译生成.o目标文件,注意要用-fpic参数生成与位置无关的代码; 第二步,用gcc的-shared参数生成动态库。 涉及到的两个参数之前学过…

【Linux系统编程学习】 静态库与动态库的对比与总结

此为牛客网Linux C课程 1.9 的课程笔记。 1. 前几节课知识总结 程序编译成为可执行文件的过程: 静态库制作过程: 动态库制作过程: 2. 静态库的优缺点: 3. 动态库的优缺点: 更多可参考:吴秦&#xff1…

【Linux系统编程学习】 Makefile简单入门

此为牛客网Linux C课程1.10&1.11&1.12 的课程笔记。 0. Makefile介绍 1. Makefile文件命名与规则 示例: 使用vim编写如下名为Makefile的文件: app:sub.o add.o mult.o div.o main.ogcc sub.o add.o mult.o div.o main.o -o appsub.o:sub.cgcc …

【Linux系统编程学习】 GDB调试器的简单使用

此为牛客网Linux C课程 1.13&1.14&1.15&1.16 的课程笔记。 0. GDB简介 1. 准备工作 想要使用gdb调试,首先需要用gcc的-g参数生成可执行文件,这样才能在可执行文件中加入源代码信息以便调试,但是注意这并不是将源文件嵌入到可执行…

【Linux系统编程学习】C库IO函数与系统IO函数的关系

此为黑马Linux课程笔记。 1. C标准IO函数工作流程 如图,以C库函数的fopen为例,其返回类型是FILE类型的指针,FILE类型包含很多内容,主要包含三个内容:文件描述符、文件读写指针的位置和I/O缓冲区的地址。 文件描述符&…

【Linux系统编程学习】 文件描述符

此为牛客网Linux C课程1.19课程笔记。 1. 文件描述符表 如图,我们知道每个进程都有其虚拟地址空间(0~4G),其中3 ~ 4G部分为内核区。进程的进程控制块保存就在内核区,而PCB中维护一个打开文件描述符表,每个…

【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

此为牛客网Linux C课程1.20课程笔记。 1.open函数 open函数有两种&#xff0c;分别是打开一个已经存在的文件和创建并打开一个不存在的文件。 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>// 打开一个已经存在的文件 int open(const…