OK6410---寄存器

目錄

1 ARM狀態核心寄存器集

2 程序狀態寄存器

2.1 條件代碼標誌

2.2 Q標誌位

2.3 J標誌位

2.4 GE[3:0]位

2.5 E標誌位

2.6 A標誌位

2.7 控制位

 2.8 MRS和MSR指令


 參考:ARM1176JZF-S™ Revision: r0p7 Technical Reference Manual

該處理器(ARM1176JZF-S)共有40個寄存器:

  • 33個通用32位寄存器
  • 7個32位狀態寄存器

這些寄存器不能同時全部訪問。處理器狀態和操作模式決定了可供程序員使用的寄存器。

1 ARM狀態核心寄存器集

在ARM狀態下,可隨時訪問16個通用寄存器和一個或兩個狀態寄存器。在特權模式下,模式特定的寄存器可用。下圖顯示了每種模式下可用的寄存器:

ARM狀態核心寄存器集包含16個可直接訪問的寄存器R0-R15。另一個寄存器,即當前程序狀態寄存器(CPSR),包含條件代碼標誌,狀態位和當前模式位。寄存器R0-R12是通用寄存器,用於保存數據或地址值。寄存器R13,R14,R15和備份的程序狀態寄存器(SPSR)具有以下特殊功能:

  • 棧指針---寄存器R13用作棧指針(SP)。R13在不同的操作模式時有不同的分組寄存器,如R13_fiq,R13_svc等等。這意味着異常發生前後可以使用不同的棧空間。在許多指令中,您都可以將R13用作通用寄存器,但是該體系結構在大多數指令中均不贊成使用R13。
  • 連接寄存器---寄存器R14用作子程序連接寄存器或連接寄存器LR。當執行帶鏈接的分支(BL或BLX)指令時,寄存器R14接收返回地址。您可以在所有其他時間將R14當作通用寄存器。相應的分組寄存器R14_mon,R14_svc,R14_irq,R14_fiq,R14_abt和R14_und類似地用於在出現中斷和異常時,在中斷或異常例程中執行BL或BLX指令時保存返回值。
  • 程序計數器---寄存器R15用作程序計數器PC。在ARM狀態下,這是字對齊的;在Thumb狀態下,這是半字對齊的;在Jazelle狀態下,這是字節對齊的。它用於控制程序中指令的執行順序。
  • 備份的程序狀態寄存器---在特權模式下,可以訪問另一個寄存器SPSR。當異常發生時,SPSR用於保存CPSR的當前值,從異常退出時則可以由SPSR來恢復CPSR。

2 程序狀態寄存器

該處理器包含一個CPSR和六個SPSR,供異常處理程序使用。程序狀態寄存器:

  • 保存有關最近執行的ALU操作的信息
  • 控制中斷的啓用和禁用
  • 設置處理器操作模式

注意

上圖標識爲“請勿修改”(DNM),“讀爲零”(RAZ)的位不能用軟件修改。這些位是:

  • 可讀,以使處理器狀態得以保留,例如,在進程上下文切換期間
  • 可寫,以使處理器狀態得以恢復。爲了保持與未來ARM處理器的兼容性,並且作爲一種良好實踐,強烈建議您在更改CPSR時使用讀-修改-寫策略

2.1 條件代碼標誌

N,Z,C和V位是條件代碼標誌位。您可以通過算術和邏輯運算以及MSR和LDM指令進行設置。處理器測試這些標誌位以確定是否執行指令。 

在ARM狀態下,大多數指令可以根據N,Z,C和V位的狀態有條件地執行。

但不包括以下的指令:

  • BKPT---BKPT(斷點)導致出現軟件斷點。
  • CDP2---CDP(協處理器數據處理)告訴編號爲cp_num的協處理器執行獨立於ARM寄存器和內存的操作。CDP2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。生成的指令只能無條件執行。
  • CPS---cps(更改處理器狀態)更改cpsr的一個或多個模式位(A、I和F位),而不更改其他cpsr位。
  • LDC2---LDC(加載協處理器)將內存數據從一系列連續的內存地址加載到協處理器。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。LDC2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。
  • MCR2---MCR(將ARM寄存器的值複製到協處理器)將寄存器<Rd>的值傳遞給編號爲cp_num的協處理器。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。MCR2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。
  • MCRR2---MCRR(將兩個ARM寄存器的值複製到協處理器)將兩個ARM寄存器的值傳遞給協處理器。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。MCRR2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。
  • MRC2---MRC(將協處理器的值複製到ARM寄存器)使協處理器將值傳輸到ARM寄存器或條件標誌。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。MRC2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。
  • MRRC2---MRRC(將協處理器的值複製到兩個ARM寄存器)使協處理器將值傳輸到兩個ARM寄存器。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。MRRC2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。
  • PLD---PLD(預加載數據)向存儲系統發出信號,表明在不久的將來可能會從指定地址訪問存儲器。內存系統可以通過在發生訪問時採取預期會加快內存訪問速度的操作進行響應,例如將包含指定地址的緩存線預加載到緩存中。pld是一種提示指令,旨在優化存儲系統的性能。它沒有體系結構定義的效果,不支持此優化的內存系統可以忽略它。在這種存儲系統上,PLD充當NOP。
  • SETEND---SETEND修改CPSR E位,而不更改CPSR中的任何其他位。
  • RFE---RFE(異常返回)分別從指定地址的字和後面的字加載PC和CPSR。
  • SRS---SRS(存儲返回狀態)將當前模式的R14和SPSR存儲到指定地址的字和後面的字。該地址由屬於指定模式的R13的分組版本確定。
  • STC2---STC(存儲協處理器)將數據從協處理器存儲到一系列連續的內存地址中。如果沒有協處理器指示它們可以執行該指令,則會生成未定義指令異常。STC2使指令的條件字段設置爲0b1111。這爲協處理器設計人員提供了額外的操作碼空間。產生的指令只能無條件執行。

在Thumb狀態下,只能有條件地執行分支指令。有關條件執行的更多信息,請參見《 ARM體系結構參考手冊》。

2.2 Q標誌位

粘性溢出(Q)標誌可以通過某些乘法和分數運算指令來設置:

  • QADD---QADD(飽和加法)執行整數加法。它將結果飽和到32位有符號整數範圍–2^31 ≤ x ≤ 2^31–1。如果發生飽和,QADD將在CPSR中設置Q標誌。
  •  QDADD---QDADD(Saturating Double and Add)將其第二個操作數加倍,然後將結果添加到其第一個操作數。加倍和加法的結果都飽和到32位有符號整數範圍–2^31 ≤ x ≤ 2^31–1。如果在任一操作中均發生飽和,則該指令會在CPSR中設置Q標誌。
  •  QSUB---QSUB(飽和減法)執行整數減法。它將結果飽和到32位有符號整數範圍–2^31 ≤ x ≤ 2^31–1。如果發生飽和,QSUB將在CPSR中設置Q標誌。
  • QDSUB---QDSUB(飽和雙雙倍減法)將其第二個操作數加倍,然後從其第一個操作數中減去結果。加倍和減法的結果都飽和到32位有符號整數範圍–2^31 ≤ x ≤ 2^31–1。如果在任何一種操作中均發生飽和,則QDSUB會在CPSR中設置Q標誌。
  • SMLAD---SMLAD(Signed Multiply Accumulate Dual)執行兩個帶符號的16 x 16位乘法。它將乘積添加到32位累加操作數中。(可選)您可以在執行算術運算之前交換第二個操作數的半字。這將產生top x bottom和bottom x top乘法。如果累加操作溢出,該指令將設置Q標誌。乘法過程中不會發生溢出。
  • SMLAxy---SMLA <x> <y>(帶符號的乘法累加BB,BT,TB和TT)執行帶符號的乘法累加運算。乘法作用於兩個帶符號的16位量,取自它們各自源寄存器的下半部或上半部。這些源寄存器的其他一半將被忽略。將32位乘積加到32位累加值中,並將結果寫入目標寄存器。如果在累加值累加期間發生溢出,該指令將在CPSR中設置Q標誌。在乘法過程中不可能發生溢出。
  • SMLAWy---SMLAW <y>(有符號乘法累加字B和T)執行有符號乘法累加運算。乘法作用於有符號的32位量和有符號的16位量,後者取自其源寄存器的下半部或上半部。第二個源寄存器的另一半被忽略。將48位乘積的高32位加到32位累加值中,並將結果寫入目標寄存器。48位乘積的低16位將被忽略。如果在累加值累加期間發生溢出,該指令將在CPSR中設置Q標誌。由於使用了48位乘積的高32位,因此在乘法過程中不會發生溢出。
  • SMLSD---SMLSD(Signed Multiply Subtract accumulate Dual)執行兩個帶符號的16 x 16位乘法。它將乘積的差值添加到32位累加操作數中。(可選)您可以在執行算術運算之前交換第二個操作數的半字。這將產生top x bottom和bottom x top乘法。如果累加操作溢出,該指令將設置Q標誌。在乘法或減法期間不會發生溢出。
  • SMUAD---SMUAD(Signed Dual Multiply Add)執行兩個帶符號的16 x 16位乘法。它將產品相加,得出32位結果。(可選)您可以在執行算術運算之前交換第二個操作數的半字。這將產生top x bottom和bottom x top乘法。如果加法運算溢出,則該指令設置Q標誌。乘法不會溢出。
  • SSAT---SSAT(Signed Saturate)將有符號值飽和到有符號範圍。您可以選擇發生飽和的位位置。您可以在飽和發生之前對值進行平移。如果操作飽和,則設置Q標誌。
  • SSAT16---SSAT16將兩個16位帶符號的值飽和到一個帶符號的範圍。您可以選擇發生飽和的位位置。如果任一半字操作飽和,則設置Q標誌。
  • USAT---USAT(Unsigned Saturate)將有符號值飽和到無符號範圍。您可以選擇發生飽和的位位置。您可以在飽和發生之前對值進行平移。如果操作飽和,則設置Q標誌。
  • USAT16---USAT16將兩個帶符號的16位值飽和到一個無符號範圍。您可以選擇發生飽和的位位置。如果任一半字操作飽和,則設置Q標誌。

Q標誌具有粘性,因爲當被一條指令設置時,它一直保持設置狀態,直到被寫入CPSR的MSR指令明確清除爲止。指令無法根據Q標誌的狀態有條件地執行。要確定Q標誌的狀態,您必須將PSR讀入寄存器並從中提取Q標誌。有關如何設置和清除Q標誌的詳細信息,請參見《 ARM體系結構參考手冊》中的各個指令定義。

2.3 J標誌位

CPSR中的J位指示處理器何時處於Jazelle狀態。

  • 當J = 0時,取決於T位,處理器處於ARM或Thumb狀態。
  • 當J = 1時,處理器處於Jazelle狀態。

注意

  • J = 1和T = 1的組合導致類似於在沒有Thumb的處理器上設置T = 1的效果。即,執行的下一條指令將導致進入“未定義指令”異常。進入異常處理程序會使處理器重新進入ARM狀態,並且處理程序可以檢測到這是導致異常的原因,因爲J和T都在SPSR_und中設置。
  • MSR不能用於更改CPSR中的J位。
  • J位的設置避免了代碼中的狀態或擴展字節在ARMv5TE或更早版本的處理器上運行。這可以確保使用已棄用的cpsr、spsr、cpsr_all或spsr_all語法作爲msr指令的目標來編寫的操作系統代碼繼續工作。

2.4 GE[3:0]位

在ARMv6中,SIMD指令對結果的各個字節或半字使用bit [19:16]作爲大於或等於(GE)標誌。您可以使用這些標誌來控制後續的SEL指令(SEL(選擇)根據GE標誌的值從其第一個操作數或第二個操作數中選擇其結果的每個字節)。

對半字進行操作的指令:

  • 根據前半字的計算結果,一起置位或清除GE [3:2]
  • 根據後半字的計算結果,一起置位或清除GE [1:0]

對字節進行操作的指令:

  • 根據最高位字節計算的結果置位或清除GE [3]
  • 根據第二個字節的計算結果置位或清除GE [2]
  • 根據第三字節計算結果置位或清除GE [1]
  • 根據最低位字節計算的結果置值或清除GE [0]

如果相應的計算結果如下,則置位每個位(否則將其清除):

  • 用於無符號字節加法,如果結果大於或等於2^8
  • 用於無符號半字加法,如果結果大於或等於2^16
  • 對於無符號減法,如果結果大於或等於零
  • 對於帶符號算術,如果結果大於或等於零

在ARMv6之前的體系結構版本中,必須將CPSR和SPSR的位[19:16]視爲保留位。

2.5 E標誌位

提供了ARM和Thumb指令來置位和清除E位。E位控制加載/存儲的字節序。ARMv6之前的體系結構版本將此位指定爲SBZ。這樣可確保加載或存儲上的字節順序不反轉。

2.6 A標誌位

A位自動設置。它用於禁用不精確的數據中止。如果SCR寄存器中的AW位被複位,則在非安全環境中可能無法寫入。

2.7 控制位

PSR的低八位統稱爲控制位。它們是:

  • 中斷禁止位
  • T標誌位
  • 模式位

發生異常時,控制位會發生變化。當處理器以特權模式運行時,軟件可以操縱這些位。

中斷禁止位

I和F位是中斷禁止位:

  • 當I位置1時,IRQ中斷被禁用
  • 當F位置1時,FIQ中斷被禁用。如果將SCR寄存器中的FW位復位,則FIQ在非安全環境中可能是不可屏蔽的。

注意:

您可以在“非安全”環境中更改SPSR F位,但是如果SCR位4(FW)不允許這樣做,則不會更新CPSR。

T標誌位 

T位存在於ARMv4的t變體以及ARMv5及更高版本的所有變體中。在ARMv4的非T變體上,必須將T位視爲保留位。Thumb指令集在ARMv4和ARMv5的T變體以及ARMv6及更高版本的所有變體上實現。在ARM和Thumb狀態之間切換執行的指令可以在這些體系結構的實現上自由使用。Thumb指令集未在ARMv5的非T變體上實現。如果通過在這些體系結構變體上設置T == 1來選擇Thumb指令集,則執行的下一條指令將導致未定義指令異常。在這些體系結構變體的實現上可以使用在ARM和Thumb狀態之間切換執行的指令,但是隻有在程序保持ARM狀態的情況下,這些指令才能正確運行。如果程序嘗試切換到Thumb狀態,則該切換之後執行的第一條指令會導致未定義指令異常。然後進入該異常,然後切換回ARM狀態。異常處理程序可以從SPSR_und的T位被置位的事實中檢測到這是導致異常的原因。

T位反映了運行狀態:

  • 當T位置1時,處理器以Thumb狀態執行
  • 當T位清零時,處理器將依賴J位,在ARM狀態或Jazelle狀態下執行。

注意:

切勿使用MSR指令強行更改CPSR中T位的狀態。如果MSR指令確實嘗試修改此位,則結果在架構上是不可預測的。在ARM1176JZF-S處理器中,此位不受影響。 

模式位 

M[4:0]是模式位。下圖列出不同模式時可以使用的寄存器:

 2.8 MRS和MSR指令

  • MRS(將PSR的值傳輸到通用寄存器)將當前模式的CPSR或SPSR的值複製到通用寄存器中。在通用寄存器中,可以使用常規數據處理指令來檢查或操縱該值。
  • MSR(從ARM寄存器的複製到狀態寄存器)將通用寄存器的值或立即數傳輸到當前模式的CPSR或SPSR。

語法如下:

MRS{<cond>} <Rd>, CPSR

MRS{<cond>} <Rd>, SPSR

<cond> --- 是執行指令的條件。 如果省略<cond>,則使用指令始終執行。

<Rd> --- 指定目標寄存器。如果爲<Rd>指定R15,則結果爲UNPREDICTABLE。

MSR{<cond>} CPSR_<fields>, #<immediate> 
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate> 
MSR{<cond>} SPSR_<fields>, <Rm>

<cond> ---  是執行指令的條件。 如果省略<cond>,則使用指令始終執行。

<fields> --- 是位域。如CPSR_c,CPSR_cxsf都是正確的表達式,具體表示如下:

  • c --- 控制位域,位[7:0]
  • x --- 擴展位域,位[15:8]
  • s --- 狀態位域,位[23:16]
  • f --- 條件標誌位域,位[31:24]

<immediate> --- 是要傳輸到CPSR或SPSR的立即數。允許的立即數值爲8位立即數(範圍爲0x00至0xFF)。

<Rm> --- 是要傳輸值到CPSR或SPSR的通用寄存器。

 這些指令一般用在以下情況:當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用MRS指令讀出程序狀態寄存器的值,然後保存。當需要改變程序狀態寄存器的內容時,可用MRS指令將程序狀態寄存器的內容讀入通用寄存器,修改後將該值用MSR指令寫回程序狀態寄存器。

使用注意:

  1. 只有在特權模式下才可以改變處理器模式和設置中斷。
  2. 程序狀態寄存器中的T位用於指示ARM狀態和Thumb狀態的轉換,但程序不能通過修改T位實現ARM和Thumb之間的轉換。任何情況下不得修改T位。
  3. 不可以使用R15做目標寄存器。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章