Linux-C-函数栈-SP寄存器
sp(Stack Pointer,栈指针)是计算机体系结构中一个非常重要的寄存器,下面将详细介绍其作用和原理。
作用
1. 管理栈内存
栈是一种后进先出(LIFO,Last In First Out)的数据结构,在程序运行过程中,栈用于存储局部变量、函数调用的上下文信息(如返回地址、寄存器值等)。sp 寄存器的主要作用就是指向栈顶的位置,通过移动 sp 指针,可以在栈上进行数据的压入(PUSH)和弹出(POP)操作。
2. 支持函数调用
当程序调用一个函数时,需要保存当前的执行上下文(如返回地址、寄存器的值等),以便在函数执行完毕后能够正确返回并恢复现场。这些信息通常会被压入栈中,sp 指针会相应地移动来指示栈顶的新位置。在函数返回时,再从栈中弹出这些信息,sp 指针也会恢复到调用函数之前的位置。
3. 存储局部变量
函数内部定义的局部变量通常也存储在栈上。在函数执行过程中,sp 指针会根据局部变量的大小进行调整,为局部变量分配栈空间。当函数执行完毕后,sp 指针会恢复到原来的位置,释放这些局部变量所占用的栈空间。
原理
1. 栈的生长方向
栈的生长方向在不同的体系结构中可能有所不同,常见的有两种:向下生长(向低地址方向)和向上生长(向高地址方向)。
-
向下生长:大多数现代计算机体系结构(如 ARM、x86 等)采用向下生长的栈。在这种情况下,栈底位于较高的地址,栈顶位于较低的地址。当向栈中压入数据时,
sp指针的值会减小;当从栈中弹出数据时,sp指针的值会增大。 -
向上生长:少数体系结构采用向上生长的栈,栈底位于较低的地址,栈顶位于较高的地址。此时,压入数据时
sp指针的值会增大,弹出数据时sp指针的值会减小。
2. 压栈和出栈操作
以向下生长的栈为例,介绍压栈和出栈操作的原理。
- 压栈操作(PUSH):当需要将数据压入栈中时,首先将
sp指针的值减去数据的大小,然后将数据存储到sp指针所指向的内存地址。例如,在 ARM 汇编中,使用PUSH指令将寄存器的值压入栈中:
PUSH {r0, r1} ; 将寄存器 r0 和 r1 的值压入栈中
执行该指令时,sp 指针会自动减去 8(假设每个寄存器为 4 字节),然后将 r0 和 r1 的值依次存储到 sp 指针所指向的内存地址。
- 出栈操作(POP):当需要从栈中弹出数据时,首先将
sp指针所指向的内存地址中的数据读取到目标寄存器中,然后将sp指针的值加上数据的大小。例如,在 ARM 汇编中,使用POP指令从栈中弹出数据:
POP {r0, r1} ; 从栈中弹出数据到寄存器 r0 和 r1
执行该指令时,首先将 sp 指针所指向的内存地址中的数据读取到 r0 中,然后将 sp 指针的值加上 4,再将新的 sp 指针所指向的内存地址中的数据读取到 r1 中,最后 sp 指针的值再加上 4。
3. 函数调用和返回过程
函数调用和返回过程涉及到栈指针的一系列操作,以确保程序能够正确执行。
-
函数调用:当程序调用一个函数时,通常会执行以下步骤:
- 将返回地址压入栈中,以便函数执行完毕后能够返回到调用点。
- 保存当前的寄存器值(如果需要)到栈中。
- 调整
sp指针,为函数的局部变量分配栈空间。 - 跳转到被调用函数的入口地址开始执行。
-
函数返回:当函数执行完毕后,会执行以下步骤:
- 恢复之前保存的寄存器值(如果有)。
- 从栈中弹出返回地址。
- 调整
sp指针,释放函数的局部变量所占用的栈空间。 - 跳转到返回地址继续执行。
-
示例代码(ARM 汇编)
.global mainmain:; 保存返回地址和寄存器值PUSH {lr}; 为局部变量分配栈空间SUB sp, sp, #4; 假设局部变量赋值MOV r0, #10STR r0, [sp]; 恢复栈空间ADD sp, sp, #4; 恢复返回地址并返回POP {pc}在这个示例中,
PUSH {lr}将返回地址压入栈中,SUB sp, sp, #4为局部变量分配 4 字节的栈空间,ADD sp, sp, #4释放局部变量所占用的栈空间,POP {pc}从栈中弹出返回地址并跳转到该地址继续执行。 -
sp寄存器是管理栈内存的关键,通过移动sp指针可以实现数据的压栈和出栈操作,支持函数调用和局部变量的存储。理解sp指针的作用和原理对于深入理解程序的执行过程和内存管理非常重要。
相关文章:
Linux-C-函数栈-SP寄存器
sp(Stack Pointer,栈指针)是计算机体系结构中一个非常重要的寄存器,下面将详细介绍其作用和原理。 作用 1. 管理栈内存 栈是一种后进先出(LIFO,Last In First Out)的数据结构,在程…...
vi的基本使用
vi 是 Unix/Linux 系统中最常用的文本编辑器之一,功能强大但学习曲线较陡。以下是 vi 的基本使用方法: --- ### **1. vi 的两种模式** - **命令模式(Command Mode)**: - 默认进入的模式,用于执行命令&a…...
clickhouse--表引擎的使用
表引擎决定了如何存储表的数据。包括: 数据的存储方式和位置,写到哪里以及从哪里读取数据。(默认是在安装路径下的 data 路径)支持哪些查询以及如何支持。(有些语法只有在特定的引擎下才能用)并发数据访问。索引的使用࿰…...
LeetCode刷题零碎知识点整理
系列博客目录 文章目录 系列博客目录 数组变量有length属性,String类的对象有length()方法。String s; s.split("\\s");不能去除头部空格,需要使用s s.trim();String类的对象有toCharArray()方法,List<>类型有toArray()方法…...
GLTFLoader.js和OrbitControls.js两个 JavaScript 文件都是 Three.js 生态系统中的重要组成部分
GLTFLoader.js和OrbitControls.js两个 JavaScript 文件都是 Three.js 生态系统中的重要组成部分: 1. GLTFLoader.js 作用 GLTFLoader.js 是 Three.js 库中的一个辅助加载器脚本,其主要功能是加载 GLB 或 GLTF 格式的 3D 模型。GLTF(GL Tra…...
大厂数据仓库数仓建模面试题及参考答案
目录 什么是数据仓库,和数据库有什么区别? 数据仓库的基本原理是什么? 数据仓库架构是怎样的? 数据仓库分层(层级划分),每层做什么?分层的好处是什么?数据分层是根据什么?数仓分层的原则与思路是什么? 数仓建模常用模型有哪些?区别、优缺点是什么?星型模型和雪…...
angular简易计算器
说明: 用angular实现计算器效果,ui风格为暗黑 效果图: step1: C:\Users\Administrator\WebstormProjects\untitled4\src\app\calnum\calnum.component.ts import { Component } from angular/core;Component({selector: app-calnum,import…...
谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇
上一篇咱们了解了 ES 7.10 相较于 ES 6.8 新增的字段类型,这一篇我们继续了解新增的查询方法。 Interval 间隔查询: 功能介绍 Interval 查询,词项间距查询,可以根据匹配词项的顺序、间距和接近度对文档进行排名。主要解决的查询…...
16、Python面试题解析:python中的浅拷贝和深拷贝
在 Python 中,浅拷贝(Shallow Copy) 和 深拷贝(Deep Copy) 是处理对象复制的两种重要机制,它们的区别主要体现在对嵌套对象的处理方式上。以下是详细解析: 1. 浅拷贝(Shallow Copy&a…...
游戏引擎学习第119天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展,我们刚刚完成了优化工作,目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度,但我们…...
爬虫解析库:Beautiful Soup的详细使用
文章目录 1. 安装 Beautiful Soup2. 基本用法3. 选择元素4. 提取数据5. 遍历元素6. 修改元素7. 搜索元素8. 结合 requests 使用9. 示例:抓取并解析网页10. 注意事项 Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库,它提供了简单易用的 API…...
OpenHarmony-4.基于dayu800 GPIO 实践(2)
基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针,其中有 16 个原生 IO,包括 6 个普通 IO,3 对串口,一个 SPI。TH1520 SOC 具有4个GPIO bank,每个bank最大有32个IO: …...
【C++设计模式】观察者模式(1/2):从基础到优化实现
1. 引言 在 C 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重…...
《机器学习数学基础》补充资料:欧几里得空间的推广
在《机器学习数学基础》第 1 章介绍了向量空间,并且说明了机器学习问题通常是在欧几里得空间。然而,随着机器学习技术的发展,特别是 AI 技术开始应用于科学研究中,必然会涉及到其他类型的空间。本文即在《机器学习数学基础》一书所…...
在配置PX4中出现的问题2
想要原教程的请看:第一次配置中出现的问题 前面一切正常(gazebo导入models那一步在刚刚解压好的文件夹里就删不掉stereo_camera等文件,ls打开也看不到,应该时我下的包里面本来就没有),到 make px4_sitl_def…...
2025-2-24-4.9 单调栈与单调队列(基础题)
文章目录 4.9 单调栈与单调队列(基础题)单调栈739. 每日温度42. 接雨水单调队列239. 滑动窗口最大值 4.9 单调栈与单调队列(基础题) 很有趣的两个数据结构。 原视频讲解链接 单调栈 739. 每日温度 题目链接 给定一个整数数组 te…...
python绘图之swarmplot分布散点图
swarmplot 是 Seaborn 提供的一种用于展示分类数据分布的散点图。它的主要作用是将数据点按照分类变量(通常是离散变量)进行分组,并在每个分类中以一种非重叠的方式展示数据点的位置。这种可视化方式可以帮助我们直观地理解数据在不同分类下的…...
数据库之MySQL——事务(一)
1、MySQL之事务的四大特性(ACID)? 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操…...
Linux学习笔记之文件
1.文件 1.1文件属性 当我们创建文件时,文件就有了对应的属性,可以用mkdir创建目录,touch创建普通文件。用ls -al查看文件属性。 从上图可以看出目录或者文件的所有者,所属组,其他人权限,创建时间等信息。由…...
LLM学习
1、基础概念篇 大模型训练三部曲Pretraining SFT RLHF...
AI原生研发为何90%团队卡在L2?AISMM成熟度评估实战手册(含自测评分表V2.3)
第一章:AISMM模型详解:AI原生软件研发成熟度评估 2026奇点智能技术大会(https://ml-summit.org) AISMM(AI-native Software Maturity Model)是由ML-Summit联合工业界与学术界共同提出的开源评估框架,专为衡量组织在AI…...
告别依赖地狱:用linuxdeployqt和dpkg为你的Qt应用打造一键安装的deb包(Ubuntu 20.04实测)
从开发到交付:构建零依赖的Qt应用Deb包全流程指南 在Linux生态中,Qt应用的打包分发一直是个令人头疼的问题。想象一下这样的场景:你花费数月精心开发的应用程序,用户下载后却因为缺少某个.so文件而无法运行;或是依赖库…...
告别ISE14.7:手把手教你将老FPGA工程无损迁移到Vivado(含UCF转XDC技巧)
从ISE到Vivado:FPGA工程迁移全流程实战指南 在FPGA开发领域,Xilinx的ISE 14.7曾经是许多工程师的标配工具,但随着Vivado的成熟,越来越多的项目需要迁移到这个更现代化的平台上。本文将带你一步步完成这个看似复杂的过程ÿ…...
5分钟掌握HumanEval:AI代码生成评估的黄金标准工具 [特殊字符]
5分钟掌握HumanEval:AI代码生成评估的黄金标准工具 🚀 【免费下载链接】human-eval Code for the paper "Evaluating Large Language Models Trained on Code" 项目地址: https://gitcode.com/gh_mirrors/hu/human-eval 在人工智能编程…...
WindowResizer:突破窗口限制的终极解决方案
WindowResizer:突破窗口限制的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾被那些无法调整大小的应用程序窗口困扰过?WindowResize…...
2026届毕业生推荐的五大降AI率平台推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 正处于人工智能辅助写作越来越普遍的当前状况下,怎样能够切实有效地减少文本所具…...
3个场景解锁抖音下载器:从零开始掌握高效素材收集
3个场景解锁抖音下载器:从零开始掌握高效素材收集 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...
终极英雄联盟皮肤更换指南:R3nzSkin让你的游戏体验焕然一新
终极英雄联盟皮肤更换指南:R3nzSkin让你的游戏体验焕然一新 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin 你是否厌倦了英雄联盟中千篇一律的皮肤?想要在游戏中体验…...
自然·人类行为:大语言模型如何调控人类语言网络
导语这篇发表于 Nature Human Behaviour 的研究提出了一个相当前沿、也颇具冲击力的问题:如果大语言模型(large language models, LLMs)不仅能模仿人类语言行为、预测阅读时的大脑反应,那么它是否还能进一步“反过来”帮助我们设计…...
语音识别安全加固:SenseVoice-Small ONNX输入校验与异常防护
语音识别安全加固:SenseVoice-Small ONNX输入校验与异常防护 1. 项目背景与安全挑战 SenseVoice-Small ONNX语音识别工具基于FunASR开源框架开发,采用Int8量化技术实现本地高效语音识别。在实际应用中,语音识别系统面临着多种安全风险&…...
