C语言及ARM中堆栈指针SP设置的理解与总结
1什么是栈
百度这么说:栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
简易理解:
客栈,即临时寄存的地方,计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间.CPU在运行程序时,会自动的使用堆栈,所以堆栈指针SP就必须要在调用C程序前设定。
CPU的内存RAM空间存放规律一般是分段的,从地址向高地址,依次为:程序段(.text)、BSS段,上面还可能会有堆空间,然后最上面才是堆栈段。这样安排堆栈,是因为堆栈的特点决定的,堆栈的指针SP初始化一般在堆栈段的高地址,也就是内存的高地址,然后让堆栈指针向下增长(其实就是递减)。
这样做的好处就是堆栈空间远离了其他段,不会跟其他段重叠,造成修改其他段数据,而引起不可预料的后果,还有设置堆栈大小的原则,要保证栈不会下溢出到数据空间或者程序空间。所谓堆栈溢出,是指堆栈指针SP向下增长到其他段空间,如果栈指针向下增长到其他段空间,称为堆栈溢出。堆栈溢出会修改其他空间的值,严重情况下可造成死机.
2堆栈指针的设置
开始将堆栈指针设置在内部RAM,是因为不是每个板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,还需要初始化,在内部RAM开始运行的一般是一个小的引导程序,基本上不怎么使用堆栈,因此将堆栈设置在内部RAM,但这也就要去改引导程序不能随意使用大量局部变量。
片内4K的SRAM,SDRAM大小64M,从0x30000000到0x33FFFFFF,当程序在片内SRAM运行的时候,sp的值设置为4096,当程序在SDRAM内运行的时候sp设置为0x34000000,当程序在内部SRAM运行,若已经初始化SDRAM,此时也可以将堆栈指针设置为0x34000000,更加防止了堆栈溢出。
3栈的整体作用
保存现场;
传递参数:汇编代码调用 C 函数时,需传递参数;
保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量;
1) 保存现场
现场,意思就相当于案发现场,总有一些现场的情况,要记录下来的,否则被别人破坏掉之后,你就无法恢复现场了。而此处说的现场,就是指 CPU 运行的时候,用到了一些寄存器,比如 r0,r1 等等,对于这些寄存器的值,如果你不保存而直接跳转到子函数中去执行,那么很可能就被其破坏了,因为其函数执行也要用到这些寄存器。因此,在函数调用之前,应该将这些寄存器等现场,暂时保持起来(入栈 push),等调用函数执行完毕返回后(出栈 pop),再恢复现场。这样CPU就可以正确的继续执行了。
保存寄存器的值,一般用的是 push 指令,将对应的某些寄存器的值,一个个放到栈中,把对应的值压入到栈里面,即所谓的压栈。然后待被调用的子函数执行完毕的时候,再调用 pop,把栈中的一个个的值,赋值给对应的那些你刚开始压栈时用到的寄存器,把对应的值从栈中弹出去,即所谓的出栈。其中保存的寄存器中,也包括 lr 的值(因为用 bl 指令进行跳转的话,那么之前的 PC 的值是存在 lr 中的),然后在子程序执行完毕的时候,再把栈中的 lr 的值 pop 出来,赋值给 PC,这样就实现了子函数的正确的返回
2) 传递参数
C 语言进行函数调用的时候,常常会传递给被调用的函数一些参数,对于这些 C 语言级别的参数,被编译器翻译成汇编语言的时候,就要找个地方存放一下,并且让被调用的函数能够访问,否则就没发实现传递参数了。对于找个地方放一下,分两种情况。一种情况是,本身传递的参数不多于 4 个,就可以通过寄存器 r0~r3 传送参数。因为在前面的保存现场的动作中,已经保存好了对应的寄存器的值,那么此时,这些寄存器就是空闲的,可以供我们使用的了,那就可以放参数。另一种情况是,参数多于 4 个时,寄存器不够用,就得用栈了。
3) 临时变量保存在栈中
包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
1.详解嵌入式Linux工程师的成长经历
2.单片机5V转3.3V电平,有19种方法技巧供参考!
3.嵌入式WiFi与普通WiFi有什么不同?
4.Linux开发者都应该知道的知识要点~
5.研究完比特币代码,发现了一个惊人秘密!
6.开发者避坑须知:2018 年最不值得学习的五门编程语言
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。
C语言及ARM中堆栈指针SP设置的理解与总结相关推荐
- MCS-51单片机存储器结构-特殊功能寄存器 :堆栈指针SP(Stack Pointer)
堆栈指针SP(Stack Pointer) 堆栈是一种数据结构,它是一个8位寄存器,它指示堆栈顶部在内部RAM中的位置.系统复位后,SP的初始值为07H,使得堆栈实际上是从08H开始的.但我们从RAM ...
- ARM三个寄存器 : 堆栈指针SP(R13)、连接寄存器LR(R14)和程序计数器PC(R15)
深入理解ARM的这三个寄存器,对编程以及操作系统的移植都是必要的. 1.堆栈指针R13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式( ...
- 2022-04-14 在TXT文档中查找汉字——C语言及C++中多字节与宽字符的区别
汉字是什么类型 汉字是char类型么,显然不是,在C或C++的语境里,char的值一般都在0-255之间,显然,汉字远远超过了这个区间. 但我们赋值的时候还是用char数组或string来赋值,也一样 ...
- ARM中ABORT(中止)的理解
ABORT(中止) 产生中止异常意味着对程序存储器或数据存储器的访问失败.ARM微处理器在存储器访问周期内检查是否发生中止异常. 中止异常包括两种类型: ─: 指令预取中止:发生在指令预取时. 二: ...
- JavaScript中this指针指向的彻底理解
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 这一点与函数中自由变量Action-varibal不同 1 va ...
- ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR
参考:堆栈指针寄存器 SP详解以及栈的作用 作者:蓝色鲜橙多 网址:https://blog.csdn.net/qq_36588941/article/details/89873633?utm_sou ...
- 为什么要使用堆栈? sp和fp的解释
为什么要使用堆栈? 一个过程调用可以象跳转(jump)命令那样改变程序的控制流程, 但是与跳转不同的是, 当工作完成时,函数把控制权返回给调用之后的语句或指令. 这种高级抽象实现起来要靠 ...
- 堆栈指针寄存器-SP详解
基本概念: 堆栈指针寄存器-SP是什么? 答:堆栈是计算机存储数据的一种数据结构,SP的作用就是指示当前要出栈或入栈的数据,并在操作执行后自动递增或递减. 至于是入栈递增还是入栈递减,就是由CPU的生 ...
- 堆栈指针寄存器 SP详解以及栈的作用
本文引用地址:http://www.eepw.com.cn/article/201611/321963.htm 韦东山:https://blog.csdn.net/thisway_diy/articl ...
最新文章
- redis删除list中指定index的值
- 如何查看oracle版本信息,如何查看oracle版本信息
- 手机端html表格,jQuery Mobile 表格
- 关于SOCKET中send和recv函数工作原理总结
- 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索
- C#设计模式之23-访问者模式
- 正弦 sin 余弦 cos
- iOS-入门HelloWorld
- python列表的排序方法_Python 列表 sort() 方法
- 新萝卜家园Ghost XP SP3电脑城装机版2013.08
- 高德经纬度、百度经纬度、标准经纬度相互转换(VB.NET)
- 微分方程建模(人口预测,捕食者猎物)
- 解决Hadoop Browse Directory Couldn‘t upload the file 错误.无法上传文件
- 一道经典SQL笔试题(求各部门最高薪水的部门名称、员工姓名以及薪水)
- java中 jmm,JMM(JAVA内存模型)
- html文件右键没有打开方式,Win7右键菜单中的”打开方式“不见了的解决方法
- 百度地图添加文本标记
- OneNav一为主题魔改教程(一):优化后台新增网站时调用API却没有赋好值的BUG,以减少复制编辑工作量--一梦
- 【我们为什么用高斯机制?】差分隐私代码实现系列(七)
- k近邻算法 (KNN)
热门文章
- TCP Data Flow and Window Management(1)
- arcgis怎么压缩tif文件_使用gdal压缩tif文件
- 张俊林:由ChatGPT反思大语言模型(LLM)的技术精要(2)
- qt window release 打包的方法及常见问题,不同路径的差异
- 爬取掌阅app免费电子书数据
- SuperMap地图绘制线段
- 软连接和硬连接(Linux创建软连接一定要用绝对路径)
- html标签的默认样式及去除
- 2021_lg_03.SQL实战:如何用sql计算用户留存问题
- Muli3D源码分析(1) - 框架概览