前言
在操作系統(tǒng)中必然設計多任務的切換,在任務切換時,系統(tǒng)會把當前任務的現(xiàn)場數(shù)據(jù)保存在該任務的任務棧里,便于下次載入該任務時的運行環(huán)境設定。任務棧的棧頂指針一般保存在任務控制塊中(Task Control Block,TCB
))。任務切換會改變CPU的PC、SP和各種寄存器,本文簡單對LR、PC和SP寄存器進行介紹。
1. LR
LR用途有二,一是保存子程序返回地址,當調用BL、BX、BLX等跳轉指令時會自動保存返回地址到LR;二是保存異常發(fā)生的異常返回地址。
2. PC
PC(Program Counter)為程序計數(shù)器,用于保存程序的執(zhí)行地址,在ARM的三級流水線架構中,程序流水線包括取址、譯碼和執(zhí)行三個階段,PC指向的是當前取址的程序地址,所以32位ARM中,譯碼地址(正在解析還未執(zhí)行的程序)為PC-4,執(zhí)行地址(當前正在執(zhí)行的程序地址)為PC-8。
當突然發(fā)生中斷的時候,保存的是PC的地址。如果返回的時候返回PC,那么中間就有一個指令沒有執(zhí)行,所以用SUB pc lr-irq #4。
3. SP
每一種異常模式都有其自己獨立的r13,它通常指向異常模式所專用的堆棧,也就是說五種異常模式、非異常模式(用戶模式和系統(tǒng)模式),都有各自獨立的堆棧,用不同的堆棧指針來索引。這樣當ARM進入異常模式的時候,程序就可以把一般通用寄存器壓入堆棧,返回時再出棧,保證了各種模式下程序的狀態(tài)的完整性。