當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊(full stack);
當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊(empty stack)。
同時,根據堆疊的生成方式,又可以分為遞增堆疊(ascending stack)和遞減堆疊(decendingstack)。
當堆疊由低位址向高位址生成時,稱為遞增堆疊,當堆疊由高位址向低位址生成時,稱為遞減堆疊。
這樣就有四種型別的堆疊工作方式,arm 微處理器支援這四種型別的堆疊工作方式,
即:◎ full descending 滿遞減堆疊——fd 堆疊首部是高位址,堆疊向低位址增長。棧指標總是指向堆疊最後乙個元素(最後乙個元素是最後壓入的資料)。 arm-thumb過程呼叫標準和arm、thumb c/c++ 編譯器總是使用full descending 型別堆疊。
◎ full ascending 滿遞增堆疊——fa 堆疊首部是低位址,堆疊向高位址增長。棧指標總是指向堆疊最後乙個元素(最後乙個
是最後壓入的資料)。
◎ empty descending 空遞減堆疊——ed 堆疊首部是高位址,堆疊向低位址增長。棧指標總是指向下乙個將要放入資料的空位置。
◎ empty ascending 空遞增堆疊——ea 堆疊首部是低位址,堆疊向高位址增長。棧指標總是指向下乙個將要放入資料的空位置。
在arm中,一般是滿堆疊,堆疊生長方向是從上向下遞減的(51相反為遞增),在作業系統的一直過程中,與cpu相關部分的一直肯定會涉及到堆疊生長方向的定義。
在arm中我們定義如下:
#define os_stk_growth 1 //從上向下遞減 ucos51中相同的定義如下:
#define os_stk_growth 0 //從下向上遞增
一直對arm 的堆疊操作有很多疑惑,這幾天終於沒有客戶來煩了,拿出書來研究了一下,發現原來理解上有誤區。這裡寫一些讀書筆記,算是幫自己記錄一下吧。
arm堆疊的組織結構是 滿棧降 的形式,滿棧即sp是要停留在最後乙個進棧元素,降:就是堆疊的增長方向是從高位址向低位址發展。 arm對於堆疊的操作一般採用 ldmfd(pop)和stmfd (push) 兩個命令。 以前困惑的就是stmfd 命令 對於運算元 是按照什麼順序壓棧的
比如:stmfd sp! 進棧順序是:
高位址(1方式) lr r5 r4 ``````` r0
高位址(2方式) r0 r1 ``` r5 lr
現在通過下表,可以輕鬆的解決這個問題:
定址方式
說明
pop
=ldm
push
=stm
fa
遞增滿
ldmfa
ldmda
stmfa
stmib
fd
遞減滿
ldmfd
ldmia
stmfd
s***b
ea
遞增空
ldmea
ldmdb
stmea
stmia
ed
遞減空
ldmed
ldmib
stmed
s***a
可以輕鬆的解決這個問題: 定址方式說明 pop =ldm push =stm fa 遞增滿 ldmfa ldmda stmfa stmib fd 遞減滿 ldmfd ldmia stmfd s***b ea 遞增空 ldmea ldmdb stmea stmia ed 遞減空 ldmed ldmib stmed s***a 按照圖表,可知 stmfd對應的是s***b,根據arm指令手冊,可知s***b入棧順序是(1方式) 而ldmfd對應的是ldmia,這樣這兩個操作就可以成功配對:
ARM堆疊方式
當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊 full stack 而當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊 empty stack 同時,根據堆疊的生成方式,又可以分為遞增堆疊 ascending stack 和遞減堆疊 decendingstack 當堆疊由低位址向高位址生成時...
arm堆疊的增長方式
堆疊是一種資料結構,按先進後出 first in last out,filo 的方式工作,使用乙個稱作堆疊指標的專用暫存器指示當前的操作位置,堆疊指標總是指向棧頂。當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊 full stack 而當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊 empt...
arm堆疊操作
arm堆疊的組織結構是 滿棧降的形式,滿棧即sp是要停留在最後乙個進棧元素,降 就是堆疊的增長方向是從高位址向低位址發展。arm對於堆疊的操作一般採用 ldmfd pop 和stmfd push 兩個命令。指令stmfd和ldmfd分析 根據atpcs規則,我們一般使用fd full descend...