51单片机的堆栈结构属于向上生长,也就是说, 每压进一个数据, 堆栈指针的内容自动加一。
也就是说, 堆栈指针永远指向栈顶。(即栈顶在内部RAM中的地址位置)
***************************************************************************************
进栈出栈指令:
PUSH driect进栈指令,操作数是一个直接地址,即:将该地址上的内容送到堆栈指针SP所指向的存储单元中。(注意:SP指针指向的地址应先加一后, 再将driect地址上的内容压入sp此时指向的地址)
POP direct 出栈指令, 操作数是一个直接地址,即:将堆栈指针指的地址上的值,弹入direct地址。之后,SP指针减一。
************************************************************************************************
举例:
RAM区中开辟一段地址4000H-4005H, 对应的内容: 4000H:0FAH, 4001H:0FBH, 4002H:0FCH, 4003H:0FDH, 4004H:0FEH,
开辟堆栈位置, 从0000H开始,到0005H。
即堆栈指针SP起始地址:0000H
(这里只是为方便理解举例, 实际上00H的位置是工作组寄存器,绝对不能进行压栈。压栈的起始实际地址应是用户RAM区, 也就是30H起步。 因此这里为了避免误解, 使用了一个明显假的32位的举例地址0000H(因为51中片内RAM是没有32位地址的))
**********************************************************************************************
操作开始:
栈顶现在是0000H, 进行压栈:
PUSH 4000H;此时:栈顶地址(也就是SP指向的地址)是0001H,上面的内容是:0FAH
PUSH 4001H; 此时:栈顶地址(也就是SP指向的地址)是0002H,上面的内容是:0FBH
PUSH 4002H;此时:栈顶地址(也就是SP指向的地址)是0003H,上面的内容是:0FCH
PUSH 4003H; 此时:栈顶地址(也就是SP指向的地址)是0004H,上面的内容是:0FDH
PUSH 4004H;此时:栈顶地址(也就是SP指向的地址)是0005H,上面的内容是:0FEH
此时压栈结束,堆栈指针指向的地址是0005H, 也就是栈顶。 里面的内容是刚刚从4004H这个地址上拿的内容。(也就是说, 由于堆栈指针每向堆栈压入一个字节的数据, SP都会加一,因此, 堆栈指针永远指向栈顶位置, 本例中:0005H)
下面开始出栈:
使用POP direct指令, 此时sp指针指向栈顶0005H位置
POP 4004H;即将0005H上的内容0FEH 弹到4004H这个位置上,之后SP指针减一。
POP 4003H;即将0004H上的内容0FDH 弹到4003H这个位置上,之后SP指针减一。
POP 4002H;即将0003H上的内容0FCH 弹到4002H这个位置上,之后SP指针减一。
POP 4001H;即将0002H上的内容0FBH 弹到4001H这个位置上,之后SP指针减一。
POP 4000H;即将0001H上的内容0FAH 弹到4000H这个位置上,之后SP指针减一。
可见, 第一个弹出的, 是栈顶0005H这个地址上存的内容。 这个内容是刚刚从4004H这个地址上拿的内容, 也就是说, 弹出的,是最后进栈的一个数据。 随着不断的弹出, 最后弹出的, 是最先进栈的内容:0FAH文章来源:https://www.toymoban.com/news/detail-487466.html
也就是说, 51单片机的堆栈, 是一个后进先出机制。文章来源地址https://www.toymoban.com/news/detail-487466.html
到了这里,关于51单片机的堆栈操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!