栈帧 stack frame

每一次函数调用都会维护一个栈帧(stack frame),栈帧主要用于传递参数、保存返回地址、保存局部变量等。先直接上一个《深入理解计算机系统》上的原图。

其中,%rsp 指向栈顶位置,%rbp 指向栈底位置。并且栈是由高地址向地址方向增长。

局部变量的布局是由编译器决定的,可能是由个高地址到低地址,也可能由低地址到高地址。

被调函数的前6个参数将由寄存器传入,超过6个的部分将通过栈传入。这里需要注意的是,在被调函数中为了能够对入参进行取地址,被调函数将会将前6个参数压入被调函数的栈中。

函数调用过程:

  1. 参数入栈。将参数按照一定的顺序将超过6个后的参数入栈。
  2. 返回地址入栈。将当前代码的一条指令地址压入栈中,函数返回时继续执行。
  3. 跳入被调函数地址。
  4. EBP入栈,保存当前栈帧状态值。
  5. ESP值赋给EBP。
  6. 分配当前栈帧。

函数返回过程:

  1. 保存被调用函数的返回值到 EAX 寄存器中。
  2. 恢复 ESP。
  3. 将被调函数底部保存的调用函数栈帧EBP值弹入EBP寄存器,恢复调用函数栈帧。
  4. 弹出当前栈顶元素,从栈中取到返回地址。

下面以一个例子来验证下栈帧布局:

先进入 main 函数的 func 函数调用点:

%rbp 值为 0x7fffffffe110,%rsp 的值为 0x7fffffffe0f0。在根据反汇编可以得到下一条指令的地址为 0x4008f4。根据这些信息我们可以推出 main 函数和 func 函数的栈帧如下:

以上栈帧信息可以dgb调试时候打印验证:


参考:

  • 深入理解计算机系统

栈帧 stack frame相关推荐

  1. 浅谈函数栈帧(Stack Frame)

  2. JVM -- 运行时栈帧结构简介

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  3. vs调用堆栈窗口怎么弄出来_从零开始(1)栈帧、调用约定

    逆向学习从零开始(1)栈帧.调用约定明白函数和寄存器.栈的关系 PE程序拖入OD有四个基础窗口:代码执行窗口.寄存器窗口.数据窗口.栈窗口,帮助我们对程序进行逆向分析,运行程序,处理器执行的是汇编代码 ...

  4. JVM运行时栈帧结构

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36367789/article/details/81711223 栈帧(Stack Frame ...

  5. JVM内存模型:运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  6. 内存分区与栈帧使用分析

    转载自:https://blog.csdn.net/zhongguoren666/article/details/7586074 函数调用是程序设计中的重要环节,也是程序员应聘时常被问及的,本文就函数 ...

  7. C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)

    C++ 函数调用过程中栈区的变化 1.C++ 函数调用过程中栈区的变化 1.1.程序的内存分布 1.2.函数调用过程中栈的变化解析 参考 1.C++ 函数调用过程中栈区的变化 1.1.程序的内存分布 ...

  8. 运行时栈帧结构是怎样的?

    写在前面 本文隶属于专栏<100个问题搞定Java虚拟机>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java ...

  9. C++ 反汇编/栈帧

    文章目录 查看 C++ ASM 在线 C++ 反汇编 g++ -S VS 调试时断点查看反汇编信息 VS 在项目属性的文件输出源码+汇编 Debug 下的:[ProjectName].asm Rele ...

  10. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

最新文章

  1. 中山大学计算机学院运动会,中山大学2019年运动会.PDF
  2. Python解决NameError: name ‘reload‘ is not defined的问题
  3. linux 小白启航之路-搭建linuxDHCP中继服务器
  4. mac下在eclipse中怎样清除/切换svn
  5. hp380g5 安装linux7,hp 380G5 安装centos 7
  6. 印象笔记打开错误_只会用手机自带便签?这三款笔记软件分分钟秒杀
  7. 惠普ELITE X2 1012 G1平板拆机记录
  8. bu zhi dao yao zen me zuo
  9. [oracle]Oracle数据库安全管理
  10. jmeter性能测试各个方法介绍
  11. 我吐了72行金色爱心代码(༗清ཻ辞ཻ࿐入门原创)———永远清楚,不是只有你一个人在努力
  12. Drawio免费绘图工具
  13. 实时云渲染和本地渲染的区别
  14. Open3D 常见几何图形构建
  15. Median Pyramid Hard题解
  16. jsvascript === 和==的区别
  17. 人工智能行业调查研究报告(算法导论调查研究报告)
  18. 电信宽带免费提速到200M!不用安装小翼管家!
  19. MCU多功能遥测终端机RTU的特点和应用知多少?
  20. 论文写作公式使用 MacOS+Word+Mythtype 7

热门文章

  1. 2022年下半年网络工程师上午真题及答案解析
  2. 使用Foxmail 登录qq邮箱使用第三发授权码登录失败
  3. 邮箱注册的html怎么写,邮箱格式怎么写 邮箱的正确写法
  4. 有限域GF(2^8).md
  5. 汽车行业DMS系统介绍
  6. layim之创建群聊
  7. 哥德巴赫猜想C++实现
  8. java里偶数奇数怎么表示_【java奇数偶数】
  9. 西方文化系列讲座之希腊文化(下)
  10. 100以内的平方数记忆法