1: ARM3級流水線
由ARM7-TDMI-S技術參考手冊P2可知,ARM的流水線結構為:
取指----->譯碼------>執行
ARM代碼: PC PC- 4 PC - 8
0x1008 0x1004 0x1000
在此頁,還注明,PC是指向被取指的指令,而不是正在執行的指令。(也就是說在此 PC值為0x1008 ?)
2: 當發生BL跳轉前,會在寄存器 R14 (即LR)中保存當前PC-4,即bl跳轉指令的下一條指令的地址。所以在返回時只要 MOV pc,lr
3:中斷
(1)當發生中斷的時候,把是寄存器pc當前值存入LR(此時的LR是中斷模式下的LR),所以返回時,應該是將LR-4賦值給PC。(0x1004)注:有些異常中斷可能要將LR-8或LR賦值給PC。詳細請仔細看ARM數據手冊。
(2)當發生IRQ或FIQ後,系統要進入相應的異常模式進行處理,這些是由硬件實現的。
產生異常後,ARM核會做以下工作:
<1>. 將當前的地址加4或者加8存到LR寄存器裡,即把當前狀態下下一條指令的地址存入LR
<2>. 將CPSR復制到SPSR,
<3>. 然後將異常模式的狀態強制寫入CPSR
<4>. 強制PC從相關的異常向量處取指!!
中斷結束後:
1. 將SPSR復制回CPSR
2. 開中斷
3. 返回原程序,LDR PC,LR
4:因為每個模式下面都有LR,所以當返回原來模式時,原來模式下的LR並沒有被破壞。
上圖為ARM處理器的各個狀態下的寄存器示意圖