什么是栈:
百度这么说:栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
简易理解:
客栈,即临时寄存的地方,计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间。CPU在运行程序时,会自动的使用堆栈,所以堆栈指针SP就必须要在调用C程序前设定。
CPU的内存RAM空间存放规律一般是分段的,从低地址向高地址,依次为:程序段(.text)、BSS段,上面还可能会有堆空间,然后最上面才是栈段。这样安排堆栈,是因为堆栈的特点决定的,堆栈的指针SP初始化一般在堆栈段的高地址,也就是内存的高地址,然后让堆栈指针向下增长(其实就是递减)。
这样做的好处就是堆栈空间远离了其他段,不会跟其他段重叠,造成修改其他段数据,而引起不可预料的后果,还有设置堆栈大小的原则,要保证栈不会下溢出到数据空间或者程序空间。所谓堆栈溢出,是指堆栈指针SP向下增长到其他段空间,如果栈指针向下增长到其他段空间,称为堆栈溢出。堆栈溢出会修改其他空间的值,严重情况下可造成死机。
堆栈指针的设置
开始将堆栈指针设置在内部RAM,是因为不是每个板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,还需要初始化,在内部RAM开始运行的一般是一个小的引导程序,基本上不怎么使用堆栈,因此将堆栈设置在内部RAM。但这也就要去改引导程序不能随意使用大量局部变量。
片内4K的SRAM,SDRAM大小64M,从0x30000000到0x33FFFFFF,当程序在片内SRAM运行的时候,sp的值设置为4096,当程序在SDRAM内运行的时候sp设置为0x34000000,当程序在内部SRAM运行,若已经初始化SDRAM,此时也可以将堆栈指针设置为0x34000000,更加防止了堆栈溢出。
栈的整体作用
a.保存现场;
b.传递参数:汇编代码调用C函数时,需传递参数;
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)临时变量保存在栈中
包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
关键字:C语言 ARM 堆栈指针 SP设置
引用地址:
C语言及ARM中堆栈指针SP设置的理解与总结
推荐阅读最新更新时间:2024-11-02 00:32
英国芯片巨头ARM寻求中国“芯”机会
日前,移动端芯片巨头英国ARM公司宣布在中国成立合资公司“安谋科技(中国)有限公司ARM mini China”,新公司4月底开始运营。中资方持有安谋科技51%的股份,ARM持有其余49%。ARM是在移动端芯片设计的老大,在手机处理器领域占有90%的市场份额,处于绝对垄断地位。 在美国对中国发出芯片出口禁令的当下,ARM与中国的深度合作引发市场关注,业内褒贬不一。支持方表示,此次的合作将使中国芯片业在贸易制裁下找到了新出口,同时也为中国芯片业提供了学习和发展的机会;担忧方表示,中国不会从这种合作方式中获得更多核心的先进技术,且垄断优势会大大打击萌芽发展期的中国芯片厂商。 ARM的“中国布局” ARM公司1991
[半导体设计/制造]
ARM可能制造低功率PC处理器 全面反击Intel
据英国金融时报报道,由于Intel近期宣称Atom处理器将大举进军手机和其他掌上设备市场,业界普遍担心ARM在该市场中的地位将被动遥。对此,ARM公司首席执行官WarrenEast日前表示,他们丝毫不会惧怕Intel进军手机市场,相反认为ARM能够在更大的市场中打败Intel。 WarrenEast称,只要用户需求更加节能的处理器,ARM有可能制造PC用处理器,和Intel展开正面竞争,“谁会说情况一定会是Intel抢夺了ARM的市场份额,为什么不能是反过来呢?Intel的特长在于提高处理器速度,而ARM则可以造出功耗更低的。我们在这方面仍然遥遥领先。” 由于全球环保意识的逐渐提高,各大IT厂商都希望自己的产品更
[焦点新闻]
Mapbox牵手微软、英特尔和软银ARM 向无人驾驶汽车地图推进
地图创业公司Mapbox表示,该公司将与微软、英特尔和软银旗下ARM展开合作,向无人驾驶汽车地图领域进一步推进。Mapbox并没有开发地图应用,而是与谷歌地图和HERE争相为其他应用提供底层地图。Snapchat消息应用和Instacart杂货配送应用都使用该公司的服务。 这家总部位于华盛顿特区的创业公司已经通过软银的Vision Fund和德丰杰等公司融资约2.28亿美元,该公司一直在为无人驾驶汽车领域的软件开发商提供工具。 Mapbox周三在旧金山举行的软件开发者大会上宣布,该公司有几项合作是为了让他们的技术更好地为无人驾驶汽车提供服务。 Mapbox有一款软件可以让手机或汽车电脑在行驶时看到路面,识别车道或限速标
[嵌入式]
arm与单片机的区别?
1、软件方面 这应该是最大的区别了。引入了操作系统。为什么引入操作系统?有什么好处嘛? 1)方便。主要体现在后期的开发,即在操作系统上直接开发应用程序。不像单片机一样一切都要重新写。前期的操作系统移植工作,还是要专业人士来做。 2)安全。这是LINUX的一个特点。LINUX的内核与用户空间的内存管理分开,不会因为用户的单个程序错误而引起系统死掉。这在单片机的软件开发中没见到过。 3)高效。引入进程的管理调度系统,使系统运行更加高效。在传统的单片机开发中大多是基于中断的前后台技术,对多任务的管理有局限性。 2、硬件方面 现在的8位单片机技术硬件发展的也非常得快,也出现了许多功能非常强大的单片机。但是
[单片机]
基于ARM与FPGA的LCD控制器设计
随着显示屏技术的不断发展,真彩液晶显示屏以其高分辨率、高对比度及高清晰度等优势逐渐在嵌入式显示系统中占据重要地位。目前,基于嵌入式平台的LCD显控技术的实现主要有两种方式:ARM内嵌LCD控制器和独立的控制器件。但是这两种实现方式都存在着不足之处,内嵌控制器的使用可能增大处理器的负担和限制显示帧率,而外部控制器件不仅成本高,而且专用性比较强,很难适应不同类型的液晶屏。 据此存在的问题,这里提出一种基于ARM与FPGA的LCD控制器设计方案,该设计方案一方面能够通过操作LINUX OS下的Framebuffer设备提高显存的写入速率及减轻处理器的负担,另一方面用FPGA来实现LCD控制器的设计,开发周期短、功耗低,同时具有灵
[单片机]
ARM Linux.2.6.34内核移植
ARM-LINUX-GCC版本4.3.2.以安装在/usr/local/arm/4.3.2下. 第一步: 修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改 ARCH ? =arm CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux- 第二步: 修改平台输入时钟 修改平台的时钟频率,修改内核源码“arch/arm/mach-s3c2440/mach-smdk2440.c” 把时钟初始化中(S3C24XX_init_clocks(16934400 ))的16934400 改为12000000,因为我们的开发板上为12M 第三步: 修改机
[单片机]
2017年这些物联网公司值得你关注
随着物联网 时代的到来,已不在是未来概念,引领信息科技与传统领域融合,且还能带动数十万亿美元的经济价值,无论是IBM、 ARM 和英特尔等国际巨头,还是华为、BAT等为代表都已瞄准物联网 ,能充分利用物联网 的企业将会成为万物互联时代的赢家,那么在2017年,在物联网领域有哪些最值得关注的公司?下面就随网络通信小编一起来了解一下相关内容吧。 2017年这些物联网公司值得你关注 谷歌 谷歌自2014年以32亿美元收购Nest智能家居厂商,正式踏入物联网领域,在长期关注物联网发展的杨剑勇先生看来,由于这一笔交易,也促使了众多科技企业纷纷开始涉足智能家居领域。尽管Nest没有达到预期,但作为新兴产业,谷歌
[网络通信]
【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
一. ARM 芯片类型 1. ARM 分类 (1) ARM 分类类型(芯片 | 核 | 指令架构) ARM 分类 : -- ARM 芯片类型 : 6410, 2440, 210; -- ARM 核类型 : arm11, arm9, CortexA9; -- 指令架构 : armv7, armv6; (2) ARM芯片 与 ARM核 关系 芯片 和 核关系 : 芯片包含核; -- 2440 芯片 : 包含 arm9 核; -- 6410 芯片 : 包含 arm11 核; -- 210 芯片 : 包含 CortexA8 核; (3) ARM核 与 指令架构 关系 ARM 核 与 指令
[单片机]