堆栈的作用是用在调用子程序或中断程序时保护现场,因为51单片机的寄存器是十分有限的,而相对来说普通数据存储器更充足,通过入栈将寄存器中的内容临时保存到堆栈中(普通数据存储器),这是一个用时间换取空间的编程方式。
51单片机的堆栈是向上生长的,就是堆栈不为空时,栈底地址小于栈顶地址,当将数据入栈时,栈顶地址增加。还有一个技巧是,堆栈是数据存储器的一部分,也就是说堆栈除了利用push和pop访问,也可以通过普通的选址方法访问,例如mov。有时我们想访问堆栈数据,但不想改动变动栈顶,这时可以通过mov来访问数据。还有一个书上很少提到的知识点是出栈之后,原来那个栈顶的内容并不会清零,所以我们依然可以像对待普通数据存储器一样访问。
下面通过教科书上的一个变成例子讲解一下堆栈:
初始状态
(A)=02H,(SP)=52H,(51H)=FFH,(52H)=FFH
POP DPH
POP DPL
出栈两次,SP=SP-2=50H
MOV DPTR,#4000H
(DPTR)=4000H
RL A
(A)=04H
MOV B,A
(B)=04h
MOVC A,@A+DPTR
(A)=30H
PUSH Acc
SP=SP+1=51H,(51H)=30H
MOV A,B
(A)=04H
INC A
(A)=05H
MOVC A,@A+DPTR
(A)=50H
PUSH Acc
SP=SP+1=52H,(52H)=05H
RET
(PCH)=50H,(PCL)=30H,SP=SP-2=50H
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)