• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    ARM堆棧方式

    作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
    初學(xué)ARM指令時(shí),如果從字面上理解滿堆棧和空堆棧很有可能會(huì)歪曲它們的意思。可以想象一下,“滿堆棧”就是一個(gè)滿的堆棧,不能再存儲(chǔ)數(shù)據(jù)了;而“空堆棧”就是一個(gè)空的堆棧,沒(méi)有被使用的堆棧,呵呵,這樣理解的話那就錯(cuò)了。

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

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

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

    空堆棧(empty stack,"E")是指sp指向堆棧的第一個(gè)沒(méi)有使用的地址或者空位置(也就是說(shuō)sp指向堆棧最后一個(gè)數(shù)據(jù)項(xiàng)的下一個(gè)位置)。

    滿堆棧的關(guān)鍵詞是最后一個(gè)已使用的地址,空堆棧是第一個(gè)沒(méi)有使用的地址。

    存儲(chǔ)器堆??梢苑譃閮煞N:

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

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

    入棧規(guī)律:
    (1)滿堆棧操作先調(diào)整SP,然后存入數(shù)據(jù)。
    (2)空堆棧操作先存入數(shù)據(jù),然后調(diào)整SP。
    (3)遞增堆棧調(diào)整SP時(shí),執(zhí)行SP=SP+4
    (4)遞減堆棧調(diào)整SP時(shí),執(zhí)行SP=SP-4

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

    明確了這四個(gè)規(guī)律,就很容易分析各種堆棧尋址方式對(duì)應(yīng)的堆棧分布情況了。
    stmfd sp!, {r4-r11}

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

    假設(shè)初始SP為0x0400,那么執(zhí)行完畢后內(nèi)存0x03E4-0x0403保存寄存器R4-R11的內(nèi)容。
    實(shí)際應(yīng)用中,只選用一種方式使用就可以了。最常用最典型的就是后綴為“FD”時(shí)的結(jié)構(gòu),這是人們熟悉的堆棧結(jié)構(gòu)。
    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



    關(guān)鍵詞: ARM堆棧方

    評(píng)論


    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 乐都县| 吉林省| 来凤县| 渭源县| 徐州市| 潼关县| 通海县| 莆田市| 建始县| 衡南县| 湖北省| 宾阳县| 邵阳市| 南召县| 盖州市| 从江县| 阳东县| 宝清县| 赞皇县| 嘉祥县| 三台县| 同德县| 化隆| 靖州| 连山| 巴南区| 陇川县| 武山县| 津市市| 洱源县| 宜都市| 西城区| 西和县| 上林县| 加查县| 香河县| 祁阳县| 连州市| 虞城县| 南召县| 东海县|