ARM學習之數據棧的使用規則

關鍵詞: arm堆棧操作,堆棧嚴格來說應該叫做棧,棧(stack)是限定僅在一端進行插入或刪除操作的線性表。因此,對棧來說,可以進行插入或刪除操作的一端稱為棧頂(top),相應地,另一端稱為棧底(bottom)。不含元素的空表稱為空棧。由于堆棧只允許一端進行操作,因而按照后進先出(LIFO-last in first out)的原理運作。

  1. 根據堆棧指針指向位置的不同,堆棧可分為兩種:滿棧和空棧。
  • 滿棧(full):當堆棧指針指向棧頂元素 ,即指向 最后一個入棧的元素時,稱為滿棧;
  • 空棧(empty):當堆棧指針指向與棧頂元素相鄰的一個可用數據單元時,稱為空棧。
  1. 根據數據棧增長方向的不同也可分為遞增堆棧和遞減堆棧2種。
  • 遞減堆棧(descending):數據棧向內存地址減小的方向增長;
  • 遞增堆棧(ascending):數據棧向內存地址增加的方向增長。

綜合這兩種特點則可有以下4種規則:

縮寫 名稱 指令 含義
FD 滿遞減 stmfd/ldmfd 堆棧通過減小存儲器的地址向下增長,堆棧指針指向內含有效數據項的最低地址
ED 空遞減 stmed/ldmed 堆棧通過減小存儲器的地址向下增長,堆棧指針指向堆棧下的第一個空位置
FA 滿遞增 stmfa/ldmfa 堆棧通過增大存儲器的地址向上增長,堆棧指針指向內含有效數據項的最高地址
EA 空遞增 stmea/ldmea 堆棧通過增大村吃器的地址向上增長,堆棧指針指向堆棧上的第一個空位置

有一點是需要注意的,雖然ARM處理器核對于兩種生長方式的堆棧均支持,但ads的C語言編程只支持一種方式,即從上往下生長,并且必須是滿遞減堆棧。所以stmfd等指令用的最多。

ARMv7 cortex-A9架構下,APCS規定數據棧為滿遞減的。

ARM對于堆棧的操作一般采用ldmfd(pop)和stmfd(push)兩個命令,以前困惑的是stmfd對于操作數是按照什么順序壓棧的,比如:stmfd sp! {r0-r5, lr} 的進棧順序是:
a.

                            高地址
                              lr
                              r5
                              r4
                              ……
                              r0   <--sp
                              低地址

b.

                            高地址
                              r0
                              r1
                              r2
                              ……
                              lr  <--sp
                              低地址

現在通過下表就可以輕松解決這個問題:

尋址方式 說明 pop =ldm push =stm
fa 滿遞增 ldmfa ldmda stmfa stmib
fd 滿遞減 ldmfd ldmia stmfd stmdb
ea 空遞增 ldmea ldmdb stmea stmia
ed 空遞減 ldmed ldmib stmed stmda

說明:
a : after(后偏移指針)
b : before(先偏移指針)
i : increase(遞增 )
d : decrease(遞減)

根據圖表,可知stmfd對應的是stmdb,根據arm指令手冊,可知stmdb入棧順序是方式a,而 ldmfd對應的是ldmia,這樣這兩個操作就可以成功配對。

  1. 相關名詞:

數據棧指針: 最后一個寫入棧的數據的內存地址;
數據棧的基地址: 數據棧的最高地址,由于APCS中的數據棧是FD類型的,多以最早入棧的數據所占的內存單元的基地址的下一個內存單元。
數據棧界限: 數據棧中可使用的最低的內存單元地址;
已用的數據棧: 數據棧的基地址和數據棧的棧指針之間內存區域,包括棧指針對應的內存單元,但不包括基地址對應的內存單元。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容

  • 1.寫一個NSString類的實現 +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,786評論 2 37
  • 原文地址:C語言函數調用棧(一)C語言函數調用棧(二) 0 引言 程序的執行過程可看作連續的函數調用。當一個函數執...
    小豬啊嗚閱讀 4,650評論 1 19
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,371評論 0 35
  • 文/子荷 常聽人說,遇到個對你“如此這般好”的男人,就嫁了吧。 更俗一點的版本,是“XX歲了,也該嫁了。”或者“都...
    霍子荷閱讀 1,796評論 40 55
  • 癢 是方形的,是“一”、帶著褶皺 癢說 延展著的多,是一種錯誤 它們是可以被象吸塵器般地收進這“一”的。 忽然 “...
    李野航閱讀 429評論 0 0