什么是堆栈,51单片机堆栈指针SP的使用
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.
MCS-51单片机汇编语言中,没有SP这条指令,只有针对SP操作的指令。51单片机中SP是堆栈指针寄存器,存放着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值。
除了初始化堆栈时直接给SP赋值,SP显式存在,其它的对SP有影响的指令,对SP的操作都是隐式的,就是说SP并不出现在指令操作数当中。
例如:
MOV SP,#80H ;初始堆栈指针,(SP)=80H
LCALL XXXX;调用XXXX处的子程序,下一条指令PC值压栈,(SP)=(SP)+2
NOP;子程序返回时,RET指令从堆栈中弹出PC值,所以会返回到这里,(SP)=(SP)-2
PUSH ACC;累加器A的内容压栈保存,(SP)=(SP)+1
POP B;堆栈内保存的累加器A的内容弹出到B寄存器中,(SP)=(SP)-1
使用PUSH、POP指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。
另外
如果把30H赋给了SP,称为设置栈底。以后:
PUSH ACC ,就把ACC的内容存放到31H单元;
PUSH PSW ,就把PSW的内容存放到32H单元;
PUSH B ,就把B的内容存放到33H单元。
……
弹出时,要用POP指令。
利用堆栈,就不用管具体的内容存放在什么单元了,SP会自动管理。
mcs-51单片机汇编语言中,没有sp这条指令,只有针对sp操作的指令。51单片机中sp是堆栈指针寄存器,存放着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值。
除了初始化堆栈时直接给sp赋值,sp显式存在,其它的对sp有影响的指令,对sp的操作都是隐式的,就是说sp并不出现在指令操作数当中。
例如:
mov
sp,#80h
;初始堆栈指针,(sp)=80h
lcall
xxxx;调用xxxx处的子程序,下一条指令pc值压栈,(sp)=(sp)+2
nop;子程序返回时,ret指令从堆栈中弹出pc值,所以会返回到这里,(sp)=(sp)-2
push
acc;累加器a的内容压栈保存,(sp)=(sp)+1
pop
b;堆栈内保存的累加器a的内容弹出到b寄存器中,(sp)=(sp)-1
使用push、pop指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。
另外
如果把30h赋给了sp,称为设置栈底。以后:
push
acc
,就把acc的内容存放到31h单元;
push
psw
,就把psw的内容存放到32h单元;
push
b
,就把b的内容存放到33h单元。
……
弹出时,要用pop指令。
利用堆栈,就不用管具体的内容存放在什么单元了,sp会自动管理。
看看这道单片机题
MOV DPTR,#4000H 把4000H送给0FFFF地址,也就是片外存储器 RL A 左移A 00000010变为00000100,变为04H MOV B,A 把A送给B寄存器,此时B为04H MOVC A,@A+DPTR DPTR=4000H,A=04H,把他们相加的地址里的内容送给A,为30H PUSH A 然后压入堆栈,此时SP虽然为50H,但存储的地址需+1,为51H ...
MCS-51单片机汇编语言的SP指令有什么作用?
MCS-51单片机汇编语言中,没有SP这条指令,只有针对SP操作的指令。51单片机中SP是堆栈指针寄存器,存放着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值。除了初始化堆栈时直接给SP赋值,SP显式存在,其它的对SP有影响的指令,对SP的操作都是隐式...
51单片机中sp=05什么意思
有五个指针。因为单片机里sp是堆栈指针,所以51单片机中sp=05的表示,意思是有有五个指针。堆栈指针SP英文全称为stackpointer,是单片机控制器的组成部件之一,与时控制逻辑电路、指令寄存器译码器、地址指针DPTR、程序计数器等部件程序计数器等部件共同组成CPU的神经中枢。
MCS-51单片机的堆栈区一般应建立在什么区
MCS-51单片机的堆栈区一般应建立在什么区?51单片机上电后堆栈指针为07H,堆栈区建在07H以上的内部RAM区,这是1区的工作寄存器所在的存储区,不合适。所以应该将堆栈区建立在内部RAM的低128字节区的70H~7FH范围内比较好。这样留出16个字节,还是够用的。对于52单片机,内部RAM有256个字节,把堆栈区放...
单片机中程序指针、数据指针、堆栈指针区别是什么?
数据指针,指向的空间,在物理上有Flash和RAM,在逻辑上是Flash里的常数空间和数据空间,注意,是对于单片机来说,对于我们的电脑,常数空间不是在Flash上。比如说51单片机的DPTR,如果用MOVC A,@A+DPTR,此时,就是指向常数空间,如果用 MOVX A,@A+DPTR就是指向的数据空间。堆栈指针,指向的空间,在...
51系列单片机进行堆栈操作以字为基本单位么
51单片机的堆栈操作都是以字节为单位的,包括PUSH,POP命令。不论是你自己主动压栈,还是函数调用时的压栈,都是字节为单位的。如果需要压的是16位内容,例如PC值,那就分两次压。
51单片机中LCALL是什么意思
51单片机中LCALL意思是长调用指令,可以调用64kb范围内程序存储器中的任何一个子程序。执行过程是先把程序计数器pc加3获得下条指令的地址(也就是断点地址),并把它压入堆栈(先低八位后高八位),同时把堆栈指针加2。接着把指令的第二个和第三个字节(A15-A8,A7-A0)分别装入pc的高位和低位...
在单片机中什么是堆栈?它的作用是什么?
在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。堆栈是一个特定的存储区或寄存器,它的一端...
有关51单片机的一个问题?
汇编语言和微处理器(如8085或8086)的栈操作。首先,让我们解释一下这些符号的意思:DPTR(数据指针)通常由两个寄存器组成:DPH(数据指针高字节)和DPL(数据指针低字节)。SP(堆栈指针)寄存器存储着当前栈顶的地址。圆括号中的值,如(42H),表示地址42H处的内存内容。给定的初始条件是:DPTR = ...
MCS―51单片机的堆栈区只可设置在__,堆栈寄存器5P是__位寄存器
正确答案是:MCS-51单片机的堆区只能在RAM__中设置。堆栈寄存器SP是8__位寄存器。在汇编语言中,SP寄存器是指堆栈指针寄存器,用于堆栈操作。PUSH和POP指令用于从SP寄存器获得当前堆栈段中的偏移量。因此,SP寄存器被称为堆栈指针,SP总是指向堆栈的顶部。堆栈是计算机中广泛使用的一种技术。基于栈的...
狄轻迈力: 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场.要点:堆,队列优先,先进先出(FIFO—first in first out)[1] .栈,先进后出(FILO—First-In/Last-Out).
郯城县17133739601: 什么是堆栈?堆栈指针的SP的作用是什么?8051单片机堆栈容量不超过多少字节? - ?
狄轻迈力: 在51单片机中,SP栈指针是一个专用的8位寄存器,系统复位后,SP初始化为07H,使得堆栈指针实际上是由08H单元开始.在响应中断或子程序调...
郯城县17133739601: 什么叫堆栈?8051堆栈指示器SP有多少位,作用是什么?单片机初始化话后SP中的内容是什么? - ?
狄轻迈力: 堆栈是连续的内存单元,存取方式遵循“先进后出”的原则. 其作用一般是保存寄存器或标志寄存器的内容. 堆栈就是这样一种数据结构.它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中...
郯城县17133739601: 51单片机的堆栈指针sp始终是指向 - ?
狄轻迈力: mcs-51单片机汇编语言中,没有sp这条指令,只有针对sp操作的指令.51单片机中sp是堆栈指针寄存器,存放着当前堆栈地址.堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值. 除了初始化堆栈...
郯城县17133739601: 什么是堆栈,51单片机堆栈指针SP的使用举例?
狄轻迈力: 哈哈~~~我喜欢,狂顶!!!
郯城县17133739601: 单片机中数据指针DPTR和堆栈指针SP是什么,有什么用及在编程中什么时候要用 - ?
狄轻迈力: DPTR是个16位的寄存器,主要用来寻址,他存储的是空间地址.因此可寻址存储64k的范围. SP堆栈指针,主要用来调用子程序或者进入中断的时候保存当前的寄存器内的数据,和当前程序计数器值.在程序返回后把内容弹出.回到断开的程序段处继续执行.
郯城县17133739601: 在单片机里什么叫做堆栈?
狄轻迈力: 堆栈其实是一种数据结构,存入数据不需要地址,只需要PUSH和POP操作就可以实现数据的存储和取出,以先进后出为规则,数据操作全部都是在栈顶,有堆栈指针SP指向栈顶, 比如响应中断时CPU将当前处理的数据全部压入堆栈,转而执行中断程序,等到中断程序执行结束,在用POP操作取出栈顶的数据,继续刚刚被中断的操作,这在微机中就是微机响应中断保护现场.
郯城县17133739601: 堆栈指示器SP的作用是什么? - ?
狄轻迈力: 堆栈是一种执行“后进先出”算法的数据结构.设想有一个直径不大、一端开口一端封闭的竹筒.有若干个写有编号的小球,小球的直径比竹筒的直径略小.现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿...
郯城县17133739601: 单片机种堆栈的作用,为什么搞个堆栈SP放那呢 - ?
狄轻迈力: 希望对你有帮助!别老说“堆栈堆栈”的,堆是堆,栈是栈,二者完全不是一个概念. SP是51单片机的栈指针,用于为程序的运行提供并维护栈(也就是通用的先进先出队列).51单片机的栈是向上生长的,所以一般连接器会在分配完所有的RAM块后将SP放在地址最高处.由于SP是个“指针”,所以栈操作都是间接寻址的. 对于C语言编程的用户而言,几乎不涉及到对SP的操作.
郯城县17133739601: stack pointer在计算机中指的是什么?有什么作用 - ?
狄轻迈力: stack pointer:堆栈指针在51系列单片机里,堆栈指针sp在片内RAM128B中开辟栈区,并随时跟踪栈顶地址.它是按"先进后出"的原则存取数据.开机复位后,单片机栈底地址为07H. 主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址. 堆栈指针总是指向栈顶元素.在51系列单片机中,堆栈是向上生长的,所以数据入栈的时候,堆栈指针先加1,再压栈. 出栈的时候先弹出数据,堆栈指针再减1. 但在AVR单片机中,堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1.参见百科:http://baike.baidu.com/view/2081454.htm