初學ARM指令時,如果從字面上理解滿堆棧和空堆棧很有可能會歪曲它們的意思。可以想象一下,“滿堆棧”就是一個滿的堆棧,不能再儲存資料了;而“空堆棧”就是一個空的堆棧,沒有被使用的堆棧,呵呵,這樣理解的話那就錯了。
實際上“滿堆棧”和“空堆棧”確切的說應該是“滿棧”或者是“空棧”,我們只是習慣了把棧叫做堆棧。而二者深層的意思是說的“位置”或者“地址”,而不是“堆棧”。如果叫“滿位置”或者“空位置”更容易理解一些。下面是《ARM嵌入式系統開發 --軟體設計與最佳化》書中給的解釋:
滿堆棧(full stack,“F”)是指堆棧指標指向堆棧的最後一個已使用的地址或者滿位置(也就是sp指向堆棧最後一個資料項目位置)。
空堆棧(empty stack,"E")是指sp指向堆棧的第一個沒有使用的地址或者空位置(也就是說sp指向堆棧最後一個資料項目的下一個位置)。
滿堆棧的關鍵詞是最後一個已使用的地址,空堆棧是第一個沒有使用的地址。
ARM體繫結構使用多寄存器指令load-store來完成堆棧操作。在指令上加上尾碼FA、FD、EA、ED(F-滿位置,E-空位置,-遞增,D-遞減)來表示sp指標的定址方式,如FA表示遞增滿。
下面是 《ARM嵌入式系統開發 --軟體設計與最佳化》書中的兩個例子,但是第一個例子好像是有錯誤。將sp=0x00080014寫成了0x00000004,這裡改正過來了。其中1例子說明滿棧,2例子說明了空棧。
例1
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080014
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x0008000c
例2
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080010
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080008