LR SP PC

LR SP PC

深入理解ARM的這三個寄存器,對編程以及操作系統的移植都有很大的裨益。

    1、堆棧指針r13(SP):每一種異常模式都有其自己獨立的r13,它通常指向異常模式所專用的堆棧,也就是說五種異常模式、非異常模式(用戶模式和系統模式),都有各自獨立的堆棧,用不同的堆棧指針來索引。這樣當ARM進入異常模式的時候,程序就可以把一般通用寄存器壓入堆棧,返回時再出棧,保證了各種模式下程序的狀態的完整性。

    2、連接寄存器r14(LR):每種模式下r14都有自身版組,它有兩個特殊功能。

    (1)保存子程序返回地址。使用BL或BLX時,跳轉指令自動把返回地址放入r14中;子程序通過把r14複製到PC來實現返回,通常用下列指令之一:
                        MOV PC, LR 
                        BX LR

    通常子程序這樣寫,保證了子程序中還可以調用子程序。
                         stmfd sp!, {lr}
                         ……
                         ldmfd sp!, {pc}

    (2)當異常發生時,異常模式的r14用來保存異常返回地址,將r14如棧可以處理嵌套中斷。

    3、程序計數器r15(PC):PC是有讀寫限制的。當沒有超過讀取限制的時候,讀取的值是指令的地址加上8個字節,由於ARM指令總是以字對齊的,故bit[1:0]總是00。當用str或stm存儲PC的時候,偏移量有可能是8或12等其它值。在V3及以下版本中,寫入bit[1:0]的值將被忽略,而在V4及以上版本寫入r15的bit[1:0]必須爲00,否則後果不可預測。

 

    堆棧是一種具有“後進先出”(LIFO---Last In First Out)特殊訪問屬性的存儲結構。堆棧一般使用RAM 物理資源作爲存儲體,再加上LIFO 訪問接口實現。

                                    


    堆棧的實現方法:
    在隨機存儲器區劃出一塊區域作爲堆棧區,數據可以一個個順序地存入(壓入)到這個區域之中,這個過程稱爲‘壓棧’(push )。通常用一個指針(堆棧指針 SP---Stack  Pointer)實現做一次調整,SP  總指向最後一個壓入堆棧的數據所在的數據單元(棧頂)。從堆棧中讀取數據時,按照堆棧 指針指向的堆棧單元讀取堆棧數據,這個過程叫做 ‘彈出’(pop ),每彈出一個數據,SP 即向相反方向做一次調整,如此就實現了後進先出的原則。

    堆棧是計算機中廣泛應用的技術,基於堆棧具有的數據進出LIFO特性,常應用於保存中斷斷點、保存子程序調用返回點、保存CPU現場數據等,也用於程序間傳遞參數。
    ARM處理器中通常將寄存器R13作爲堆棧指針(SP)。ARM處理器針對不同的模式,共有 6 個堆棧指針(SP),其中用戶模式和系統模式共用一個SP,每種異常模式都有各自專用的R13寄存器(SP)。它們通常指向各模式所對應的專用堆棧,也就是ARM處理器允許用戶程序有六個不同的堆棧空間。這些堆棧指針分別爲R13、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq,如表2-3    堆棧指針寄存器所示。 

    爲了更準確地描述堆棧,根據“壓棧”操作時堆棧指針的增減方向,將堆棧區分爲‘遞增堆棧’(SP 向大數值方向變化)和‘遞減堆棧’(SP 向小數值方向變化);又根據SP 指針指向的存儲單元是否含有堆棧數據,又將堆棧區分爲‘滿堆棧’(SP 指向單元含有堆棧有效數據)和‘空堆棧’(SP 指向單元不含有堆棧有效數據)。
    這樣兩兩組合共有四種堆棧方式——滿遞增、空遞增、滿遞減和空遞減。
     ARM處理器的堆棧操作具有非常大的靈活性,對這四種類型的堆棧都支持。
    ARM處理器中的R13被用作SP。當不使用堆棧時,R13 也可以用做通用數據寄存器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章