|
以常用的匯編中斷處理來說吧:
PUSH ACC ;把ACC壓入棧
PUSH PSW ;把PSW壓入棧
---------中間是某段代碼-----
POP PSW ;把棧的值彈回PSW
POP ACC ;把棧的值彈回ACC
這就是匯編中的堆棧,它是一個處理事件的方
你不用管它是進入中斷還是要干嘛,你只要知道它是這么一個過程就可以了:
1,把ACC壓入棧,這個時候ACC在棧的最上面的地址,假設(shè)這個地址是:0 (PUSH ACC)
2,把PSW壓入棧,這個時候,PSW就在剛才ACC呆的地址,ACC就被壓到了下一個地址,那么:PSW在0地址,ACC在1地址,(PUSH PSW)
如果還有PUSH指令,之前入棧的值就會不斷的向下壓,壓過頭了,就沒了,這就是常說的"溢出"
在8051系統(tǒng)里,堆棧是軟件堆棧,它是由系統(tǒng)自動處理的,理論上來說程序空間有多大,它就能入棧多少次,但實際就100多地址可以放,足夠絕大多數(shù)的程序了
而有的單片機系統(tǒng)是硬件堆棧,它有的只有三四層的堆棧,也就是說它只能PUSH三四次而已,像這種可以算是堆棧資源非常有限,編程就會有要求:禁止使用遞歸,中斷里最好不有函數(shù),處理什么東西最好是在中斷外處理
3,POP PSW ;這個指令是:把堆棧的最頂層的數(shù)據(jù)彈回PSW,理解這個很重要,它是把地址0的數(shù)據(jù)傳送到PSW,這是出棧的順序
4,POP ACC ;把地址1的數(shù)據(jù)彈回ACC,這兩條指令的順序是不能變的
總的來說,就是網(wǎng)上說的那樣:先進后出,自己慢慢理解一下,字打多了,我自己不知道自己在說什么了
|
|