码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 函数栈的变化过程


    C++调用函数在内存管理中的过程就是新建一个函数栈,里面保存了函数返回值,寄存器的备份(rbp),局部变量,函数参数。调用结束后栈空间销毁,回到调用的函数继续执行下面的代码。

    在这里插入图片描述

    下面说几个要点。
    首先要了解寄存器的作用。
    rbp保存函数栈底指针,rsp保存函数栈顶指针,
    rdi、rsi、rdx、rcx、r8、r9:调用函数时依次存放第1到第6个参数,若多于6个的参数则会被压入栈。
    rip保存返回地址。
    rax保存返回值。

    我们从调用开始到调用结束一步步分析一下:(假设main函数调用add函数)
    当我们调用函数时,栈的变化如下:
    1、首先,会将原函数main函数的返回地址压入栈中,返回地址就是add函数下一条指令的地址,因为函数返回后就要执行这个指令了。
    2、将原函数main的rbp栈底指针入栈,因为函数返回后还要维护main函数的栈底指针,main函数并没有执行完成。
    3、将栈顶指针rsp的值赋给rbp,然后将栈顶指针减去一定的数值,为新的函数开辟空间。这里要注意,栈顶指针永远指向栈顶,所以当把rsp赋给rbp时,rbp已经指向原来main的栈顶+返回地址+main的rbp了那个位置了。

    4、上面都是准备工作,接下来就是在那段空间进行一系列操作。比如存储函数参数的值(movl $1 %rbp-4就是将参数1放到栈底的上一个位置,栈是高地址向低地址增长的,所以要减),将值赋给寄存器等。如果有返回值,返回值会放到eax寄存器中。
    5、栈中弹出main函数栈的rbp地址,赋值给rbp寄存器,即恢复main函数的rbp.
    6、leave,RET退出调用。ret指令则是将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序。leave指令相当于将rbp赋给rsp,并把rbp出栈,将里面的值赋给rbp寄存器(相当于步骤5)
    可以看到5,6和2,1是配对的,因为栈是后进先出。
    7.最后还可能有返回值,从eax取出赋给main函数的局部变量处,将eax置零。

  • 相关阅读:
    关于在学习 opengl 时遇到的 bug:在 glBegin 和 glEnd 中间使用 glLineWidth 的问题
    【Oracle】VC6.0使用 odbc 访问 Oracle 存储过程
    【SA8295P 源码分析】100 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态
    【C++音视频开发】初级篇 | 图像基础概念
    stdlib.h
    C语言——概述
    【编程题】【Scratch四级】2022.09 躲避游戏
    windows服务器通过nginx配置https
    百度Echarts实现饼图,较官网示例更多项显示
    给大家看下刚薅的阿里云99元服务器CPU性能如何?
  • 原文地址:https://blog.csdn.net/weixin_53344209/article/details/126720487
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号