加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 9.2  狀態(tài)寄存器訪問指令
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

協處理器及其他指令之:狀態(tài)寄存器訪問指令

2013/09/13
閱讀需 13 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

?

9.2??狀態(tài)寄存器訪問指令

ARM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器psr。MRS指令用于把cpsr或者spsr的值傳送到一個寄存器;MSR與之相反,它將一個寄存器的內容傳送到cpsr或者spsr。這兩條指令結合,可用于對cpsr和spsr進行讀/寫操作。

表9.2總結了狀態(tài)寄存器訪問指令。

表9.2 狀態(tài)寄存器訪問指令

助??記??符

含????義

操????作

MRS

將程序狀態(tài)字寄存器的值送到通用寄存器

Rd=spr

MSR

將通用寄存器的值送到程序狀態(tài)字寄存器

Psr[field]=Rm

MSR

將一個立即數送到程序狀態(tài)字

Psr[field]=immediate

當需要保存或修改當前模式下CISR或SPSR的內容時,首先必須將這些內容傳送到通用寄存器中,對選擇的位進行修改,然后將數據回寫到狀態(tài)寄存器。對于ARM和Thumb的狀態(tài)切換也是如此,程序不能通過直接改寫CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過BX等指令完成程序狀態(tài)的切換。

9.2.1??程序狀態(tài)字內容送通用寄存器指令MRS

1.指令編碼格式

讀狀態(tài)寄存器指令MRS。在ARM寄存器中,只有MRS指令可以將狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中。將程序狀態(tài)字內容讀取到通用寄存器中后就可以對其進行計算、修改等操作。

指令的編碼格式如圖9.6所示。

圖9.6??MRS指令編碼格式

2.指令的語法格式

MRS{<cond>}??<Rd>,CPSR

MRS{<cond>}??<Rd>,SPSR

①?<cond>

為指令編碼中的條件域。它指示指令在什么條件下執(zhí)行。當<cond>忽略時,指令為無條件執(zhí)行(cond=AL(Alway))。

②?<Rd>

確定指令的目標寄存器。如果r15被用作目標寄存器,指令的執(zhí)行結果不可預知。

3.指令操作的偽代碼

指令操作的偽代碼如下面程序段所示。

If??ConditionPassed{cond}??then

?????If??R==1??then

??????????Rd=SPSR

?????Else

??????????Rd=CPSR

4.指令的使用

MRS指令注意用于以下3種場合:

·??當需要保存或修改當前模式下CPSR或SPSR的內容時,首先必須將這些內容傳送到通用寄存器中,對選擇的位進行修改,然后將數據回寫到狀態(tài)寄存器。

·??當異常中斷允許嵌套時,需要在進入異常中斷之后,嵌套中斷發(fā)生之前保存當前處理器模式對應的SPSR。這時需要先通過MRS指令讀出SPSR的值,再用其他指令(如壓棧指令)將SPSR值保存起來。

·??在進程切換時也需要保存當前狀態(tài)寄存器的值。

注意

在用戶模式下對CPSR[23∶0]進行任何修改都是無效的。另外,盡量避免在用戶模式或系統模式下訪問SPSR,因為在這種模式下沒有SPSR,如果執(zhí)行此操作,指令的執(zhí)行結果不可預知。

?

5.指令舉例

(1)將CPSR狀態(tài)寄存器讀取,保存到r1中。

MRS???r1,CPSR

(2)將SPSR狀態(tài)寄存器讀取,保存到r2中。

MRS???r2,SPSR

(3)MSR指令讀取CPSR,用來判斷ALU的狀態(tài)標志或IRQ/FIQ中斷是否允許等;在異常處理程序中,讀SPSR可知道進入異常前的處理器狀態(tài)等。MRS與MSR配合使用,實現CPSR或SPSR寄存器的讀-修改-寫操作,可用來進行處理器模式的切換或禁止/使能IRQ/FIQ中斷等設置。另外,進行切換或允許異常中斷嵌套時,也需要使用MRS指令讀取SPSR狀態(tài)值保存起來。

下面的例子使能IRQ中斷。

ENABLE_IRQ

?????????MRS????r0,CPSR

?????????BIC????r0,r0,#0x80

?????????MSR????CPSR_c,r0

?????????MOV????PC,LR

下面的例子禁止IRQ中斷。

DISABLE_IRQ

????????MRS????r0,CPSR

????????ORR????r0,r0,#0x80

????????MSR????CPSR_c,r0

????????MOV????PC,LR

?

9.2.2??寫狀態(tài)寄存器指令MSR

1.指令編碼格式

寫狀態(tài)寄存器指令MSR(Move?to?Status?Register?from?ARM?Register)。在ARM處理器中,只有MSR指令可以直接設置狀態(tài)寄存器CPSR或SPSR。

圖9.7、圖9.8分別顯示了源操作數為立即數的MSR指令和源操作數為寄存器的MSR指令的編碼格式。

圖9.7??源操作數為立即數的MSR指令編碼格式

圖9.8??源操作數為寄存器的MSR指令編碼格式

2.指令的語法格式

MSR{<cond>}???CPSR_<fields>,#<immediate>

MSR{<cond>}???CPSR_<fields>,<Rm>

MSR{<cond>}???SPSR_<fields>,#<immediate>

MSR{<cond>}???SPSR_<fields>,<Rm>

①?<cond>

為指令編碼中的條件域。它指示指令在什么條件下執(zhí)行。當<cond>忽略時,指令為無條件執(zhí)行(cond=AL(Alway))。

②?<fields>

域標志位,是下面選項中的一種或幾種的組合。

·??C:設置控制位掩碼域(bit[16])。

·??X:設置擴展位掩碼域(bit[17])。

·??S:設置狀態(tài)位掩碼域(bit[18])。

·??F:設置標志位掩碼域(bit[19])

③?<immediate>

將被傳送到CPSR和SPSR寄存器的立即數。此立即數可以為8位立即數(范圍在0x00~0xff之間)。

④?<Rm>

指定的通用寄存器,此寄存器包含將要被傳送狀態(tài)寄存器中的數據。

3.指令操作的偽代碼

指令操作的偽代碼如下面程序段所示。

If??ConditionPassed{cond}??then

?????If??opcode[25]==1

??????????Operand=8_bit_immediate??Rotate_Right{rotate_imm*2}

?????Else?/*opcode[25]==0*/

??????????Operand=Rm

?????If??R==0?then

??????????If??field_mask[0]==1?and?inAprivilegedMode()??then

????????????????CPSR[7:0]=operand[7:0]

??????????If??field_mask[1]==1?and?inAprivilegedMode()??then

????????????????CPSR[15:8]=operand[15:8]

??????????If??field_mask[2]==1?and?inAprivilegedMode()??then

????????????????CPSR[23:16]=operand[23:16]

??????????If??field_mask[3]==1?and?then

????????????????CPSR[31:24]=operand[31:24]

?????Else/*R==1*/

??????????If??field_mask[0]==1?and?CurrentModeHasSPSR()??then

????????????????SPSR[7:0]=operand[7:0]

??????????If??field_mask[1]==1?and?CurrentModeHasSPSR()??then

????????????????SPSR[15:8]=operand[15:8]

??????????If??field_mask[2]==1?and?CurrentModeHasSPSR()??then

????????????????SPSR[23:16]=operand[23:16]

??????????If??field_mask[3]==1?and?CurrentModeHasSPSR()??then

????????????????SPSR[31:24]=operand[31:24]

?

4.指令的使用

詳見MRS指令。

5.指令舉例

(1)使用“讀-修改-寫”模式更新CPSR寄存器。

MRS???r0,CPSR ;讀CPSR寄存器的值

BIC???r0,r0,#0xf0000000 ;清除N、Z、C、V位

MSR???CPSR_f,r0 ;更新CPSR中的標志位

注意

因為PSR狀態(tài)寄存器中存在目前沒有定義的保留位,所以在使用時,最好加上“_fsxc”后綴,如上例中的“CPSR_f”。這樣做的目的是使指令只修改程序狀態(tài)寄存器的某個域,防止程序向高版本指令集移植時發(fā)生意外。

(2)禁止IRQ中斷。

MRS????r0,CPSR???????????????;讀CPSR狀態(tài)寄存器

ORR????r0,r0,#0x80?????????;設置IRQ中斷禁止位

MSR????CPSR_c,r0?????????????;更新CPSR狀態(tài)寄存器

(3)堆棧初始化。

INITSTACK

?????????MOV????r0,LR??????????;保存返回地址

;設置管理模式堆棧

?????????MSR????CPSR_c,#0xd3;

?????????LDR????SP,StackSvc;

;設置中斷模式堆棧

?????????MSR????CPSR_c,#0xd2;

?????????LDR????SP,StackIrq;

Arm

Arm

ARM公司是一家知識產權(IP)供應商,主要為國際上其他的電子公司提供高性能RISC處理器、外設和系統芯片技術授權。目前,ARM公司的處理器內核已經成為便攜通訊、手持計算設備、多媒體數字消費品等方案的RISC標準。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知識產權(IP)供應商,主要為國際上其他的電子公司提供高性能RISC處理器、外設和系統芯片技術授權。目前,ARM公司的處理器內核已經成為便攜通訊、手持計算設備、多媒體數字消費品等方案的RISC標準。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相關推薦

電子產業(yè)圖譜

華清遠見(www.farsight.com.cn)是國內領先嵌入師培訓機構,2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關的長期就業(yè)培訓、短期高端培訓、師資培訓及企業(yè)員工內訓等業(yè)務外,其下屬研發(fā)中心還負責嵌入式、Android及物聯網方向的教學實驗平臺的研發(fā)及培訓教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯網相關圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。