新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM堆棧方式

        ARM堆棧方式

        作者: 時間:2016-11-11 來源:網絡 收藏
        初學ARM指令時,如果從字面上理解滿堆棧和空堆棧很有可能會歪曲它們的意思。可以想象一下,“滿堆棧”就是一個滿的堆棧,不能再存儲數據了;而“空堆棧”就是一個空的堆棧,沒有被使用的堆棧,呵呵,這樣理解的話那就錯了。

        實際上“滿堆棧”和“空堆棧”確切的說應該是“滿棧”或者是“空棧”,我們只是習慣了把棧叫做堆棧。而二者深層的意思是說的“位置”或者“地址”,而不是“堆棧”。如果叫“滿位置”或者“空位置”更容易理解一些。下面是《ARM嵌入式系統開發 --軟件設計與優化》書中給的解釋:

        本文引用地址:http://www.104case.com/article/201611/316669.htm

        滿堆棧(full stack,“F”)是指堆棧指針指向堆棧的最后一個已使用的地址或者滿位置(也就是sp指向堆棧最后一個數據項位置)。

        空堆棧(empty stack,"E")是指sp指向堆棧的第一個沒有使用的地址或者空位置(也就是說sp指向堆棧最后一個數據項的下一個位置)。

        滿堆棧的關鍵詞是最后一個已使用的地址,空堆棧是第一個沒有使用的地址。

        存儲器堆棧可以分為兩種:

        一種是向上生長,就是向著高地址方向生長,稱為遞增堆棧。
        一種是向下生長,就是向著低地址方向生長,稱為遞減堆棧。

        這樣,就有四種組合:滿遞增(FA)、空遞增(EA)、滿遞減(FD)、空遞減(ED)。

        入棧規律:
        (1)滿堆棧操作先調整SP,然后存入數據。
        (2)空堆棧操作先存入數據,然后調整SP。
        (3)遞增堆棧調整SP時,執行SP=SP+4
        (4)遞減堆棧調整SP時,執行SP=SP-4

        出棧規律正好與入棧相反,也就是入棧的逆操作。
        (1)空堆棧操作先調整SP,然后存入數據。
        (2)滿堆棧操作先存入數據,然后調整SP。
        (3)遞減堆棧調整SP時,執行SP=SP+4
        (4)遞增堆棧調整SP時,執行SP=SP-4

        明確了這四個規律,就很容易分析各種堆棧尋址方式對應的堆棧分布情況了。
        stmfd sp!, {r4-r11}

        假設初始SP為0x0400,那么執行完畢后內存0x03E0-0x03FF保存寄存器R4-R11的內容。
        stmed sp!, {r4-r11}

        假設初始SP為0x0400,那么執行完畢后內存0x03E4-0x0403保存寄存器R4-R11的內容。
        實際應用中,只選用一種方式使用就可以了。最常用最典型的就是后綴為“FD”時的結構,這是人們熟悉的堆棧結構。
        stmfd sp!, {r4-r11, lr}
        ldmfd sp!, {r4-r11, lr}

        例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



        關鍵詞: ARM堆棧方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 寿阳县| 沛县| 德昌县| 百色市| 吐鲁番市| 靖远县| 荆门市| 化德县| 宾阳县| 普兰县| 永吉县| 深圳市| 嵩明县| 广南县| 蒲江县| 武隆县| 孝感市| 瑞金市| 彰武县| 永济市| 长阳| 银川市| 上蔡县| 溧阳市| 米林县| 界首市| 高碑店市| 罗城| 益阳市| 阿鲁科尔沁旗| 林州市| 乌鲁木齐县| 新和县| 全南县| 墨竹工卡县| 齐齐哈尔市| 正安县| 习水县| 华阴市| 区。| 观塘区|