以常用的汇编中断处理来说吧:
PUSH ACC ;把ACC压入栈
PUSH PSW ;把PSW压入栈
---------中间是某段代码-----
POP PSW ;把栈的值弹回PSW
POP ACC ;把栈的值弹回ACC
这就是汇编中的堆栈,它是一个处理事件的方
你不用管它是进入中断还是要干嘛,你只要知道它是这么一个过程就可以了:
1,把ACC压入栈,这个时候ACC在栈的最上面的地址,假设这个地址是:0 (PUSH ACC)
2,把PSW压入栈,这个时候,PSW就在刚才ACC呆的地址,ACC就被压到了下一个地址,那么:PSW在0地址,ACC在1地址,(PUSH PSW)
如果还有PUSH指令,之前入栈的值就会不断的向下压,压过头了,就没了,这就是常说的"溢出"
在8051系统里,堆栈是软件堆栈,它是由系统自动处理的,理论上来说程序空间有多大,它就能入栈多少次,但实际就100多地址可以放,足够绝大多数的程序了
而有的单片机系统是硬件堆栈,它有的只有三四层的堆栈,也就是说它只能PUSH三四次而已,像这种可以算是堆栈资源非常有限,编程就会有要求:禁止使用递归,中断里最好不有函数,处理什么东西最好是在中断外处理
3,POP PSW ;这个指令是:把堆栈的最顶层的数据弹回PSW,理解这个很重要,它是把地址0的数据传送到PSW,这是出栈的顺序
4,POP ACC ;把地址1的数据弹回ACC,这两条指令的顺序是不能变的
总的来说,就是网上说的那样:先进后出,自己慢慢理解一下,字打多了,我自己不知道自己在说什么了
|