深入理解SP、LR和PC

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

   PC 代表程序計數器,流水線使用三個階段,因此指令分爲三個階段執行:1.取指(從存儲器裝載一條指令);2.譯碼(識別將要被執行的指令);3.執行(處理 指令並將結果寫回寄存器)。而R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定 將“正在執行的指令作爲參考點”,稱之爲當前第一條指令,因此PC總是指向第三條指令。當ARM狀態時,每條指令爲4字節長,所以PC始終指向該指令地址 加8字節的地址,即:PC值=當前程序執行位置+8;

    ARM指令是三級流水線,取指,譯指,執行時同時執行的,現在PC指向的是正在取指的地址,那麼cpu正在譯指的指令地址是PC-4(假設在ARM狀態 下,一個指令佔4個字節),cpu正在執行的指令地址是PC-8,也就是說PC所指向的地址和現在所執行的指令地址相差8。
    當突然發生中斷的時候,保存的是PC的地址
    這樣你就知道了,如果返回的時候返回PC,那麼中間就有一個指令沒有執行,所以用SUB pc lr-irq #4。



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,否則後果不可預測。

ARM處理器使用流水線來增加處理器指令流的速度,這樣可使幾個操作同時進行,並使處理與存儲器系統之間的操作更加流暢,連續,能提供0.9MIPS/MHZ的指令執行速度。

 


轉載自網絡

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