从汇编层看64位程序运行——栈帧(Stack Frame)边界

大纲

  • RBP,RSP
  • 栈帧边界
  • 总结
  • 参考资料

在《从汇编层看64位程序运行——栈帧(Stack Frame)入门》中,我们简单介绍了栈帧的概念,以及它和函数调用之间的关系。如文中所述,栈帧是一种虚拟的概念,它表达了一个执行中的函数的栈空间区域。在这个区域中,该函数的局部非静态变量便被置于这个空间中,即我们常常说起的栈上变量。

那么这个区间是通过什么划分的?

RBP,RSP

这就需要引入寄存器这个概念。

寄存器(Register)是中央处理器内用来暂存指令、数据和地址的存储器。 寄存器的存贮容量有限,读写速度非常快。 在计算机体系结构里,寄存器存储在已知时间点所作计算的中间结果,通过快速地访问数据来加速计算机程序的执行。

CPU有非常多的寄存器,本节我们主要讲解与栈帧相关的两个寄存器:

  • 栈底指针寄存器(Stack Base pointer register): 在16位系统中,有个寄存器叫bp;在32位系统中,这个寄存器叫ebp;在64位系统中,这个寄存器叫rbp。
  • 栈顶指针寄存器(Stack pointer register): 在16位系统中,有个寄存器叫sp;在32位系统中,这个寄存器叫esp;在64位系统中,这个寄存器叫rsp。

需要注意的是,栈底指针寄存器(rbp)保存的并不是当前栈帧的栈底地址,而是保存了栈上变量分配的起始地址
如下图,0x7fffffffdf20到0x7fffffffdf10是main函数栈帧的部分,它保存了函数调用需要用到的一些信息(我们在《从汇编层看64位程序运行——函数的调用和栈平衡》将会介绍)。从0x7fffffffdf10开始的内存,保存的是main函数局部非静态变量的值。
在这里插入图片描述
栈顶指针寄存器(rsp)不仅可以被直接设置,还会随着栈上Push和Pop的操作而改变。这个特性和rbp有很大不同,rbp只能直接被设置,栈上Push和Pop操作并不会直接导致rbp的值发生变动。
如果函数有局部非静态变量,则在函数开始时,编译器会计算好这个函数需要的局部变量空间,然后通过调整rsp的值(值变小,即栈增长),来声明当前函数的栈上变量空间。
比如下面代码的反汇编,在汇编代码的+8行,通过sub $0x10,%rsp,让当前函数的栈扩展了0x10个字节。

int main() {int b = 16;b = b + 16;foo();return 0;
}

在这里插入图片描述

栈帧边界

有了上述的铺垫,我们通过info stack和info frame来查看到程序运行到foo函数时的栈帧
在这里插入图片描述
可以看到一个函数的栈帧起始地址是上一个栈帧的rsp,栈帧结束地址该函数进入下一栈帧前的rsp
在这里插入图片描述
需要注意的是“该函数进入下一栈帧前的rsp并不一定等于局部变量空间的最后一个地址
因为在局部变量空间之后,调用者函数可能还需要将一些参数Push到栈中,从而传递给调用者。这个时候rsp会继续扩张。于是栈帧的结束地址也在扩张。关于这块知识我们可以在《从汇编层看64位程序运行——参数传递的底层实现》中看到。
正因为存在需要使用栈来给不同函数传递参数的情况,让一个函数的栈帧的结束地址是持续变化的。比如一个函数调用的A,需要栈上传递1个参数;这个函数调用的B,需要栈上传递2个参数。那么相较于进入A函数,进入B函数时调用者函数的栈帧就要更大些(大1个参数空间)。
如下图main函数的栈帧在它调用不同函数时,其栈帧的结束地址是持续变化的。
在这里插入图片描述

总结

  • 栈帧运行时虚拟的结构。
  • 函数的栈帧起始地址是调用者调用本函数时RSP的值。
  • 函数的栈帧的结束地址分为两种情况:
    • 有调用其他函数时。结束地址是调用其他函数时RSP的值。
    • 没有调用其他函数时。结束地址是栈上最后一个变量的结束地址。
  • 栈帧的结束地址可能会随着其调用其他函数而不停改变。

参考资料

  • https://www.eecg.utoronto.ca/~amza/www.mindsec.com/files/x86regs.html

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

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

相关文章

CSS盒子模型 综合案例(产品布局模块)

(期末周结束啦,暑假到来,又可以继续更新了呢!💖希望大家多多支持。大家好,时隔一段日子今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕&…

Python 使用 pip 安装 模块失败error: subprocess-exited-with-error 问题解决

今天安装了一个新版本的python,需要安装matplotlib包,死活安装不上,气死了,离线包都安装包不上,一直提示error: subprocess-exited-with-error。 翻看了很多资料,发现似乎是版本不匹配的原因,然…

十三、(正点原子)Linux自带的LED灯驱动

Linux 内核已经集成了像 LED 灯这样非常基础的设备驱动。Linux 内核的 LED 灯驱动采用platform 框架,因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可。 一、Linux内核自带LED驱动使能 要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核&a…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务,支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远,需要考虑的因素增多, 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护,并向全社会…

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题: 有时在 Postgres 上部署 Rails 应用程序时,可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…

《基于 LatentFactor + Redis + ES 实现动态药房分配方法》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,欢迎多多交流。&am…

从Centos7升级到Rocky linux 9后,网卡连接显示‘Wired connection 1‘问题解决方法

问题描述 从Centos7升级到Rocky9后, 发现网卡eth0的IP不正确。通过nmcli查看网卡连接,找不到name为eth0的连接,只显示’Wired connection 1’ 查看/etc/NetworkManager/system-connections/,发现找不到网卡配置文件。 原因分析 centos7使…

5G RedCap调查报告

一、5G RedCap技术背景 5G RedCap(Reduced Capability缩写,轻量化5G),是3GPP标准化组织定义下的5G裁剪版本,是5G面向中高速率连接场景的物联网技术,它的能力介于5G NR(含eMBB和uRLLC)和LPWA(如LTE-M和NR-IoT)之间,如图1所示,是5G-A(5G Advanced)的关键技术之一。…

PHP中的函数与调用:深入解析与应用

目录 一、函数基础 1.1 函数的概念 1.2 函数的定义 1.3 函数的调用 二、PHP函数的分类 2.1 内置函数 2.2 用户自定义函数 2.3 匿名函数 2.4 递归函数 2.5 回调函数 2.6 魔术方法 三、函数的参数与返回值 3.1 参数传递 3.2 返回值 四、函数的高级特性 4.1 可变函…

在linux中查找 / 目录下的以.jar结尾的文件(find / -name *.jar)

文章目录 1、查找 / 目录下的以.jar结尾的文件 1、查找 / 目录下的以.jar结尾的文件 [rootiZuf6332h890vozldoxcprZ ~]# find / -name *.jar /etc/java/java-1.8.0-openjdk/java-1.8.0-openjdk-1.8.0.342.b07-1.el9_0.x86_64/lib/security/policy/limited/US_export_policy.ja…

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)

文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考: python 合并 ts 视频(三种方法)使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法: 调用…

设计模式8-桥模式

设计模式8-Bridge 桥模式 由来与目的模式定义结构桥接模式的结构结构说明 代码推导1. 类和接口的定义2. 平台实现3. 业务抽象4. 使用示例总结1. 类数量过多,复杂度高2. 代码重复3. 不符合单一职责原则4. 缺乏扩展性改进后的设计1. 抽象和实现分离(桥接模…

【云岚到家】-day05-6-项目迁移-门户-CMS

【云岚到家】-day05-6-项目迁移-门户-CMS 4 项目迁移-门户4.1 迁移目标4.2 能力基础4.2.1 缓存方案设计与应用能力4.2.2 静态化技术应用能力 4.3 需求分析4.3.1 界面原型 4.4 系统设计4.4.1 表设计4.4.2 接口与方案4.4.2.1 首页信息查询接口4.4.3.1 数据缓存方案4.4.3.2 页面静…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理,进程管理,定时任务,软件包管理的命令的使用 磁盘管理类命令 du du 目录名: 查看文件和目录占用的磁盘空间 参数: -h:可以看到大小的单位,g,mb-a:还可以看到文…

红色文化3D虚拟数字展馆搭建意义深远

在房地产与土地市场的浪潮中,无论是新城规划、乡村振兴,还是商圈建设,借助VR全景制作、虚拟现实和web3d开发技术打造的全链条无缝VR看房新体验。不仅极大提升了带看与成交的转化率,更让购房者足不出户,即可享受身临其境…

毕设项目springboot+vue实现的在线求职平台

一、前言 随着信息技术的飞速发展和互联网的普及,线上求职已成为众多求职者和企业招聘的重要渠道。为满足市场需求,我们利用Spring Boot和Vue技术栈,开发了一款功能全面、用户友好的在线求职平台。本文将对该平台的设计、实现及关键技术进行详…

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持,成为了自动化脚本编写的首选语言之一。在这篇文章中,我们将探索如何使用Python来编写自动化脚本,以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…

昇思25天学习打卡营第15天|基于MobileNetv2的垃圾分类

一、关于MobileNetv2 MobileNet网络专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小幅度降低的前提下,大大减小了模型参数与运算量。并引入宽度系数 α和…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)

概述 在先前探讨的文章中,我们构建了一个全面的数据测试体系,该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板,以直观展现分析结果,正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…