0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于单片机堆栈操作:堆栈是单片机中的存储单元

454398 来源:博客园 作者:Andrew_qian 2020-10-21 17:32 次阅读

看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片机内部的原理。但是最近课程学习微机原理这门课,需要我们写汇编程序,汇编里面经常遇到堆栈这个东西,所以就找了个时间把堆栈给彻底的搞一下。

如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。通常用来保存CALL指令调用子程序时的返回地址,RET指令从堆栈中获取返回地址。中断指令INT调用中断程序时,将标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值保存在堆栈中。

堆栈也可以用来保存其他数据。

堆栈操作由PUSH,POP两条指令来完成;

堆栈操作的操作数均为子类型(两个字节)进行操作。

程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。

程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。

栈是从高到低分配,堆是从低到高分配。

我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。

为什么单片机启动时,不需要用bootloader将代码从ROM搬移到RAM,而ARM则需要。这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤,取执行---分析指令----执行指令。取指令的任务是:根据PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。而ARM不同,cpu运行的频率高,远大于从ROM读写的速度,所以一般有操作系统,都需要将代码部分拷贝到RAM中再执行。

再来看一个网上很流行的经典例子:

main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = “abc”; 栈

char *p2; 栈

char *p3 = “123456”; 123456/0在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10); 堆

p2 = (char *)malloc(20); 堆

}

不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

网上一个很好的比喻,摘抄下来,以便理解:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

总结:

其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

如果非要给他加几个特点的话那就是:1、这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

2、这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。

好了,以上就是这些。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43982

    浏览量

    620916
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117765
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1322

    浏览量

    113709
  • Call
    +关注

    关注

    0

    文章

    9

    浏览量

    8249
  • 堆栈
    +关注

    关注

    0

    文章

    171

    浏览量

    19532
收藏 人收藏

    评论

    相关推荐

    FPGA和单片机的区别

    任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储
    发表于 11-14 15:30

    怎么确定单片机堆栈大小?

    怎么确定单片机堆栈大小,例如51stack的大小怎么预留?其他单片机的不同之处,及与ARM区别
    发表于 11-02 06:36

    如何把单片机存储单元清0或置1?

    怎么把单片机存储单元清0或置1?
    发表于 10-16 07:59

    单片机堆栈的作用是什么?

    我们都知道堆栈位于RAM中,现在MCU的RAM相对较大(几十上百K),所以分配的堆栈也是足够大,很多人都不怎么关注这个堆栈的大小。
    发表于 08-22 09:11 1296次阅读
    <b class='flag-5'>单片机</b>中<b class='flag-5'>堆栈</b>的作用是什么?

    指令应用实例:块复制与堆栈操作(2)#单片机

    单片机存储计算机函数
    未来加油dz
    发布于 :2023年08月02日 22:24:59

    指令应用实例:块复制与堆栈操作(1)#单片机

    单片机存储计算机函数
    未来加油dz
    发布于 :2023年08月02日 22:24:33

    堆栈指针SP与堆栈(2)#单片机

    单片机存储计算机函数
    未来加油dz
    发布于 :2023年08月02日 22:03:53

    堆栈指针SP与堆栈(1)#单片机

    单片机存储计算机函数
    未来加油dz
    发布于 :2023年08月02日 22:03:06

    程序存储器与堆栈(2)#单片机

    单片机定时器
    未来加油dz
    发布于 :2023年08月01日 18:41:08

    程序存储器与堆栈(1)#单片机

    单片机定时器
    未来加油dz
    发布于 :2023年08月01日 18:40:27

    堆栈操作指令(2)#单片机

    单片机存储
    未来加油dz
    发布于 :2023年07月31日 22:45:34

    堆栈操作指令(1)#单片机

    单片机存储
    未来加油dz
    发布于 :2023年07月31日 22:44:50

    堆栈(2)#单片机

    单片机存储
    未来加油dz
    发布于 :2023年07月31日 22:44:05

    堆栈(1)#单片机

    单片机存储
    未来加油dz
    发布于 :2023年07月31日 22:43:18

    单片机的应用(1)#单片机

    单片机存储
    未来加油dz
    发布于 :2023年07月31日 22:33:10