學習ARM尋址方式的時候,裏面有種尋址爲堆棧尋址。學習
ARM7中的寄存器R13就是做爲堆棧指針SP的。堆棧內容的增減,就會影響堆棧指針的移動。這個移動方向與堆棧的生長方向有關。spa
ARM7的有兩種堆棧生長方向。指針
1.向上生長 在像堆棧寫入數據後,堆棧指針的值變大,也就是向高地址方向生長,這種是遞增堆棧。編譯器
2.向下生長 在像堆棧寫入數據後,堆棧指針的值變小,也就是向低地址方向生長,這種是遞減堆棧。it
要注意的問題不單單是堆棧增加方向。還要考慮到堆棧指針指向的存儲單元是否已經保存有堆棧數據,或者說入棧時是否能夠直接向堆棧指針指向的存儲單元寫入數據。這就是「滿堆棧」與「空堆棧」。編譯
1.滿堆棧 堆棧指針指向最後壓入棧的有效數據項,稱爲滿堆棧。此時堆棧入棧操做要先調整指針再寫入數據;im
2.空堆棧 堆棧指針指向下一個待壓入數據的空位置,稱爲空堆棧。此時堆棧的入棧操做的入棧操做要先先寫入數據再調整指針。數據
綜合以上敘述,就能夠獲得四種堆棧類型,分別爲滿遞增,空遞增,滿遞減,空遞減。img
而後我想到了uc/OS-II中就有與堆棧類型密切相關的東西,移植ucOS-II到相應平臺上,就要考慮到堆棧類型。我看書上說到ADS1.2堆棧類型只支持滿遞減。此時個人問題就出來了,堆棧類型具體應該是跟MCU有關,而不一樣的編譯器又支持不一樣的類型,是否是這樣呢,最後我在ADS1.2文件的一個講ATPCS的PDF中找到了答案,原來就是這樣,ADS1.2只能滿遞減。一下就是PDF中的截圖。截圖