首页 > 编程知识 正文

汇编语言cpsr与cpsrc匯編語言中的CPSR 和 SPSR

时间:2023-05-05 03:55:19 阅读:225461 作者:4693

CPSR:程序狀態寄存器(current program status register),cpsr在用戶級編程時用於存儲條件碼。CPSR包含條件碼標志,中斷禁止位,當前處理器模式以及其他狀態和控制信息。

SPSR:程序狀態保存寄存器。SPSR用於保存CPSR的狀態,以便異常返回后恢復異常發生時的工作狀態。

CPSR(當前程序狀態寄存器)在任何處理器模式下被訪問。它包含了條件標志位、中斷禁止位、當前處理器模式標志以及其他的一些控制和狀態位。每一種處理器模式下都有一個專用的物理狀態寄存器,稱為SPSR(備份程序狀態寄存器)。當特定的異常中斷發生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。由於用戶模式和系統模式不是異常中斷模式,所以他沒有SPSR。當用戶在用戶模式或系統模式訪問SPSR,將產生不可預知的后果。

CPSR格式如下所示。SPSR和CPSR格式相同。

31 30 29 28  27       26      7  6  5   4    3   2    1    0

N   Z   C   V   Q  DNM(RAZ) I   F  T  M4 M3 M2 M1 M0

***條件標志位***

N——本位設置成當前指令運算結果的bit[31]的值。當兩個表示的有符號整數運算時,n=1表示運算結果為負數,n=0表示結果為正書或零。

z——z=1表示運算的結果為零;z=0表示運算的結果不為零。對於CMP指令,Z=1表示進行比較的兩個數大小相等。

C——下面分四種情況討論C的設置方法:

在加法指令中(包括比較指令CMP),當結果產生了進位,則C=1,表示無符號運算發生上溢出;其他情況C=0。

在減法指令中(包括減法指令CMP),當運算中發生錯位,則C=0,表示無符號運算數發生下溢出;其他情況下C=1。

對於包含移位操作的非加減運算指令,C中包含最后一次溢出的的位的數值。對於其他非加減運算指令,C位的值通常不受影響。

V——對於加減運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1表示符號為溢出;通常其他指令不影響V位。

***Q標識位***

在ARM V5的E系列處理器中,CPSR的bit[27]稱為q標識位,主要用於指示增強的dsp指令是否發生了溢出。同樣的spsr的bit[27]位也稱為q標識位,用於在異常中斷發生時保存和恢復CPSR中的Q標識位。

在ARM V5以前的版本及ARM V5的非E系列的處理器中,Q標識位沒有被定義。

***CPSR中的控制位***

CPSR的低八位I、F、T、M[4:0]統稱為控制位。當異常中斷發生時這些位發生變化。在特權級的處理器模式下,軟件可以修改這些控制位。

**中斷禁止位:當I=1時禁止IRQ中斷,當F=1時禁止FIQ中斷

**T控制位:T控制位用於控制指令執行的狀態,即說明本指令是ARM指令還是Thumb指令。對於ARM V4以更高版本的T系列ARM處理器,T控制位含義如下:T=0表示執行ARM指令

T=1表示執行Thumb指令

對於ARM V5以及更高版本的非T系列處理器,T控制位的含義如下

T=0表示執行ARM指令

T=1表示強制下一條執行的指令產生未定指令中斷

***M控制位***

M控制位控制處理器模式,具體含義如下:

M[4:0] 處理器模式 可訪問的寄存器

ob10000 user pc,r14~r0,CPSR

0b10001 FIQ PC,R14_FIQ-R8_FIQ,R7~R0,CPSR,SPSR_FIQ

0b10010 IRQ PC,R14_IRQ-R13_IRQ,R12~R0,CPSR,SPSR_IRQ

0B10011 SUPERVISOR PC,R14_SVC-R13_SVC,R12~R0,CPSR,SPSR_SVC

0b10111 ABORT PC,R14_ABT-R13_ABT,R12~R0,CPSR,SPSR_ABT

0b11011 UNDEFINEED PC,R14_UND-R8_UND,R12~R0,CPSR,SPSR_UND

0b11111 SYSTEM PC,R14-R0,CPSR(ARM V4以及更高版本)

***CPSR中的其他位***

這些位用於將來擴展。應用軟件不要操作這些位。

-------------------------------------------------------------------

(CPSR,SPSR)訪問指令

ARM 微處理器支持程序狀態寄存器訪問指令,用於在程序狀態寄存器和通用寄存器之間傳送數據,程序狀態寄存器訪問指令包括以下兩條:

— cjdts: 程序狀態寄存器到通用寄存器的數據傳送指令

— MSR: 通用寄存器到程序狀態寄存器的數據傳送指令

1、 cjdts 指令

cjdts 指令的格式為:cjdts{條件} 通用寄存器,程序狀態寄存器(CPSR 或SPSR)

cjdts 指令用於將程序狀態寄存器的內容傳送到通用寄存器中。該指令一般用在以下幾種情況:

- 當需要改變程序狀態寄存器的內容時,可用cjdts 將程序狀態寄存器的內容讀入通用寄存器,修改后再寫回程序狀態寄存器。

- 當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然后保存。

指令示例:

cjdts R0,CPSR ;傳送CPSR 的內容到R0

cjdts R0,SPSR ;傳送SPSR 的內容到R0

2、 MSR 指令

MSR 指令的格式為:MSR{條件} 程序狀態寄存器(CPSR 或SPSR)_,操作數

MSR 指令用於將操作數的內容傳送到程序狀態寄存器的特定域中。其中,操作數可以為通用寄存器或立即數。用於設置程序狀態寄存器中需要操作的位,32 位的程序狀態寄存器可分為4 個域:

位[31:24]為條件標志位域,用f 表示;

位[23:16]為狀態位域,用s 表示;

位[15:8]為擴展位域,用x 表示;

位[7:0]為控制位域,用c 表示;

該指令通常用於恢復或改變程序狀態寄存器的內容,在使用時,一般要在MSR 指令中指明將要操作的域。

指令示例:

MSR CPSR,R0 ;傳送R0 的內容到CPSR

MSR SPSR,R0 ;傳送R0 的內容到SPSR

MSR CPSR_c,R0 ;傳送R0 的內容到SPSR,但僅僅修改CPSR 中的控制位域

/**************************************************************/

1  狀態寄存器傳送至通用寄存器類指令

功能:將狀態寄存器的內容傳送至通用寄存器。

格式:

cjdts{}Rd,CPSR}SPSR

其中:

Rd      目標寄存器,Rd不允許R15。

R=0     將CPSR中的內容傳送目的寄存器。

R=1     將SPSR中的內容傳送至目的寄存器。

注釋:

cjdts與MSR配合使用,作為更新PSR的讀-修改-寫序列的一部分。例如:改變處理器或清除標志Q。注意:當處理器在用戶模式或系統模式下,一定不能試圖訪問SPSR這條指令,不影響條件碼標志。

例:

cjdts   R0,CRSR              ;將CPSR中的內容傳送至R0

cjdts   R3,SPSR              ;將SPSR中的內容傳送至R3

2 .通用寄存器傳送至狀態寄存器傳送指令

功能:將通用寄存器的內容傳送至狀態寄存器.

格式:

MSR{CPSR_f|SPSR_f,

MSR{CPSR_|SPSR_,Rm

其中:

字段可以是以下之一或多種:

C:控制域屏蔽字段(PSR中的第0位到第7位);

X:擴展域屏蔽字段(PSR中的第8位到第15位);

S:狀態域屏蔽字段(PSR中的第16位到第32位);

F:標志域屏蔽字段(PSR中的第24位到第31位)。

immed_8r  值數字常量的表達式。常量必須對應8位位圖。該位圖在32位字中循環移位偶數數位。

Rm        源寄存器。

注釋:

同前一條指令(cjdts)。

例1:設置N、Z、C、V標志。

MSR    CPSR_f,#&f0000000            ;僅高位有效,其他必須為0

例2:

僅置位C標志,保留N、Z、V標志。

cjdts    R0,CPSR                    ;將CPSR中的內容傳送至R0

ORR    R0,R0,#&1f                ;置位R0的第29位

MSR    CPSR_c,R0                   ;再將R0中的內容傳送至CPSR

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。