从汇编层看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函数栈帧的部分,它保存了函数调用需要用到的一些信息(我们在《》将会介绍)。从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会继续扩张。于是栈帧的结束地址也在扩张。关于这块知识我们可以在《》中看到。
正因为存在需要使用栈来给不同函数传递参数的情况,让一个函数的栈帧的结束地址是持续变化的。比如一个函数调用的A,需要栈上传递1个参数;这个函数调用的B,需要栈上传递2个参数。那么相较于进入A函数,进入B函数时调用者函数的栈帧就要更大些(大1个参数空间)。
如下图main函数的栈帧在它调用不同函数时,其栈帧的结束地址是持续变化的。
在这里插入图片描述

总结

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

参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…

细说MCU用定时器控制ADC采样频率的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、 建立工程 1.选择时钟源和Debug模式 2.配置系统时钟和ADC时钟 3.配置串口 4.配置ADC 5.设置TIM3 6.设置TIM4 7.配置中断 8.GPIO 四、代码修改 1.重新定义ADC回调函数 2.在主程序中编写数据发送代码 3.使能ADC和…

如何从gitlab删除仓库

嗨,我是兰若姐姐。今天发现gitlab上有些仓库的代码没有用,是个多余的仓库,想要删掉,经过一番操作之后,成功的删除了,git上没有 多余的仓库,看着干净舒服很多,现在把删除的过程分享出…

PostgreSQL 怎样处理数据仓库中维度表和事实表的关联性能?

文章目录 PostgreSQL 中维度表和事实表关联性能的处理 PostgreSQL 中维度表和事实表关联性能的处理 在数据仓库的领域中,PostgreSQL 作为一款强大的关系型数据库管理系统,对于处理维度表和事实表的关联性能是一个关键的问题。维度表和事实表的关联是数据…

数学建模--数据统计类赛题分析~~神经网络引入

1.缺失值的处理 (1)像在下面的这个表格里面,这个对于缺失的数据,我们需要分情况进行分析,如果这个数据就是一个数值型的数据,我们可以使用平均值进行处理; (2)对于这个…

Linux--USB驱动开发(二)USB总线程序

一、USB总线驱动程序的作用 a)识别USB设备 1.1 分配地址 1.2 并告诉USB设备(set address) 1.3 发出命令获取描述符 b)查找并安装对应的设备驱动程序 c)提供USB读写函数 二、USB设备工作流程 由于内核自带了USB驱动,所以我们先插入一个U…

【漏洞复现】飞企互联-FE企业运营管理平台 uploadAttachmentServlet—文件上传漏洞

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 企互联-FE企业运营管理平台是一个利用云计算、人工智能、大数据、物联网和移动互联网等现代技术构建的云…

不会编程怎么办?量化交易不会编程可以使用吗?

量化交易使用计算机模型程序代替人工进行交易,一般需要投资者自己编写程序建模,然后回测无误之后再进行实盘交易,那么不会编程的投资者能使用量化软件进行量化交易吗? 不会编程使用量化软件有两种方法 一种是请人代写代码&#x…

使用 Apache Pulsar 构建弹性可扩展的事件驱动应用

本视频来自 2024 Apache Pulsar 欧洲峰会,由 David Kjerrumgaard, 《Pulsar in Action》书作者给大家带来的《使用 Apache Pulsar 构建弹性可扩展的事件驱动应用》分享。 嘉宾|David Kjerrumgaard,Apache Pulsar Committer,《Pul…

音视频开发—使用FFmpeg从纯H264码流中提取图片 C语言实现

文章目录 1.H264码流文件解码流程关键流程详细解码流程详细步骤解析 2.JPEG编码流程详细编码流程详细步骤解析 3.完整示例代码4.效果展示 从纯H.264码流中提取图片的过程包括解码和JPEG编码两个主要步骤,以下是详细阐述 1.H264码流文件解码流程 关键流程 查找编解…

css横向滚动条支持鼠标滚轮

在做视频会议的时候&#xff0c;标准模式视图会有顶部收缩的一种交互方式&#xff0c;用到了横向滚动&#xff1b;一般情况下鼠标滚轮只支持竖向滚动&#xff0c;这次写个demo是适配横向滚动&#xff1b; 效果图展示 实现横向滚动条顶部显示 <div className{style.remote_u…

手机和电脑通过TCP传输

一.工具 手机端&#xff1a;网络调试精灵 电脑端&#xff1a;野火网络调试助手 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信…

Qt QChart 曲线图表操作

学习目标&#xff1a;QChart 曲线图表操作 学习内容 QT中的QChart类提供了一个功能强大的图表绘制框架,可以根据需求方便高效地绘制各种类型的图表,主要特点如下: 支持多种常见图表类型,如线图、条形图、饼图、散点图等各种类型。开发者只需要选择合适的图表类和数据即可绘制…

MT6825磁编码IC在智能双旋机器人中的应用

MT6825磁编码IC在智能双旋机器人中的应用&#xff0c;无疑为这一领域的创新和发展注入了新的活力。作为一款高性能的磁性位置传感器&#xff0c;MT6825以其独特的优势&#xff0c;在智能双旋机器人的运动控制、定位精度以及系统稳定性等方面发挥了关键作用。 www.abitions.com …

Web3 社交领域的开发技术

Web3 社交领域的开发技术主要包括以下几种&#xff0c;随着 Web3 技术的不断发展&#xff0c;Web3 社交领域将会出现更多新的技术和应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 区块链技术 区块链技术是 Web3 社交的…

Objective-C 自定义渐变色Slider

文章目录 一、前情概要二、具体实现 一、前情概要 系统提供UISlider&#xff0c;但在开发过程中经常需要自定义&#xff0c;本次需求内容是实现一个拥有渐变色的滑动条&#xff0c;且渐变色随着手指touch的位置不同改变区域&#xff0c;类似如下 可以使用CAGradientLayer实现渐…

印尼Facebook直播网络需要达到什么要求?

在全球化浪潮的推动下&#xff0c;海外直播正受到企业、个人和机构的广泛关注和青睐。无论是用于营销、推广还是互动&#xff0c;海外直播为各种组织提供了更多机会和可能性。本文将探讨在进行印尼Facebook直播前&#xff0c;需要满足哪些网络条件以确保直播的质量和用户体验。…

五、 计算机网络(考点篇)

1 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。计算机网络的功能&#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标&#xff1a;速率、带宽(频带宽度或传送线路…

【密码学】实现消息认证或数字签名的几种方式

消息认证的目的是验证消息的完整性和确认消息的来源。数字签名的目的是不仅验证消息的完整性和来源&#xff0c;还提供了不可否认性。此外&#xff0c;数字签名还可以验证消息的创建时间&#xff0c;防止重放攻击。那么具体有哪些实现的方式呢&#xff1f; 一、仅提供消息认证…

RTC纽扣电池方案

目录 一、能量消耗因素分析 1.1 单片机的RTC 1.2 二极管漏电流 1.3 锂纽扣电池自放电 1.4 STM32-ADC监测纽扣电池电压 二、不可充电纽扣电池 三、可充电纽扣电池 一、能量消耗因素分析 1.1 单片机的RTC 如上图是STM32H743IIT6的数据手册截取的VBAT消耗的电流说明&#x…