arm處理器使用流水線來增加處理器指令流的速度,這樣可使幾個操作同時進行,並使處理與儲存器系統之間的操作更加流暢,連續,能提供0.9mips/mhz的指令執行速度
pc代表程式計數器,流水線使用三個階段,因此指令分為三個階段執行:1、取指(從儲存器裝載一條指令);2、解碼(識別將要被執行的指令,得到下一指令佔據資料路徑,暫存器被讀取,運算元在桶式移位器中被以為。alu產生相應的運算結果並寫回到目的暫存器中,alu結果根據指令需求更改狀態暫存器的條件位)。而r15(pc)總是指向「正在取指」的指令,而不是指向「正在執行」的指令或正在「解碼」的指令。一般來說,人們習慣性約定將「正在執行的指令作為參考點」,稱之為當前指令第一條指令,因此pc總是指向第三條指令。當arm狀態時,每條指令4位元組長,所以pc始終指向該指令位址加8位元組的位址,即:pc值=當前程式執行位置+8;詳細分解:
第一週期對第一指令進行取指操作。
第二週期對第一指令進行解碼,同時對第二指令進行取指操作。
第三週期對第一指令進行執行,第二指令進行解碼,並同時對第三條指令執行操作
位址 指令
0x3000 a
0x3004 b
0x3008 c
0x300c d
(1)swi和未定義指令異常
此時正在執行指令a(此時pc=0x3008)的同時在解碼階段發生swi或未定義指令異常,等指令a執行完後(此時pc還沒有發生改變pc=0x3008)進行swi或未定義指令粗合理,同時把當前pc值賦給暫存器lr(lr=0x3008)然後再進行自動調整lr=lr-0x04(此時lr=0x3004),這樣當異常返回時就到位址為0x3004的指令處執行。所以再進入異常的時候lr不需要修改
(2)irq和fiq異常
此時正在執行指令a(此時pc=0x3008)的同時發生irq和fiq異常,等指令a執行完後(此時pc發生改變pc=0x300c)進行irq和fiq異常響應,同時把當前pc值賦給暫存器lr(lr=0x300c)然後再進行自動調整lr=lr-0x04(此時lr=0x3008),這樣當異常返回時就到位址為0x3008的指令c處執行(可以看出跳過了執行指令b),所以當進入異常的時候要執行「sub lr,lr,#4」(此時lr=0x3004),當異常返回時就到位址為0x3004的指令b處執行。
(3)預取指令中止
此時正在執行指令a(此時pc=0x3008)發生預取指令中止異常,(此時pc沒有發生改變pc=0x3008)進入預取指令中止異常響應,同時把當前pc值賦給暫存器lr(lr=0x3008)然後再進行自動調整lr=lr-0x04(此時lr=0x3004),這樣當異常返回時就到位址為0x3004的指令b處執行,但是當發生指令預取中止異常時,程式要返回到該有問題的指令處,重新讀取並執行該指令。異常指令預取中止異常中斷程式應該返回到產生該指令預取中止異常中斷的指令處。所以當進入異常的時候要執行「sub lr,lr,#4」(此時lr=0x3000),當異常返回時就到位址為0x3000的指令a處重新執行
(4)資料中止異常
此時正在執行指令a(此時pc=0x3008)的同時發生資料中止異常,等指令a執行完後進入下一條指令時(此時pc發生改變pc=0x300c)發生資料中止異常響應,同時把當前pc值賦給暫存器lr(lr=0x300c)然後再進行自動調整lr=lr-0x04(此時lr=0x3008),這樣當異常返回時就到位址為0x3008的指令c處執行,但是發生資料訪問中止異常中斷時,程式要返回到該有問題的資料訪問處,重新訪問該資料。因此資料訪問中止異常中斷程式應該返回到產生該資料訪問中止異常中斷的指令處所以當進入異常的時候要執行「sub lr,lr,#8」(此時lr=0x3000),當異常返回時就到位址為0x3000的指令a處重新執行
異常或入口
返回指令
之前的狀態
arm r14_x thumb r14_x
備註bl
mov pc,r14
pc+4
pc+2
此處pc 為bl, swi, 未定義的指令取指或者預取中止指令的位址。
swi
movs pc,r14_svc
pc+4
pc+2
未定義的指令
movs pc,r14_und
pc+4
pc+2
預取中止
subs pc,r14_abt,#4
pc+4
pc+4
快中斷subs pc,r14_fiq,#4
pc+4
pc+4
此處pc 為由於fiq 或irq 佔先而沒有被執行的指令的位址
中斷subs pc,r14_irq,#4
pc+4
pc+4
資料中止
subs pc,r14_abt,#8
pc+8
pc+8
此處pc 為產生資料中止的裝載或儲存指令的位址。復位無
--復位時儲存在r14_svc 中的值不可預知。
ARM3級流水線的PC值關係
在解釋pc值關係之前先了解一些概念。程式計數器是用於存放下一條指令所在單元的地方。當執行一條指令時,首先需要根據pc中存放的指令位址,將指令由記憶體取到指令暫存器中,此過程稱為 取指令 與此同時,pc中的位址自動加1,或者由轉移指標給出下一條指令的位址。對於32位處理器,一條指令佔據4位元組。流水線...
arm 流水線和pc值
然後pc pc 1 老師經常這麼說。這不完全正確,pc自增一的情況指出現在無流水 non pipeline 的情況下,這個時候取指,解碼,執指都是順序執行的而在有流水的情況下就比較複雜了這裡用arm7和arm9為例。流水線使用三個階段,因此指令分為三個階段執行 1.取指 從儲存器裝載一條指令 2.解...
ARM架構與體系學習(二) 3級流水線
看到彙編中很多關於程式返回與中斷返回時處理位址都很特別,仔細想想原來是流水線作用的效果。所以,決定總結學習下arm流水線。arm7處理器採用3級流水線來增加處理器指令流的速度,能提供0.9mips mhz的指令處理速度。ps mips million instruction per second 表...