![]() |
發布時間: 2020-1-9 18:01
正文摘要:最近在研究RTOS,在程序中看到一個 POP 7 POP 6 POP ... ,請問大家這個7是什么,POP執行之后 什么會被動了什么? |
Y_G_G 發表于 2020-1-11 15:20 說的很清楚,哈哈,領教了 ![]() |
以常用的匯編中斷處理來說吧: 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,這兩條指令的順序是不能變的 總的來說,就是網上說的那樣:先進后出,自己慢慢理解一下,字打多了,我自己不知道自己在說什么了 |
笨笨兔 發表于 2020-1-10 08:53 抱歉,還沒有啥結果 |
hantu 發表于 2020-1-10 01:12 對匯編不太熟悉,仔細調試一下 |
mffhxa 發表于 2020-1-10 00:22 好的,多謝指教 |
POP PUSH指令研究: 就研究出來這樣的結果? |
單步調試一下不就看得清清楚楚的么 |
7、6、5.。。。。0應該是指工作寄存器,估計是指0組的R7、R6。。。。。R0,但POP后面直接用7表示R7的話,那必須頭文件里對R7的地址做好定義才行,其它特殊功能寄存器也是一樣。 |