2024年3月24日发(作者:)
什么是堆栈?堆栈指针的SP的作用是什么?8051单片机堆栈容量不
超过多少字节?
在51单片机中,SP栈指针是一个专用的8位寄存器,
系统复位后,SP初始化为07H,使得堆栈指针实际上是由08H单元开始。
在响应中断或子程序调用时,发生入栈操作,入栈的是16位PC值;
51中有PUSH压入和POP弹出栈操作指令,
如有必要,在中断或调用子程序时可用POSU指令把PSW或其它需要保护的寄存器的内
容
压入堆栈加以保护;返回前再使用POP指令把它们恢复。
51的内部RAM只有从00H到7FH共计128字节的空间,而且00H~1FH是工作寄存器区,
所以SP的设定一般设定是从20H到70H这个范围。
51堆栈的容量最大也不会超过128字节。
1、在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有
明确堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称
为栈顶(top))对数据项进行插入和删除。要点:堆,顺序随意。栈,后进先出(Last-In/First-Out)。
区分队列 先进先出
2、堆栈是一块保存数据的连续内存。 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部。 堆
栈的底部在一个固定的地址。 堆栈的大小在运行时由内核动态地调整。 CPU实现指令
PUSH和POP, 向堆栈中添加元素和从中移去元素。 堆栈由逻辑堆栈帧组成。 当调用函
数时逻辑堆栈帧被压入栈中, 当函数返回时逻辑 堆栈帧被从栈中弹出。 堆栈帧包括函数
的参数, 函数地局部变量, 以及恢复前一个堆栈 帧所需要的数据, 其中包括在函数调用
时指令指针(IP)的值。 堆栈既可以向下增长(向内存低地址)也可以向上增长, 这依赖于具
体的实现。 在我 们的例子中, 堆栈是向下增长的。 这是很多计算机的实现方式, 包括
Intel, Motorola, SPARC和MIPS处理器。 堆栈指针(SP)也是依赖于具体实现的。 它
可以指向堆栈的最后地址, 或者指向堆栈之后的下一个空闲可用地址。 在我们的讨论当中,
SP指向堆栈的最后地址。 除了堆栈指针(SP指向堆栈顶部的的低地址)之外, 为了使用方
便还有指向帧内固定 地址的指针叫做帧指针(FP)。 有些文章把它叫做局部基指针(LB-local
base pointer)。 从理论上来说, 局部变量可以用SP加偏移量来引用。 然而, 当有字被
压栈和出栈后, 这 些偏移量就变了。 尽管在某些情况下编译器能够跟踪栈中的字操作, 由
此可以修正偏移 量, 但是在某些情况下不能。 而且在所有情况下, 要引入可观的管理开
销。 而且在有些 机器上, 比如Intel处理器, 由SP加偏移量访问一个变量需要多条指
令才能实现。 因此, 许多编译器使用第二个寄存器, FP, 对于局部变量和函数参数都
可以引用, 因为它们到FP的距离不会受到PUSH和POP操作的影响。 在Intel CPU中,
BP(EBP)用于这 个目的。 在Motorola CPU中, 除了A7(堆栈指针SP)之外的任何地址寄
存器都可以做FP。 考虑到我们堆栈的增长方向, 从FP的位置开始计算, 函数参数的偏
移量是正值, 而局部 变量的偏移量是负值。 当一个例程被调用时所必须做的第一件事是
保存前一个FP(这样当例程退出时就可以 恢复)。 然后它把SP复制到FP, 创建新的FP,
把SP向前移动为局部变量保留空间。 这称为 例程的序幕(prolog)工作。 当例程退出时,
堆栈必须被清除干净, 这称为例程的收尾 (epilog)工作。 Intel的ENTER和LEAVE指令,
Motorola的LINK和UNLINK指令, 都可以用于 有效地序幕和收尾工作。
3、普通的8051MCU堆栈指针只有8位,所以堆栈不可能超过256字节13086.
SP:堆栈指针(SP,Stack Pointer),专门用于指出堆栈顶部数据的地址。
堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚
放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,
这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种
现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,
后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。
在单片机中,我们也能在RAM中构造这样一个区域,用来存放数据,这个区域存放数据的
规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储
器本身不是能按地址来存放数据吗?对,知道了地址的确就能知道里面的内容,但如果我们
需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接
一个地放置,那么我们只要知道第一个数据所在地址单元就能了(看图2)如果第一个数据
在27H,那么第二、三个就在28H、29H了。所以利用堆栈这种办法来放数据能简化操作
那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地
方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?
还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆
栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就
不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的
位置是能变化的。而这种变化就体现在SP中值的变化,看图2,SP中的值等于27H不就
相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就
是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那
么第一个数据的位置是28H单元,而不是27H单元,为什么会这样,我们在学堆栈命令时


发布评论