ARM 核心SP,LR,PC暫存器
轉載 https://blog.csdn.net/allan0508/article/details/52624618
ARM 核心SP,LR,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 也可以用做通用資料暫存器。