标题: AT89S51单片机中SP的复位值07H是什么意思?初学,不是太懂 [打印本页]
作者: 李小宁 时间: 2016-9-11 22:37
标题: AT89S51单片机中SP的复位值07H是什么意思?初学,不是太懂
AT89S51单片机中SP的复位值07H是什么意思?初学,不是太懂,见谅一下。
作者: admin 时间: 2016-9-11 22:43
就是说单片机上电复位以后 sp这个寄存器的值就变成了07H
作者: 李小宁 时间: 2016-9-11 23:09
admin 发表于 2016-9-11 22:43
就是说单片机上电复位以后 sp这个寄存器的值就变成了07H
值为07H是什么意思啊?这是一个地址么?还是什么?
作者: zl2168 时间: 2016-9-12 06:33
本帖最后由 zl2168 于 2016-9-12 07:05 编辑
首先要搞懂sp
⑸ 堆栈指针SP(Stack Pointer)
堆栈是CPU用于暂时存放特殊数据的“仓库”,如子程序断口地址,中断断口地址和其他需要保存的数据。在80C51中,堆栈由内RAM中若干连续存储单元组成,存储单元的个数称为堆栈的深度(可理解为仓库容量)。
堆栈指针SP专用于指出堆栈顶部数据的地址。无论存入还是取出数据,SP始终指向堆栈最顶部有效数据的地址。
堆栈中数据存取按先进后出、后进先出的原则。相当于冲锋枪的子弹夹,子弹一粒粒压进去,射击时,最后压进去的子弹先打出去(后进先出),最先压进去的子弹最后打出去(先进后出)。
堆栈操作分自动方式和指令方式。自动方式是在调用子程序或发生中断时,CPU自动将断口地址存入或者取出;指令方式是使用进出栈指令进行操作。
以上摘自张志良编著
《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-9-12 06:38
本帖最后由 zl2168 于 2016-9-12 07:06 编辑
⒋ 堆栈操作指令
PUSH direct ;SP+1→SP,(direct)→(SP)
POP direct ;(SP)→(direct),SP-1→SP
说明:⑴ PUSH为入栈指令,是将其指定的直接寻址单元中的数据压入堆栈。由于80C51是向上生长型堆栈,所以进栈时堆栈指针要先加1,然后再将数据压入堆栈。例如,设堆栈原始状态如图3-2a所示,(30H)=2BH。执行指令:PUSH 30H。具体操作是:①先将堆栈指针SP的内容(0FH)加1,指向堆栈顶上的一个空单元,此时SP=10H,如图3-2b所示;②然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。执行指令结果:(10H)=2BH,SP=10H,如图3-2c所示。
⑵ POP为出栈指令,是将当前堆栈指针SP所指示单元中的数据弹出到指定的内RAM单元,然后将SP减1,SP始终指向栈顶地址。例如,设堆栈原始状态如图3-3a所示,SP=0FH,(0FH)=4CH,执行指令:POP 40H。具体操作是:①先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H)=4CH,如图3-3b所示;②然后SP-1→SP,SP=0EH,SP仍指向栈顶地址,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=1234H,DPH=12H,DPL=34H
PUSH DPH ;SP+1→SP,SP=61H,(DPH)→(SP),(SP)=(61H)=12H
PUSH DPL ;SP+1→SP,SP=62H,(DPL)→(SP),(SP)=(62H)=34H
MOV DPTR,#5678H ;DPTR=5678H
POP DPH ;DPH=(62H)=34H,SP-1→SP,SP=61H
POP DPL ;DPL=(61H)=12H,SP-1→SP,SP=60H
执行结果:SP=60H,不变;DPTR=3412H。由于堆栈先进后出、后进先出的操作原则,出栈时,先出的DPH装入了后进的原DPL的内容(34H);而后出的DPL装入了先进的原DPH的内容(12H)。
以上摘自张志良编著
《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-9-12 06:54
本帖最后由 zl2168 于 2016-9-12 07:07 编辑
堆栈指针SP设置在内RAM(内RAM地址为00H~7FH)什么区域呢?
复位后 SP值为07H,表明堆栈底部在07H。对于汇编程序,要考虑堆栈的重新设置。若SP=07H,就会占用原属于工作寄存器区的08H~1FH单元和20H以上的位寻址区,妨碍工作寄存器和位寻址区的特殊功能。因此,在汇编程序初始化中,必须改变SP值,一般可置SP值为50H或60H,堆栈深度相应为48字节和32字节。对于C51程序,编译器会自动安排堆栈,即不需要考虑堆栈如何设置。
以上摘自张志良编著
《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: 李小宁 时间: 2016-9-12 09:03
zl2168 发表于 2016-9-12 06:54
堆栈指针SP设置在内RAM(内RAM地址为00H~7FH)什么区域呢?
复位后 SP值为07H,表明堆栈底部在07H。对于 ...
感谢感谢,虽然还有一些不懂得地方,但是大体知道怎么回事了,谢谢大神
作者: mine12 时间: 2016-9-12 10:47
同求~~~~~
作者: ahshmj 时间: 2016-9-12 11:27
本帖最后由 ahshmj 于 2016-9-12 11:28 编辑
sp是堆栈寄存器。默认的堆栈栈底地址是片内RAM的07H单元。
由于堆栈操作时(硬件自动)先将地址加1然后存储,所以实际默认的是从08H开始写入,往上逐字节写入。
由于单片机的结构决定,00H~2FH功能较多,有其他更重要的事情分派,所以一般可以放到5FH以上的地址上。
又由于出栈也是间接寻址方式,所以,像at80c52系列的单片机,片内有256字节的RAM,堆栈栈底也可以放到7FH以上只要栈顶不超过0FFH即可。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |