当前位置: 首页 > news >正文

图解函数调用过程(函数栈帧)

补充知识

  1. ebp(base pointer),esp(stack pointer)是存放当前正在被执行的函数的栈底和栈顶指针的寄存器。
  2. 汇编代码中,通常用函数的名字作为标号(标号的位置是转移指令的目的地,标号作为转移的锚点)。
  3. push x指令:先将esp -"1"(1代表的不是数字1,而是一个最小单元),然后把x的值复制到esp指向的内存块中。
  4. pop x 指令:先将esp指向的内存块的内容赋值给x,然后esp+"1"。
  5. 访问函数栈中的数据有两种方法,一种是push,pop,还有一种就是直接用ebp,esp加减常数访问函数栈内的地址
  6. X86处理器中PC(program pointer)也叫IP(instruction pointer)。

研究对象

假设main函数调用caller,caller调用add,函数栈每一块内存块假设是4字节。以下是caller和add函数的c语言代码以及汇编代码,以及函数调用栈的开始状态。

    研究过程

    将main函数的栈底指针存放在caller函数的栈底

      把temp1,temp2放到函数栈,并提前预留出存放结果的sum变量的位置。

        为add函数的调用准备参数,参数的存放在调用者栈顶的部分。(下图中所说的PC是要说明,实际上,每个调用者都会在自己的函数栈存放调用前一刻的PC指针,这样调用者可以在调用结束后知道从哪儿继续执行剩下的代码)

          存放PC指针,修改PC指针

            同样的,add函数也要存放caller函数的栈底指针,就像caller函数的在栈底存放main函数的栈底指针一样

              执行add函数,并获取返回值

                下图move esp,ebp中esp和ebp代表的是寄存器,不是寄存器里面的指针所指向的函数栈里的内存块。这个命令就是让esp和ebp都指向栈底。

                pop指令执行后正好回到了调用者的函数栈

                  将caller函数栈顶的PC指针弹出到PC寄存器里,这样,计算机就会继续执行add函数调用下面的代码。

                    从eax寄存器中获取返回值,并放入提前预留好的sum的位置上

                      用寄存器保存caller的返回值,销毁caller函数栈,回到main函数栈。

                      结论

                      一个栈帧可能包含哪些东西

                      栈帧的特点

                      函数调用过程

                      http://www.lryc.cn/news/581882.html

                      相关文章:

                    1. MongoDB与Spring Boot完整使用指南
                    2. windows grpcurl
                    3. Python脚本保护工具库之pyarmor使用详解
                    4. Rust 所有权系统:深入浅出指南
                    5. Linux运维安全新范式:基于TCPIP与SSH密钥的无密码认证实战
                    6. Vite 常用配置详解
                    7. 嵌入式数据库sqlite测试程序
                    8. 数据结构之树,二叉树,二叉搜索树
                    9. Chatbox➕知识库➕Mcp = 机器学习私人语音助手
                    10. C++ --- list的简单实现
                    11. 当“漏洞”成为双刃剑——合法披露与非法交易的生死线在哪里?
                    12. javaweb———html
                    13. 系统性红斑狼疮治疗靶点CD303
                    14. 1. http 有哪些版本,你是用的哪个版本,怎么查看
                    15. 在Ubuntu主机中修改ARM Linux开发板的根文件系统
                    16. RSTP 拓扑收敛机制
                    17. IRF堆叠技术的主要优势
                    18. 操作系统王道考研习题
                    19. HCIA-生成数协议(STP)
                    20. uniapp实现的多种时间线模板
                    21. DolphinScheduler 3.2.0 后端开发环境搭建指南
                    22. Vue计算属性(computed)全面解析:原理、用法与最佳实践
                    23. 多级缓存如何应用
                    24. C++高频知识点(二)
                    25. 【Pyhton】文件读取:读取整个(大型)文件
                    26. 铸造软件交付的“自动驾驶”系统——AI大模型如何引爆DevOps革命
                    27. mybatis-plus从入门到入土(二):单元测试
                    28. 深度学习图像分类数据集—蘑菇识别分类
                    29. 利用近距离全景图像进行树状结构骨架化
                    30. 每天一个前端小知识 Day 23 - PWA 渐进式 Web 应用开发