一、簡介
(1)ARM Cortex系列處理器有40個32位的寄存器,其中包括33個通用寄存器和7個狀態寄存器,40箇中有18個可編程訪問的寄存器
(2)寄存器被安排成部分重疊的組,在不同的工作模式和處理器狀態下,程序員可以訪問的寄存器也不同
(3)分組的寄存器在處理處理器異常和特權操作時可得到快速的上下文切換
二、8種處理器工作模式下實際訪問的寄存器
三、通用寄存器(用於保存數據或地址值)
通用寄存器(R0-R15)可以分爲三類:未分組寄存器R0-R7,分組寄存器R8-R14,程序計數器PC(R15)
(1)未分組寄存器R0-R7
1.對於每一個未分組寄存器來說在所有處理器模式下指的都是一個物理寄存器。
2.在異常中斷造成的處理器模式切換時,由於不同的處理器模式下指的都是同一物理寄存器,可能造成未分組寄存器中數據破壞。
3.任何可採用通用寄存器的應用場合都可以使用未分組寄存器。
(2)分組寄存器R8-R14
分組寄存器是指同一個寄存器名。在ARM微處理器內部存在多個獨立的物理寄存器,每一個物理寄存器分別與不同的處理器模式相對應。
1.R8-R12有兩個分組的寄存器。一個用於FIQ模式,另一個用於其他7種工作模式。這樣在發送FIQ中斷時,可以加快FIQ的處理速度。
2.R13-R14分別有7個分組的物理寄存器。一個用於用戶和系統模式。另一個用於其他六個分別用於六種異常模式。
(3)程序計數器PC(R15)
由於ARM體系結構採用了流水線機制(以三級流水線爲例),對於ARM指令集來說,PC指向當前指令的下兩條指令的地址,即PC的值爲當前指令的地址值加8個字節。
補:(1)R13(SP) 堆棧指針寄存器
1.在ARM指令集當中,沒有以特殊方式使用R13的指令或其它功能,只是習慣上都用做堆棧指針寄存器。
2.但是在Thumb指令集中,有一些指令強制性地將R13作爲堆棧指針寄存器,如堆棧操作指令。
異常處理程序負責初始化自己的R13,讓其指向該異常模式專用的棧地址。
(2)R14(LR)連接寄存器
-
R14寄存器的兩種特殊功能
1.在每種工作模式下,模式自身的R14版本用於存放當前子程序的返回地址。在子程序返回時,把R14的值複製到PC。
2.當異常中斷髮生時,R14被設置成該異常模式的返回地址。對於有些模式,R14的值可能與返回地址有一個常數的偏移量(如數據異常)。 -
R14寄存器與子程序調用操作流程
1.程序A執行過程中調用程序B;
2.程序跳轉至標號Lable,執行程序B。同時硬件將“BL Lable”指令的下一條指令所在地址存入R14;
3.程序B執行最後,將R14寄存器的內容放入PC,返回程序A; -
R14寄存器與異常處理
1.異常發生時,程序要跳轉至異常服務程序,對返回地址的處理與子程序調用類似,都是由硬件完成的。區別在於有些異常有一個小常量的偏移
注:當發生異常嵌套時,這些異常之間可能會發生衝突。
例如:如果用戶在用戶模式下執行程序時發生了IRQ中斷,用戶模式寄存器不會被破壞。但是如果允許在IRQ模式下的中斷處理程序重新使能IRQ中斷,並且發生了嵌套的IRQ中斷時,外部中斷處理程序保存在R14_irq中的任何值都將被嵌套中斷的返回地址所覆蓋。
2.異常處理流程:
解決辦法:確保R14的對應版本在發生中斷嵌套時不再保存任何有意義的值(將R14入棧),或者切換到其它處理器模式下。
(3)寄存器R15爲程序計數器PC
它指向正在取指的地址。可以認爲它是一個通用寄存器,但是對於它的使用有許多與指令相關的限制或特殊情況。如果R15使用的方式超出了這些限制,那麼結果將是不可預測的。
1.讀R15的限制
正常操作時,從R15讀取的值是處理器正在取指的地址,即當前正在執行指令的地址加上8個字節(兩條ARM指令的長度)。由於ARM指令總是以字爲單位,所以R15寄存器的最低兩位總是爲0。
2.寫R15的限制
正常操作時,寫入R15 的值被當作一個指令地址,程序從這個地址處繼續執行(相當於執行一次無條件跳轉)。
由於ARM指令以字爲邊界,因此寫入R15的值最低兩位通常爲0b00。具體的規則取決於內核結構的版本:
在ARM結構V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉地址由指令的實際目標地址(寫入R15的值)和0xFFFFFFFC相與得到;
在ARM結構V4版及以上版本中,寫入R15的值的最低兩位爲0,如果不是,結果將不可預測。
四、程序狀態寄存器
包含1個當前程序狀態寄存器(CPSR)和6個備份的程序狀態寄存器(SPSR)
每種異常都有自己的SPSR,在因爲異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。