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

【CPU】堆栈和堆栈指针(个人草稿)

详细的 CPU 中堆栈指针(Stack Pointer, SP)及相关知识介绍

1. 什么是堆栈?

堆栈(Stack) 是一种后进先出(LIFO, Last In First Out)的数据结构,广泛用于计算机系统中,尤其是在程序执行过程中管理函数调用、局部变量、返回地址等。堆栈通常位于内存的特定区域,称为 堆栈段栈区

  • 特性
    • 后进先出(LIFO):最后入栈的数据最先被弹出。
    • 自动管理:大多数编程语言和操作系统会自动管理堆栈的分配和释放,程序员不需要手动操作。
    • 快速访问:由于堆栈的操作(如压栈和弹栈)非常简单,因此访问速度较快。
2. 堆栈指针(Stack Pointer, SP)

堆栈指针(SP) 是一个特殊的寄存器,用于指向当前堆栈的顶部(即最后一个被压入堆栈的数据项)。每次有数据被压入或弹出堆栈时,堆栈指针都会相应地更新,以确保它始终指向堆栈的最新位置。

  • 作用
    • 指示堆栈顶部:SP 寄存器保存了当前堆栈的顶部地址,使得处理器可以快速访问最新的数据。
    • 动态调整:随着程序的执行,函数调用、局部变量的创建和销毁会导致堆栈的大小发生变化,SP 会根据这些变化动态调整。
    • 支持函数调用:在函数调用时,返回地址、参数和局部变量会被压入堆栈,而 SP 会相应地移动。当函数返回时,SP 会恢复到调用前的位置。
3. 堆栈的工作原理

堆栈的工作原理可以通过以下步骤来理解:

  1. 初始化堆栈

    • 在程序启动时,操作系统会为每个进程分配一段内存作为堆栈空间,并将 SP 初始化为该内存区域的顶部(或底部,取决于堆栈的增长方向)。
    • 堆栈通常从高地址向低地址增长(称为 向下生长),但有些架构也可能从低地址向高地址增长(称为 向上生长)。RISC-V 默认采用 向下生长 的堆栈。
  2. 压栈(Push)

    • 当需要将数据压入堆栈时,CPU 会执行 push 指令(或等效操作)。首先,SP 会减小(对于向下生长的堆栈),然后将数据写入新的堆栈顶部。
    • 例如,在 RISC-V 中,sp 寄存器会减去 4 字节(32 位系统)或 8 字节(64 位系统),然后将数据存储到该地址。
  3. 弹栈(Pop)

    • 当需要从堆栈中弹出数据时,CPU 会执行 pop 指令(或等效操作)。首先,从当前堆栈顶部读取数据,然后 SP 会增加(对于向下生长的堆栈),从而恢复到之前的状态。
    • 例如,在 RISC-V 中,sp 寄存器会加上 4 字节(32 位系统)或 8 字节(64 位系统),然后从该地址读取数据。
  4. 函数调用与返回

    • 函数调用:当调用一个函数时,返回地址、参数和局部变量会被压入堆栈。SP 会相应地移动,指向新的堆栈顶部。
    • 函数返回:当函数执行完毕时,局部变量会被弹出堆栈,返回地址会被恢复,控制流返回到调用者。SP 会恢复到调用前的位置。
4. 堆栈帧(Stack Frame)

堆栈帧 是每次函数调用时在堆栈上创建的一个独立区域,用于存储该函数的局部变量、参数、返回地址等信息。每个函数调用都会创建一个新的堆栈帧,函数返回时会销毁该帧。

  • 堆栈帧的组成
    • 返回地址:函数调用时,返回地址会被压入堆栈,以便在函数执行完毕后能够正确返回到调用点。
    • 参数:函数的参数也会被压入堆栈,供被调用函数使用。
    • 局部变量:函数内部声明的局部变量会被分配在堆栈帧中。
    • 旧的基址指针(Base Pointer, BP):某些架构(如 x86)使用基址指针(BP)来引用堆栈帧中的数据。在进入函数时,旧的 BP 会被保存,新的 BP 会被设置为当前堆栈帧的起始位置。
5. 基址指针(Base Pointer, BP)

基址指针(BP) 是另一个重要的寄存器,通常用于引用当前堆栈帧中的数据。与堆栈指针(SP)不同,BP 通常指向堆栈帧的固定位置,使得函数可以方便地访问参数和局部变量。

  • 作用

    • 引用堆栈帧中的数据:BP 通常指向堆栈帧的起始位置,使得函数可以使用相对偏移量来访问参数和局部变量。这使得代码更加清晰和易于维护。
    • 保存旧的基址指针:在进入函数时,旧的 BP 会被保存到堆栈中,新的 BP 会被设置为当前堆栈帧的起始位置。函数返回时,BP 会恢复到调用前的状态。
  • 示例(x86 架构):

    push ebp        # 保存旧的基址指针
    mov ebp, esp    # 设置新的基址指针
    sub esp, 16     # 为局部变量分配空间
    

    在这段代码中,ebp 被用来引用当前堆栈帧中的数据,而 esp 则继续作为堆栈指针使用。

6. 堆栈溢出(Stack Overflow)

堆栈溢出 是指堆栈的空间被耗尽,导致无法再分配新的堆栈帧或压入更多数据。堆栈溢出通常是由于递归调用过深、局部变量过多或缓冲区溢出引起的。

  • 后果

    • 程序崩溃:如果堆栈溢出,程序可能会崩溃,甚至导致系统不稳定。
    • 安全漏洞:堆栈溢出可能导致缓冲区溢出攻击,黑客可以通过这种漏洞注入恶意代码并执行。
  • 预防措施

    • 限制递归深度:避免过深的递归调用,或者使用迭代代替递归。
    • 检查堆栈大小:在编写代码时,确保堆栈的大小足够大,以容纳所有必要的数据。
    • 使用栈保护机制:现代操作系统和编译器提供了栈保护机制(如栈金丝雀),可以在检测到堆栈溢出时立即终止程序,防止进一步的损害。
7. 堆栈与堆的区别

虽然堆栈和堆都是用于动态内存管理的,但它们的工作方式和用途不同:

  • 堆栈(Stack)

    • 自动管理:堆栈由编译器和操作系统自动管理,程序员不需要手动分配或释放内存。
    • 快速访问:堆栈的操作非常简单,访问速度较快。
    • 有限大小:堆栈的大小是固定的,通常较小,适合存储局部变量、函数调用信息等短期使用的数据。
    • 后进先出(LIFO):堆栈遵循 LIFO 规则,最后入栈的数据最先被弹出。
  • 堆(Heap)

    • 手动管理:堆由程序员手动分配和释放内存,通常使用 mallocfree 等函数。
    • 灵活分配:堆的大小可以根据需要动态扩展,适合存储全局变量、动态分配的对象等长期使用的数据。
    • 无序访问:堆没有固定的顺序,数据可以随意分配和释放。
    • 较慢访问:由于堆的管理较为复杂,访问速度相对较慢。
8. RISC-V 中的堆栈指针

RISC-V 架构中,堆栈指针通常使用 x2 寄存器(也称为 sp),专门用于管理堆栈。RISC-V 的堆栈默认是从高地址向低地址生长(即向下生长),这意味着每次压栈时,sp 会减小;每次弹栈时,sp 会增加。

  • 典型指令
    • 压栈addi sp, sp, -16(将 sp 减少 16 字节,为局部变量分配空间)
    • 弹栈addi sp, sp, 16(将 sp 增加 16 字节,释放局部变量占用的空间)
    • 保存返回地址sw ra, 0(sp)(将返回地址保存到堆栈顶部)
    • 恢复返回地址lw ra, 0(sp)(从堆栈顶部恢复返回地址)
9. 总结
  • 堆栈 是一种后进先出(LIFO)的数据结构,广泛用于管理函数调用、局部变量和返回地址。
  • 堆栈指针(SP) 是一个特殊的寄存器,用于指向当前堆栈的顶部。它会随着数据的压栈和弹栈操作动态调整。
  • 堆栈帧 是每次函数调用时在堆栈上创建的一个独立区域,用于存储函数的局部变量、参数和返回地址。
  • 基址指针(BP) 用于引用堆栈帧中的数据,使得函数可以方便地访问参数和局部变量。
  • 堆栈溢出 是指堆栈空间耗尽,可能导致程序崩溃或安全漏洞。应采取适当的预防措施,如限制递归深度和使用栈保护机制。
  • 堆栈与堆 的主要区别在于堆栈是自动管理的、快速访问的,而堆是手动管理的、灵活分配的。

希望这个详细的介绍能帮助你更好地理解 CPU 中的堆栈指针及其相关概念。如果你有任何具体问题或需要进一步的解释,欢迎继续提问! 😊

相关文章:

【CPU】堆栈和堆栈指针(个人草稿)

详细的 CPU 中堆栈指针(Stack Pointer, SP)及相关知识介绍 1. 什么是堆栈? 堆栈(Stack) 是一种后进先出(LIFO, Last In First Out)的数据结构,广泛用于计算机系统中,尤…...

BMS应用软件开发 — 2 单体电池的基本结构和工作原理

目录 1 单体电池基本组成 2 单体电池封装形式 3 电池充放电过程 4 不同电池材料性能差异 1 单体电池基本组成 单体电池其基本组成包括以下几个关键部分: 正极:正极材料通常由锂的金属氧化物构成,如锂钴氧化物(LiCoO2&#xf…...

uni-app开发-习惯养成小程序/app介绍

目录 一:功能概述 二:功能部分代码和截图 一:功能概述 1 习惯目标生成 创建习惯:用户可以添加新的习惯目标,每个习惯可以包含名称、描述、图标、目标天数。 关联习惯完成:用户通过设定达成目标以后,生成习惯养成记录。 2 习惯打卡 简单快捷的打卡:提供一个直观的界面…...

鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理

文章目录 一、call模块(拨打电话)1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块(短信服务)1、创建短信2、发送短信 三、radio模块(网络搜索&#x…...

Netty中用了哪些设计模式?

大家好,我是锋哥。今天分享关于【Netty中用了哪些设计模式?】面试题。希望对大家有帮助; Netty中用了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个高性能的网络通信框架,广泛…...

Mac 安装psycopg2出错:Error:pg_config executable not found的解决

在mac 上执行pip3 install psycopg2-binary出现如下错误: Error:pg_config executable not found然后我又到终端里执行 brew install postgresql16 显示 Warning: You are using macOS 15. We do not provide support for this pre-release version. It is expe…...

【vue3封装element-plus的反馈组件el-drawer、el-dialog】

vue2中封装el-drawer、el-dialog这类反馈类子组件,需要将父组件的visible值传递子组件,并且再通过$emit将关闭弹窗的组件值传回父组件,同事子组件还需要监听父组件传递过来的visible的值,来驱动弹窗显示隐藏,很麻烦&am…...

LeetCode:2274. 不含特殊楼层的最大连续楼层数(排序 Java)

目录 2274. 不含特殊楼层的最大连续楼层数 题目描述: 实现代与解析: 排序 原理思路: 2274. 不含特殊楼层的最大连续楼层数 题目描述: Alice 管理着一家公司,并租用大楼的部分楼层作为办公空间。Alice 决定将一些…...

生成树之STP

STP目的 STP:生成树协议,旨在将一个环型网络结构修剪成一个树型的结构,达到防环的作用 STP的步骤 STP有如下几个步骤,选举出四种角色,共同构建起STP生成树 1、开启生成树的交换机,会互相发送BPDU 2、交换…...

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 (…...

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统(HDFS,Hadoop Distributed File System)是Hadoop框架的核心组件之一,它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用命令等…...

Rust:运行调用 Lua 脚本

以下是一个Rust运行Lua脚本的简单例子: 首先,确保你的Rust项目中已经添加了rust-lua库的依赖。可以在Cargo.toml文件中添加以下内容: [dependencies] rust-lua "0.36" # 注意:版本号可能会更新,请根据实…...

PHP语言的数据库编程

PHP语言的数据库编程 引言 随着互联网的发展,各类网站和应用程序如雨后春笋般涌现,数据库作为它们数据存储和管理的核心,扮演着至关重要的角色。PHP作为一种流行的服务器端脚本语言,被广泛应用于Web开发。PHP不仅具有简单易学的…...

Formality:参数化设计的命名规则

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中使用set_top命令设置一个容器的顶层设计(elaborate)时,一个参数化的设计(或者说模块)可能因为其参数覆盖而出现不同…...

xss-labs关卡记录8-14

第八关 还是常规方法&#xff0c;先上传我们常用的试试&#xff0c;onfocus <script> <a hrefjavascript:alert()> 查看源码发现&#xff0c;value这里应该是对我们的<>进行了 处理&#xff0c;然后在href这里&#xff0c;对常用的关键词进行了替换处理&…...

SPSS实现中介效应与调节效应

1. 中介效应 SPSS 实现 本例研究的自变量&#xff08;X&#xff09; “工作不被认同”&#xff1b;中介变量&#xff08;M&#xff09;为“焦虑”&#xff0c;因变量&#xff08;Y&#xff09;为“工作绩效”。探讨焦虑是否在工作不被认同与工作绩效间的作用。 &#xff08;2&…...

计算机的错误计算(二百零三)

摘要 利用两个大模型化简计算 其中一个大模型是数学解题器&#xff0c;它通过化简得出了正确结果&#xff1b;另外一个大模型给出了 Python代码。 例1. 化简计算摘要中算式。 下面是一个数学解题器大模型给的回答。 以上是数学解题器大模型给的回答。 下面是与另外一个大模型…...

【计算机网络】什么是AC和AP?

在现代的无线网络中&#xff0c;AC&#xff08;Access Controller&#xff0c;接入控制器&#xff09;和AP&#xff08;Access Point&#xff0c;无线接入点&#xff09;是两个至关重要的设备&#xff0c;它们在网络的管理、连接和优化中扮演着重要角色。理解它们的功能和区别&…...

python3中函数的参数

一. 简介 前面学习了Python3中函数的语法规则&#xff0c;文章如下&#xff1a; python3中函数的语法规则-CSDN博客 本文继续学习python中函数的参数。调用函数时可使用的正式参数类型&#xff1a; 必需参数&#xff0c;关键字参数&#xff0c;默认参数&#xff0c;不定长参…...

数据仓库建设方案和经验总结

在做数据集成的过程中&#xff0c;往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中&#xff0c;对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理&#xff0c;造成资源和人力的浪费。同时&#xff0c;目前的系统架构&#xff0c;无…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...