ARM處理器CPSR標誌位和條件符之間的關係

本文目的是要理清ARM處理器的CPSR狀態標誌和ARM指令的條件符之間的關係。 程序員

1、CPSR寄存器 測試

ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配以下圖1所示。 spa

圖1 程序狀態寄存器格式 get

狀態標誌位含義:(其它位的含義和本文主題無關,此處很少介紹) 二進制

N
        N=1 表示運算的結果爲負數;N=0 表示運算的結果爲正數或零;
        Z
        Z=1 表示運算的結果爲零;Z=0表示運算的結果爲非零;
        C
            能夠有4種方法設置C的值:
        ─ 加法運算(包括比較指令CMN):當運算結果產生了進位時(無符號數溢出),C=1,不然C=0。
        ─ 減法運算(包括比較指令CMP):當運算時產生了借位,C=0,不然C=1。
        ─ 對於包含移位操做的非加/減運算指令,C爲移出值的最後一位。
        ─ 對於其餘的非加/減運算指令,C的值一般不改變。
        V
            能夠有2種方法設置V的值:
        ─ 對於加/減法運算指令,當操做數和運算結果爲二進制的補碼錶示的帶符號數時,V=1表示符號位溢出。
        ─ 對於其餘的非加/減運算指令,V的值一般不改變 程序

2、條件符及對應的標誌位 方法

表1 條件符描述表
         im

3、關於C、V值更多的解釋 總結

處理器內部以補碼錶示有符號數,8個二制位可以表達的整數範圍是:+127 ~ -128,16位表達的範圍是:+32767 ~ -32768。若是運算結果超出了這個範圍,就是產生了溢出,有溢出,說明有符號數的運算結果須要考慮溢出狀況。 數據

溢出標誌V和進位標誌C是兩個意義不一樣的標誌。進位標誌表示無符號數運算結果是否超出範圍;溢出標誌表示有符號數運算結果是否超出範圍。

處理器對兩個操做數進行運算時,按照無符號數求得結果,並相應設置進位標誌C;同時,根據是否超出有符號數的範圍設置溢出標誌V。

應該利用哪一個標誌,則由程序員來決定。也就是說,若是將參加運算的操做數認爲是無符號數,就應該關心進位;認爲是有符號數,則要注意是否溢出。

判斷運算結果是否溢出有一個簡單的規則:只有當兩個相同符號數相加,而運算結果的符號與原數據符號相反時,產生溢出;其餘狀況下,則不會產生溢出。

代碼舉例1:

LDR     r0, =0x7fffffff
        LDR     r1, =0x70000000;
        ADDS    r0, r0, r1; //結果=0xefffffff
        對於無符號數運算來講,沒有進位。
        對於有符號數運算來講,溢出。
        此時C=0 V=1;

代碼舉例2:
        LDR     r0, =0xffffffff
        LDR     r1, =0x70000000;
        ADDS    r0, r0, r1; //結果=0x6fffffff
        對於無符號數運算來講,有進位。
        對於有符號數運算來講,無溢出。
        此時C=1 V=0;

代碼舉例3:
        LDR     r0, =0x8fffffff
        LDR     r1, =0xf0000000 ;
        ADDS    r0, r0, r1; //結果=0x7fffffff
        此時C=? V=?;(思考一下,而後在ARM模擬器中驗證下)

代碼舉例4://思考減法時,C值的影響
        LDR     r0, =0x3
        LDR     r1, =0x2
        SUBS    r0, r0, r1
        對比:
        LDR     r0, =0x3
        LDR     r1, =-2;(-2的補碼0xfffffffe會送到r1)
        ADDS    r0, r0, r1

4、CPSR狀態標誌和ARM指令的條件符之間的關係

有了上面的背景知識之後,接下來思考表1中CPSR狀態標誌和ARM指令的條件符之間的關係,下面選取其中的一項來分析。
        如:GE:(有符號數大於等於)
        N=0 V=0:結果是大於等於0的數,且無符合溢出,因此大於等於關係成立
        N=1 V=1:結果小於0,但有符號溢出
                            考慮如下狀況:c=a-b
                            1.a<0, b<0          
                            減法操做時不可能符號溢出     
                            2.a>0, b<0         
                            可能出現N=V=1?? 如(8位數):100-(-100)=200
                            顯然a>b
                            3.a<0, b>0
                            參照上面提到過的判斷溢出標誌的簡單規則,能夠得出:在此狀況下,
                            減法操做時若是結果小於0 (N=1),則不會出現符號溢出
                            因此(在N=1 V=1前提下a<0,b>0)這種狀況不可能出現
                            4.a>0, b>0
                            減法操做不可能出現符號溢出。

其它項的分析過程相似。

5、總結

儘管以上分析看起來有點複雜,但使用時在大多數狀況下用一個簡單的條件測試指令便可,不須要程序員計算出條件碼的精確值便可獲得須要的結果。(做者:劉洪濤,華清遠見嵌入式學院講師。

相關文章
相關標籤/搜索