新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM Cortex-M3 學習筆記(4-4)

        ARM Cortex-M3 學習筆記(4-4)

        作者: 時間:2016-11-20 來源:網絡 收藏
        最近在學ARM Cortex-M3,找了本號稱很經典的書“An Definitive Guide to The ARM Cortex-M3”在看。這個系列學習筆記其實就是在學習這本書的過程中做的讀書筆記。

        無條件跳轉指令

        跳轉指令分為無條件跳轉和有條件跳轉兩大類。無條件跳轉類指令非常簡單,常見的就四種形式。

        本文引用地址:http://www.104case.com/article/201611/318832.htm

        B Label ;跳轉到Label處對應的地址, 無條件跳轉指令

        BX reg ;跳轉到由寄存器reg給出的地址, 無條件跳轉指令

        BL Label ;跳轉到Label對應的地址,并且把跳轉前的下條指令地址保存到LR

        BLX reg ;跳轉到由寄存器reg給出的地址,并根據REG的LSB切換處理器狀態,還要把轉移前的下條指令地址保存到LR

        標志位與條件轉移指令

        在講解條件跳轉指令之前。先要講講APSR中的四個四個標志位:N, Z, C, V。

        實際上,Cortex-M3中的APSR的標志位共有5個,但只有NZCV這四個可以用于條件跳轉指令。下圖中先給出Cortex-M3中的程序狀態寄存器(xPSR)的位圖。

        圖 1 Cortex-M3中的程序狀態寄存器(xPSR)

        可以看出,NZCV這四位位于xPSR 的最高四位。這四位的作用分別如下:

        標志位

        作用

        N

        負數(上一次操作的結果是個負數)。N=操作結果的MSB

        Z

        零(上次操作的結果是0)。當數據操作指令的結果為0,或者比較/測試的結果為0時,Z置位。

        C

        進位(上次操作導致了進位)。C用于無符號數據處理,最常見的就是當加法進位及減法無借位時C被置位。此外,C還充當移位指令的中介(詳見v7M參考手冊的指令介紹節)。

        V

        溢出(上次操作結果導致了數據的溢出)。該標志用于帶符號的數據處理。比如,在兩個正數上執行ADD運算后,和的MSB為1(視作負數),則V置位。

        關于C和V這兩位我要多說幾句。Cortex-M3中的進位標志與其他一些單片機有些不同。對加法運算它表示的是結果有進位,這與其他單片機中的含義是相同的。對減法運算,它表示的是結果無借位,與有一些單片機(比如Freescale 的68HC11/12系列)中的含義正好相反。之所以這里這樣定義進位標志,我想是這樣考慮的。整數的減法運算A-B實際是轉化為了A+(-B),-B用補碼表示。進位標志C指示的是A與(-B)相加時是否有進位。A-B無進位等價于A+(-B)有進位。當然,后來我發現有個特例,就是當B=0時,(-B)=0,A-0 是沒有進位的,但A+(-0)也沒有進位。這時可以這樣理解,對0取反操作時,也就是得到-0時已經產生的進位(取反加1,加1時進位了)。所以結果也認為是進位了。

        溢出位(V)置位有四種情況:

        1.兩個整數相加結果為負數時

        2.兩個負數相加結果為正數時

        3.一個正數減一個負數結果為負數時

        4.一個負數減一個正數結果為正數時

        這四種情況與我們的直觀是一致的,因此不需要特殊記憶。

        擔任條件跳轉及條件執行的判據時,這4個標志位既可單獨使用,又可組合使用,以產生共15種跳轉判據,如下表所示。

        符號

        條件

        關系到的標志位

        EQ

        相等(EQual)

        Z==1

        NE

        不等(NotEqual)

        Z==0

        CS/HS

        進位(CarrySet)

        無符號數大于等于

        C==1

        CC/LO

        未進位(CarryClear)

        無符號數小于

        C==0

        MI

        負數(MInus)

        N==1

        PL

        非負數

        N==0

        VS

        溢出

        V==1

        VC

        未溢出

        V==0

        HI

        無符號數大于

        C==1 && Z==0

        LS

        無符號數小于等于

        C==0 || Z==1

        GE

        帶符號數大于等于

        N==V

        LT

        帶符號數小于

        N!=V

        GT

        帶符號數大于

        Z==0 && N==V

        LE

        帶符號數小于等于

        Z==1 || N!=V

        AL

        總是

        -

        上面的表格將各種情況都羅列的很清楚,但為什么是這樣還是值得詳細地說說的。

        EQ、NE、MI、PL、VS、VC和AL 很好理解,不用多說。

        值得細說的是CS/HS、CC/LO、HI、LS、GE、LT、GT、LE。

        首先,我們知道在計算機中,整數分為有符號型和無符號型。這兩種類型的判別是不同的。先說無符號數。假設有兩個無符號整數A和B。他們之間的關系可以為:

        A==B、A!=B、A>B、A>=B、A

        判斷的方法就是兩數字相減A-B=D,然后看標志位。

        A==B、A!=B 看 Z 位就可以了,這里不詳述。

        對于A>B,首先Z==0(表明兩數不相等),然后得到的結果必須滿足D<=A,也就是進位標志C==1(表示減法時沒有產生借位),合起來就是Z==0&& C==1,這時用后綴HI。這里啰嗦一句,進位標志置1的含義是加法時產生了進位或減法時沒有產生借位。

        對于A>=B,只用進位標志C==1(沒有產生借位)就可以了,用后綴HS或CS。

        對于A

        對于A<=B,要么就是Z==1(兩數相等),要么C==0(A

        假設A和B是有符號整數。他們之間的關系同樣可以為:

        A==B、A!=B、A>B、A>=B、A

        A==B、A!=B 看 Z 位就可以了。

        其他的比較稍微困難一些,我們要用到溢出位V。

        對于A>B,有三種可能的情況

        A、B都是正數,結果D是正數。Z==0 && V==0 && N==0

        A、B都是負數,結果D是正數。Z==0 && V==0 && N==0

        A是正數、B是負數,結果D可能是正數(Z==0 && V==0 && N==0)也可能是負數(V==1 && N==1)

        對于A

        A、B都是正數,結果D是負數。V==0 && N==1,不用考慮Z,因為N==1決定了Z==0

        A、B都是負數,結果D是負數。V==0 && N==1,不用考慮Z,因為N==1決定了Z==0

        A是負數、B是正數,結果D可能是正數(V==1 && N==0)也可能是負數(V==0&& N==1),與上面的情況類似,V如果等于1了,Z必然等于0,所以還是不用考慮Z。

        綜合上面六種情況,我們可以得到:

        A>B 等價于 Z==0 && V==N

        A

        有了上面的分析,下面兩種情況就很容易得到答案了。

        對于A>=B,V==N 就足夠了

        對于A<=B,Z==1 || V!= N

        IF-THEN 指令塊

        IF-THEN(IT)指令塊在其他的單片機中沒有見過,這里值得講一講。

        IF-THEN(IT)指令圍起一個塊,里面最多有4條指令,它里面的指令可以條件執行。

        IT的使用形式如下:

        IT ;圍起1條指令的IF-THEN塊

        IT ;圍起2條指令的IF-THEN塊

        IT ;圍起3條指令的IF-THEN塊

        IT ;圍起4條指令的IF-THEN塊

        其中, ,的取值可以是“T”或者“E”。下面是個例子:

        要實現如下的功能:

        if (R0==R1)

        {

        R3 = R4 + R5;

        R3 = R3 / 2;

        }

        else

        {

        R3 = R6 + R7;

        R3 = R3 / 2;

        }

        可以寫作:

        CMP R0, R1 ; 比較R0和R1

        ITTEE

        ADDEQ R3, R4, R5 ; 相等時加法EQ ; 如果R0 == R1,Then-Then-Else-Else

        ASREQ R3, R3, #1 ; 相等時算術右移

        ADDNE R3, R6, R7 ; 不等時加法

        ASRNE R3, R3, #1 ; 不等時算術右移

        IT指令塊的初衷應該是避免了在執行轉移指令時,對流水線的清洗和重新指令預取的開銷,但是最多只能有四條指令,使它的使用范圍也很受限。可能也就是C語言中用到“:?”運算符的地方比較容易匯編為IT指令塊了。還有個邊很短小的if判斷,能夠被這么優化。



        關鍵詞: ARMCortex-M

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 山东| 仙居县| 西平县| 津南区| 马边| 资溪县| 平安县| 太湖县| 绥滨县| 陆丰市| 涞水县| 阿巴嘎旗| 菏泽市| 金塔县| 沧源| 木兰县| 启东市| 金华市| 灵宝市| 怀宁县| 松滋市| 安溪县| 赤峰市| 读书| 奎屯市| 寻甸| 蓬安县| 驻马店市| 宣化县| 隆子县| 潢川县| 五峰| 德安县| 玛多县| 齐河县| 班戈县| 睢宁县| 孟津县| 美姑县| 香港 | 毕节市|