1.三級流水線:其實對於PC = PC +8這個問題很簡單,這兩個PC其實代表著不同的意義,第一個PC是對於CPU而言,而第二個PC而言是我們透過編譯器看到的PC(PC指向程式正在執行的那一條指令),但是對於CPU的PC是永遠指向取指那個步,故PC = PC +8。
2.五級流水線; ARM9流水線包括取指(fetch)、譯碼(decode)、執行(excute)、緩衝/資料(buffer/data)、回寫(write-back)暫存器堆。ARM9流水線在譯碼階段已經開始讀取運算元暫存器,因此譯碼階段的PC值和取指階段的PC值關係為:PC(decode)=PC(fetch)+4。因此執行階段的PC值和譯碼階段的PC值關係為:PC(excute)=PC(decode)+4。
3.對於軟中斷函式的返回時的PC:如下
ARM Thumb
SWI PC-8 PC-4
xxx 》 PC -4 PC-2 (異常返回將執行這條指令)
yyy PC PC
因此返回指令為: MOV PC , LR
原因:異常是由指令本身引起的,因此核心在計算LR時的PC值並沒有被更新。對於ARM狀態,因為SWI指令表示將跳到異常處理函式,此時SWI這條指令的PC = PC -8,當進入異常處理函式之前,硬體會自動把PC-4儲存到LR暫存器中,所以異常處理函式結束後直接MOV PC, LR就行,就會跳到xxx這一條指令去執行。對於Thumb狀態同理。
4.對於IRQ和FIQ中斷函式返回時的PC:
xxx PC-12 PC-6 (程式在執行這條程式碼時就產生了中斷訊號)
yyy 》 PC-8 PC-4 (異常返回將執行這條指令)
zzz PC-4 PC-2
www PC PC
返回指令為: SUBS PC, LR, #4
原因:異常在當前指令執行完成後才會被響應,因此核心在計算LR時的PC值已被更新。對於ARM狀態,程式在執行xxx這條指令時,中斷訊號產生,但是由於中斷必須在這一條指令執行完之後才會被響應,執行完後,則此時對於CPU的PC已經指向了www這條指令的取指,在中斷函式函式時應該執行yyy這條指令,雖然硬體會把PC-4的值賦值給LR暫存器,但是這是指向zzz這條指令的,所以返回時應該SUBS PC, LR, #4。對於Thumb狀態同理。
1.三級流水線:其實對於PC = PC +8這個問題很簡單,這兩個PC其實代表著不同的意義,第一個PC是對於CPU而言,而第二個PC而言是我們透過編譯器看到的PC(PC指向程式正在執行的那一條指令),但是對於CPU的PC是永遠指向取指那個步,故PC = PC +8。
2.五級流水線; ARM9流水線包括取指(fetch)、譯碼(decode)、執行(excute)、緩衝/資料(buffer/data)、回寫(write-back)暫存器堆。ARM9流水線在譯碼階段已經開始讀取運算元暫存器,因此譯碼階段的PC值和取指階段的PC值關係為:PC(decode)=PC(fetch)+4。因此執行階段的PC值和譯碼階段的PC值關係為:PC(excute)=PC(decode)+4。
3.對於軟中斷函式的返回時的PC:如下
ARM Thumb
SWI PC-8 PC-4
xxx 》 PC -4 PC-2 (異常返回將執行這條指令)
yyy PC PC
因此返回指令為: MOV PC , LR
原因:異常是由指令本身引起的,因此核心在計算LR時的PC值並沒有被更新。對於ARM狀態,因為SWI指令表示將跳到異常處理函式,此時SWI這條指令的PC = PC -8,當進入異常處理函式之前,硬體會自動把PC-4儲存到LR暫存器中,所以異常處理函式結束後直接MOV PC, LR就行,就會跳到xxx這一條指令去執行。對於Thumb狀態同理。
4.對於IRQ和FIQ中斷函式返回時的PC:
ARM Thumb
xxx PC-12 PC-6 (程式在執行這條程式碼時就產生了中斷訊號)
yyy 》 PC-8 PC-4 (異常返回將執行這條指令)
zzz PC-4 PC-2
www PC PC
返回指令為: SUBS PC, LR, #4
原因:異常在當前指令執行完成後才會被響應,因此核心在計算LR時的PC值已被更新。對於ARM狀態,程式在執行xxx這條指令時,中斷訊號產生,但是由於中斷必須在這一條指令執行完之後才會被響應,執行完後,則此時對於CPU的PC已經指向了www這條指令的取指,在中斷函式函式時應該執行yyy這條指令,雖然硬體會把PC-4的值賦值給LR暫存器,但是這是指向zzz這條指令的,所以返回時應該SUBS PC, LR, #4。對於Thumb狀態同理。