微软公司宣布不再支持你正在使用的 IE浏览器,这会严重影响浏览网页,请使用微软最新的Edge浏览器
厂商专区
产品/技术
应用分类

新手必看 堆栈指针在单片机当中的作用

2016-05-23 09:15 来源:电源网综合 编辑:铃铛

与单片机有关的知识点错综复杂,并且对于新手来说,想要在短时间内掌握这些概念和技术并对其进行归类汇总是较为困难的。因此在学习过程中小编建议大家从一小部分开始学起,熟悉之后再进行下一部分。在本文中,小编给就将为大家介绍单片机当中有关堆栈指针的相关概念。

堆栈指针sp在片内RAM128B中开辟栈区,并随时跟踪栈顶地址。它是按"先进后出"的原则存取数据。开机复位后,单片机栈底地址为07H。

主要用来保存临时数据,局部变量和中断/自程序的返回地址。堆栈指针总是指向栈顶元素。所以数据入栈的时候,堆栈指针先加1,再压栈。向上增长方式与计算机的方式一样。

出栈的时候先弹出数据,堆栈指针再减1。

如果堆栈的实现是往上长的(就是说往顶的方向长,其实质是栈底是定死的不能动,入栈的东西只能不断往上叠,这就像在书桌上放书一样,桌底是定死的,所以书只能一本一本地往上堆,往上长),计算机内部的堆栈的实现采取的就是这种模式,所以就得像你说的那样,“先修改指针,然后插入数据,出栈时刚好相反”,因为堆栈指针指向的总是栈顶元素,栈底不能动,所以数据入栈前要先修改指针使它指向新的空余空间然后再把数据存进去,出栈的时候自然相反。

然而,如果堆栈的实现是往下长的(就是说每压一个元素入栈,栈底就自动下移一个元素的位置,其实质就是这种堆栈模型是一个“无底洞”型),这个时候,栈顶就变成了定死的,就可以先压入元素,然后再修改指针。因为栈底是无限的,压入一个元素,新的元素就取代先前的栈顶元素占据栈顶的位置,那么先前的指向栈顶元素的指针这个时候就该修改让它指向这个新的栈顶元素了。




下面的就是对“无底洞”型堆栈的一种实现的描述:

压栈(入栈):将对象或者数据压入栈中,更新栈顶指针,使其指向最后入栈的对象或数据。

弹栈(出栈):返回栈顶指向的对象或数据,并从栈中删除该对象或数据,更新栈顶。

话说回来,计算机内部肯定选第一种模型,不会选第二种,因为第二种模型,每压入一个新的元素,都需要把之前堆栈里的所有元素整体下移动一个元素的位置,腾出栈顶元素的位置让新的元素进来,这种平移可是一笔不小的开销啊!但是并不是说“无底洞”模型就没办法实现了,其实它可以通过第一种模型来模拟的,每需要压入一个新的元素的时候,就先开辟一个空间,数据存入这个空间,然后再修改栈顶元素指针使其指向这个新的栈顶元素。

这就意味着,如果使用的是链表的话,只要有足够的空间可开辟出来作为一个节点,那么两种堆栈模型都能实现(当然“无底洞”型还是如我上面说的那样用第一种模拟出来的,否则平移的工作量相当可观),如果用数组,由于数组在内存中是连续分配出来的空间,用第一种模型更自然一些。

以上的内容就是有关单片机堆栈指针的定义以及对其工作过程、原理的简述。对于新手来说单片机的知识体系较为庞大,掌握起来也较为困难,因此针对每个知识点进行有针对性的了解才能最好的掌握知识。希望大家在阅读本文后能够有所收获。

声明:本内容为作者独立观点,不代表电源网。本网站原创内容,如需转载,请注明出处;本网站转载的内容(文章、图片、视频)等资料版权归原作者所有。如我们采用了您不宜公开的文章或图片,未能及时和您确认,避免给双方造成不必要的经济损失,请电邮联系我们,以便迅速采取适当处理措施;欢迎投稿,邮箱∶editor@netbroad.com。

相关阅读

微信关注
技术专题 更多>>
研发工程师的工具箱
智慧生活 创新未来

头条推荐

电子行业原创技术内容推荐
客服热线
服务时间:周一至周五9:00-18:00
微信关注
获取一手干货分享
免费技术研讨会
editor@netbroad.com
400-003-2006