歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

ARM BL或中斷返回需要注意的一些細節問題

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處理器的各個狀態下的寄存器示意圖

Copyright © Linux教程網 All Rights Reserved