影子暫存器

影子暫存器的引入是ARM的一個特點(X86,PowerPC都沒有)。我們知道,ARM有16個通用暫存器,這16個通用暫存器在指令中使用4個bit來標識,但是在不同的模式下,同樣的4個bit 指向不同的物理暫存器,這些不同的物理暫存器就被稱之為影子暫存器。不同的通用暫存器的影子暫存器個數也不相同,有的沒有,有的只有1個,有的多達5個。要記住一點:所有的影子暫存器都是一個實際存在的物理暫存器。

基本介紹

  • 中文名:影子暫存器
  • 特點:沒有X86,PowerPC
  • 實質:物理暫存器
  • 用途:指令可以重複使用的相同編碼
ARM核的設計,ARM核的優勢,

ARM核的設計

ARM核是一個非常緊湊的設計,影子暫存器的引入就是這種設計的表現。通過引入影子暫存器,指令可以重複使用相同的暫存器編碼,但是在不同模式下,這些編碼對應不同的物理暫存器。比如Abort模式下的R13就同用戶模式下的R13不同,雖然它們編碼一樣,但是實際上對應的是不同的物理暫存器(可以將CPSR的模式域當作片選)。
我們可以計算一下ARM的通用暫存器數目
(1) 1個狀態暫存器
(2) 5個異常模式下的狀態暫存器的影子暫存器
(3)16個通用暫存器R0 ~ R15
(4)10個異常模式下的R13和R14的影子暫存器
(5) 5個FIQ模式下的R8 ~ R12的影子暫存器
總共是1 + 5 + 16 + 10 + 5 = 37個暫存器,這個數目同X86相比要多很多。
由於影子暫存器的編碼同其所Banked的暫存器的編碼是一樣的,因此象“MOV R0, R13”這樣的指令,在不同的模式下,訪問的是不同的物理暫存器R13,這意味我們在異常模式下是不能訪問正常意義上的R13的,這對一般的暫存器可能關係不大。
但是,對狀態暫存器CPSR而言,這是很惱人的,因為要切換CPU的狀態,只能通過修改狀態暫存器CPSR來進行,對CPSR的影子暫存器的修改並不能影響CPSR本身,這也就是為什麼會有MOV和MOVS,SUB和SUBS的原因。但是,象TEQ,BEQ等這樣的比較指令修改的是CPSR的內容,而不是該模式下CPSR影子暫存器的內容。這也是CPSR同一般Rx不一樣的地方:CPSR對所有異常模式都是可見的,只不過這種可見性並不表示指令可以直接讀取或修改CPSR的內容,更準確的說,這種可見性是對指令系統(如TEQ, BEQ等條件判斷指令)而言的,只能通過特殊的指令來影響CPSR中的相關域,而不能直接讀取或修改CPSR,因此CPSR對程式設計師的是不可見的。

ARM核的優勢

引入影子暫存器的另外一個目的是當中斷或異常產生時,CPU會將當前“CPU的狀態”保存在影子暫存器中。從CPU角度看,它的“狀態”包括:
(1) PC(也就是R15)值
(2) CPSR的值
您也許認為R0等通用暫存器也是狀態,從某種意義上說您是對的。但是那些不是“CPU的狀態”,它們是“套用的狀態”。當中斷或異常產生後,CPU並不關心它們,CPU只是:
(1) PC值被保存在當前模式下的R14中
(2) CPSR值被保存在當前模式下的影子暫存器中
保存CPU的狀態是一種廉價的操作,但是要保存套用的狀態可就很昂貴了,因為至少有13個暫存器(R0 ~ R12)需要保存,為了加快這種操作,ARM的記憶體訪問指令可以將一組暫存器的內容保存到記憶體中,反之亦然。

相關詞條

熱門詞條

聯絡我們