協(xié)處理器及其他指令之:狀態(tài)寄存器訪問指令
9.2狀態(tài)寄存器訪問指令
ARM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器psr。MRS指令用于把cpsr或者spsr的值傳送到一個寄存器;MSR與之相反,它將一個寄存器的內(nèi)容傳送到cpsr或者spsr。這兩條指令結(jié)合,可用于對cpsr和spsr進(jìn)行讀/寫操作。
表9.2總結(jié)了狀態(tài)寄存器訪問指令。
表9.2 狀態(tài)寄存器訪問指令
助記符 | 含義 | 操作 |
MRS | 將程序狀態(tài)字寄存器的值送到通用寄存器 | Rd=spr |
MSR | 將通用寄存器的值送到程序狀態(tài)字寄存器 | Psr[field]=Rm |
MSR | 將一個立即數(shù)送到程序狀態(tài)字 | Psr[field]=immediate |
當(dāng)需要保存或修改當(dāng)前模式下CISR或SPSR的內(nèi)容時,首先必須將這些內(nèi)容傳送到通用寄存器中,對選擇的位進(jìn)行修改,然后將數(shù)據(jù)回寫到狀態(tài)寄存器。對于ARM和Thumb的狀態(tài)切換也是如此,程序不能通過直接改寫CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過BX等指令完成程序狀態(tài)的切換。
9.2.1程序狀態(tài)字內(nèi)容送通用寄存器指令MRS
1.指令編碼格式
讀狀態(tài)寄存器指令MRS。在ARM寄存器中,只有MRS指令可以將狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中。將程序狀態(tài)字內(nèi)容讀取到通用寄存器中后就可以對其進(jìn)行計算、修改等操作。
指令的編碼格式如圖9.6所示。
圖9.6MRS指令編碼格式
2.指令的語法格式
MRS{cond>}Rd>,CPSR
MRS{cond>}Rd>,SPSR
①cond>
為指令編碼中的條件域。它指示指令在什么條件下執(zhí)行。當(dāng)cond>忽略時,指令為無條件執(zhí)行(cond=AL(Alway))。
②Rd>
確定指令的目標(biāo)寄存器。如果r15被用作目標(biāo)寄存器,指令的執(zhí)行結(jié)果不可預(yù)知。
3.指令操作的偽代碼
指令操作的偽代碼如下面程序段所示。
IfConditionPassed{cond}then
IfR==1then
Rd=SPSR
Else
Rd=CPSR
4.指令的使用
MRS指令注意用于以下3種場合:
·當(dāng)需要保存或修改當(dāng)前模式下CPSR或SPSR的內(nèi)容時,首先必須將這些內(nèi)容傳送到通用寄存器中,對選擇的位進(jìn)行修改,然后將數(shù)據(jù)回寫到狀態(tài)寄存器。
·當(dāng)異常中斷允許嵌套時,需要在進(jìn)入異常中斷之后,嵌套中斷發(fā)生之前保存當(dāng)前處理器模式對應(yīng)的SPSR。這時需要先通過MRS指令讀出SPSR的值,再用其他指令(如壓棧指令)將SPSR值保存起來。
·在進(jìn)程切換時也需要保存當(dāng)前狀態(tài)寄存器的值。
注意 | 在用戶模式下對CPSR[23∶0]進(jìn)行任何修改都是無效的。另外,盡量避免在用戶模式或系統(tǒng)模式下訪問SPSR,因為在這種模式下沒有SPSR,如果執(zhí)行此操作,指令的執(zhí)行結(jié)果不可預(yù)知。 |
5.指令舉例
(1)將CPSR狀態(tài)寄存器讀取,保存到r1中。
MRSr1,CPSR
(2)將SPSR狀態(tài)寄存器讀取,保存到r2中。
MRSr2,SPSR
(3)MSR指令讀取CPSR,用來判斷ALU的狀態(tài)標(biāo)志或IRQ/FIQ中斷是否允許等;在異常處理程序中,讀SPSR可知道進(jìn)入異常前的處理器狀態(tài)等。MRS與MSR配合使用,實現(xiàn)CPSR或SPSR寄存器的讀-修改-寫操作,可用來進(jìn)行處理器模式的切換或禁止/使能IRQ/FIQ中斷等設(shè)置。另外,進(jìn)行切換或允許異常中斷嵌套時,也需要使用MRS指令讀取SPSR狀態(tài)值保存起來。
下面的例子使能IRQ中斷。
ENABLE_IRQ
MRSr0,CPSR
BICr0,r0,#0x80
MSRCPSR_c,r0
MOVPC,LR
下面的例子禁止IRQ中斷。
DISABLE_IRQ
MRSr0,CPSR
ORRr0,r0,#0x80
MSRCPSR_c,r0
MOVPC,LR
評論