找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 39985|回复: 8
打印 上一主题 下一主题
收起左侧

AT89S51单片机中SP的复位值07H是什么意思?初学,不是太懂

[复制链接]
跳转到指定楼层
楼主
ID:139137 发表于 2016-9-11 22:37 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AT89S51单片机中SP的复位值07H是什么意思?初学,不是太懂,见谅一下。

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-9-11 22:43 | 只看该作者
就是说单片机上电复位以后 sp这个寄存器的值就变成了07H
回复

使用道具 举报

板凳
ID:139137 发表于 2016-9-11 23:09 来自手机 | 只看该作者
admin 发表于 2016-9-11 22:43
就是说单片机上电复位以后 sp这个寄存器的值就变成了07H

值为07H是什么意思啊?这是一个地址么?还是什么?
回复

使用道具 举报

地板
ID:111634 发表于 2016-9-12 06:33 | 只看该作者
本帖最后由 zl2168 于 2016-9-12 07:05 编辑

首先要搞懂sp


堆栈指针SPStack Pointer


堆栈是CPU用于暂时存放特殊数据的“仓库”,如子程序断口地址,中断断口地址和其他需要保存的数据。在80C51中,堆栈由内RAM中若干连续存储单元组成,存储单元的个数称为堆栈的深度(可理解为仓库容量)。


堆栈指针SP专用于指出堆栈顶部数据的地址。无论存入还是取出数据,SP始终指向堆栈最顶部有效数据的地址。


堆栈中数据存取按先进后出、后进先出的原则。相当于冲锋枪的子弹夹,子弹一粒粒压进去,射击时,最后压进去的子弹先打出去(后进先出),最先压进去的子弹最后打出去(先进后出)。


堆栈操作分自动方式和指令方式。自动方式是在调用子程序或发生中断时,CPU自动将断口地址存入或者取出;指令方式是使用进出栈指令进行操作。

以上摘自张志良编著
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9

书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

5#
ID:111634 发表于 2016-9-12 06:38 | 只看该作者
本帖最后由 zl2168 于 2016-9-12 07:06 编辑

⒋ 堆栈操作指令


PUSH      direct                 ;SP+1SP,(direct)→(SP


POP       direct                 ;SP)→(direct),SP-1SP


说明:⑴ PUSH为入栈指令,是将其指定的直接寻址单元中的数据压入堆栈。由于80C51是向上生长型堆栈,所以进栈时堆栈指针要先加1,然后再将数据压入堆栈。例如,设堆栈原始状态如3-2a所示,(30H=2BH。执行指令:PUSH  30H。具体操作是:①先将堆栈指针SP的内容(0FH)加1,指向堆栈顶上的一个空单元,此时SP=10H,如3-2b所示;②然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。执行指令结果:(10H=2BHSP=10H,如3-2c所示。














POP为出栈指令,是将当前堆栈指针SP所指示单元中的数据弹出到指定的内RAM单元,然后将SP1SP始终指向栈顶地址。例如,设堆栈原始状态如3-3a所示,SP=0FH,(0FH=4CH,执行指令:POP  40H。具体操作是:①先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H=4CH3-3b所示;②然后SP-1→SPSP=0EHSP仍指向栈顶地址,0FH中数据不变,仍等于4CH,但已作废,3-3c所示。

























由于堆栈操作时只能以直接寻址方式来取得操作数,故不能用累加器A和工作寄存器Rn作为操作对象。若要把A的内容推入堆栈,应用指令“PUSH  ACC”,这里ACC表示A的直接地址E0H。若要把R0的内容推入堆栈,应用指令“PUSH  00H”,这里00H表示R0的直接地址(设当前工作寄存器区为0区)。


3-8】已知SP=60H,求执行下列程序指令后的结果。


MOV      DPTR,#1234H        ;DPTR=1234HDPH=12HDPL=34H


PUSH      DPH                ;SP+1SPSP=61H,(DPH)→(SP),(SP=61H=12H


PUSH      DPL                 ;SP+1SPSP=62H,(DPL)→(SP),(SP=62H=34H


MOV      DPTR,#5678H        ;DPTR=5678H


POP       DPH                ;DPH=62H=34HSP-1SPSP=61H


POP       DPL                 ;DPL=61H=12HSP-1SPSP=60H


执行结果:SP=60H,不变;DPTR=3412H。由于堆栈先进后出、后进先出的操作原则,出栈时,先出的DPH装入了后进的原DPL的内容(34H);而后出的DPL装入了先进的原DPH的内容(12H)。
以上摘自张志良编著
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9

书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

6#
ID:111634 发表于 2016-9-12 06:54 | 只看该作者
本帖最后由 zl2168 于 2016-9-12 07:07 编辑

堆栈指针SP设置在内RAM(内RAM地址为00H~7FH)什么区域呢?

复位后 SP值为07H,表明堆栈底部在07H。对于汇编程序,要考虑堆栈的重新设置。若SP=07H,就会占用原属于工作寄存器区的08H1FH单元和20H以上的位寻址区,妨碍工作寄存器和位寻址区的特殊功能。因此,在汇编程序初始化中,必须改变SP值,一般可置SP值为50H60H,堆栈深度相应为48字节和32字节。对于C51程序,编译器会自动安排堆栈,即不需要考虑堆栈如何设置。





以上摘自张志良编著
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9

书中电路和程序设计有详细说明,程序语句条条有注解。





回复

使用道具 举报

7#
ID:139137 发表于 2016-9-12 09:03 来自手机 | 只看该作者
zl2168 发表于 2016-9-12 06:54
堆栈指针SP设置在内RAM(内RAM地址为00H~7FH)什么区域呢?

复位后 SP值为07H,表明堆栈底部在07H。对于 ...

感谢感谢,虽然还有一些不懂得地方,但是大体知道怎么回事了,谢谢大神
回复

使用道具 举报

8#
ID:139160 发表于 2016-9-12 10:47 | 只看该作者
同求~~~~~
回复

使用道具 举报

9#
ID:7485 发表于 2016-9-12 11:27 | 只看该作者
本帖最后由 ahshmj 于 2016-9-12 11:28 编辑

sp是堆栈寄存器。默认的堆栈栈底地址是片内RAM的07H单元。

由于堆栈操作时(硬件自动)先将地址加1然后存储,所以实际默认的是从08H开始写入,往上逐字节写入。

由于单片机的结构决定,00H~2FH功能较多,有其他更重要的事情分派,所以一般可以放到5FH以上的地址上。

又由于出栈也是间接寻址方式,所以,像at80c52系列的单片机,片内有256字节的RAM,堆栈栈底也可以放到7FH以上只要栈顶不超过0FFH即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表