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

函数执行中的栈和寄存器调用

函数执行中的栈和寄存器调用

函数执行过程中主要用到的寄存器有程序计数器和栈指针。

程序计数器(IP):指向下一条执行指令的地址,其值用%rip来表示

栈指针:指向栈顶地址,其值用%rsp来表示

当过程P调用过程Q时,其栈帧结构可能如下图所示:

在这里插入图片描述

地址转移

注意:当过程P调用过程Q时,会将返回地址压入栈中,从而确定当执行完Q后在哪个地址继续运行,而这个返回地址是P的栈帧的一部分。在x86-64中,用指令call Q来记录。这个指令会把返回地址压入栈中,并将程序计数器设为过程Q的起始地址。而在x86-64中,指令ret会从栈中弹出返回地址,并把程序计数器的值设为该返回地址。

在这里插入图片描述

数据传输

过程P最多可以通过寄存器向Q传递6个整数值,如果过程的参数小于等于6个,那么所有参数都可以通过寄存器来传递,而如果大于6个则需要额外分配栈帧来保存参数。如上图,参数数量n>6,则P分配的栈帧需要容纳7到n号参数,即为P的参数构造区。对于函数:

在这里插入图片描述

其栈帧结构为:

在这里插入图片描述

对于过程P,其对多个参数过程Q的栈帧调用过程可以总结为:

  1. 移动栈顶指针,为变量分配内存(遵循内存对齐原则)
  2. 对于前六个参数,设置其对应寄存器的值
  3. 对于其他参数,将其表示为栈顶指针+偏移量

对于不同位置和大小的参数,其和寄存器的对应关系为:

在这里插入图片描述

寄存器的局部存储空间

由于寄存器组是唯一被所有过程共享的资源,因此需要确保在过程之间进行调用时不会出现寄存器覆盖情况。为此x86-64采用了一组同一的寄存器使用惯例。

被调用者保存寄存器:过程P调用过程Q时,Q必须保存这些寄存器的值,保证它们的值在Q返回到P时与Q被调用时是一样的。(将其保存到Q的栈帧上)

调用者保存寄存器:除了被调用者保存寄存器和栈指针以外所有其他的寄存器,这意味着任何函数都能修改它们。

参考文献

《深入理解计算机系统(第三版)》

相关文章:

  • SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)
  • 【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
  • 大白话实战Gateway
  • 如何优化企业网络架构以提高性能和安全性?
  • Mac 清理缓存,提高内存空间
  • VTK 距离可视化 PolyDataDistance DistancePolyDataFilter
  • 使用 FFmpeg 剪辑视频指南
  • 分布式光纤声波振动技术在钻井泄漏检测中的应用
  • 【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
  • 在PyCharm中运行Jupyter Notebook的.ipynb文件及其pycharm软件的基础使用
  • 前端循环全解析:JS/ES/TS 循环写法与实战示例
  • windows解压多个文件夹内的zip文件脚本
  • 计算机三级网络技术知识汇总【4】
  • 1005 K 次取反后最大化的数组和(贪心)
  • Electron通过ffi-napi调用dll导出接口
  • MacOS安装Emacs
  • 【Mermaid图表渲染错误分析与解决方案之关键字错误】
  • 读书笔记:要点提炼《基于大模型的RAG应用开发与优化——构建企业级LLM应用》(严灿平)
  • 计算机科学与技术
  • GPT2 模型训练
  • 审议民营经济促进法草案等,十四届全国人大常委会第十五次会议将举行
  • 安徽铁塔再通报“会议室不雅行为”事件:涉事员工停职检查
  • 帕力旦·吐尔逊已任喀什大学党委副书记、校长
  • 三亚亚龙湾3.4公里岸线近岸海域使用权挂牌出让,起始价近九千万
  • 湖南永州公安全面推行“项目警官制”,为重点项目建设护航
  • 刺激视网膜可让人“看”到全新颜色