新聞中心

        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堆棧方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 子长县| 嘉义市| 资阳市| 安乡县| 巧家县| 宝坻区| 东阳市| 宁津县| 仲巴县| 罗平县| 临潭县| 加查县| 勐海县| 秭归县| 铅山县| 团风县| 钦州市| 锡林郭勒盟| 江孜县| 江北区| 乐清市| 泾阳县| 建阳市| 乐东| 云霄县| 阜平县| 焦作市| 龙游县| 墨江| 徐汇区| 武胜县| 商南县| 齐齐哈尔市| 双柏县| 密云县| 行唐县| 图片| 宁化县| 苏尼特左旗| 民勤县| 镇宁|