51单片机的堆栈操作

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

也就是说, 51单片机的堆栈, 是一个后进先出机制。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值