新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > arm條件執行

        arm條件執行

        作者: 時間:2016-11-21 來源:網絡 收藏
        條件執行

        指令格式
        ARM 處理器的一個非常特殊的特征是它的條件執行。我們指的不是基本的如果進位則分支,ARM 使這個邏輯階段進一步深化為如果進位則 XXX - 這里的 XXX 是任何東西。
        為了舉例,下面是 Intel 8086 處理器分支指令的一個列表:
        JA Jump if Above
        JAE Jump if Above or Equal
        JB Jump if Below
        JBE Jump if Below or Equal
        JC Jump if Carry
        JCXZ Jump if CX Zero (CX is a register that can be used for loop counts)
        JE Jump if Equal
        JG Jump if Greater than
        JGE Jump if Greater than or Equal
        JL Jump if Less than
        JLE Jump if Less Than or Equal
        JMP JuMP
        JNA Jump if Not Above
        JNAE Jump if Not Above or Equal
        JNB Jump if Not Below
        JNBE Jump if Not Below or Equal
        JNC Jump if No Carry
        JNE Jump if Not Equal
        JNG Jump if Not Greater than
        JNGE Jump if Not Greater than or Equal
        JNL Jump if Not Less than
        JNLE Jump if Not Less than or Equal
        JNO Jump if Not Overflow
        JNP Jump if Not Parity
        JNS Jump if Not Sign
        JNZ Jump if Not Zero
        JO Jump if Overflow
        JP Jump if Parity
        JPE Jump if Parity Even
        JPO Jump if Parity Odd
        JS Jump if Sign
        JZ Jump if Zero
        80386 添加了:
        JECXZ Jump if ECX Zero
        作為對比,ARM 處理器只提供了:
        B 分支
        BL 帶連接的分支
        但 ARM 提供了條件執行,你可以不受這個表面上不靈活的方式的限制:
        BEQ Branch if EQual
        BNE Branch if Not Equal
        BVS Branch if oVerflow Set
        BVC Branch if oVerflow Clear
        BHI Branch if HIgher
        BLS Branch if Lower or the Same
        BPL Branch if PLus
        BMI Branch if MInus
        BCS Branch if Carry Set
        BCC Branch if Carry Clear
        BGE Branch if Greater than or Equal
        BGT Branch if Greater Than
        BLE Branch if Less than or Equal
        BLT Branch if Less Than
        BLEQ Branch with Link if EQual
        ....
        BLLT Branch with Link if Less Than
        還有兩個代碼,
        AL - ALways,缺省條件所以不須指定
        NV - NeVer,不是非常有用。你無論如何不要使用這個代碼...
        當你發現所有 Bxx 指令實際上是同一個指令的時候,緊要關頭就到了。接著你會想,如果你可以在一個分支指令上加上所有這些條件,那么對一個寄存器裝載指令能否加上它們? 答案是可以。
        下面是可獲得的條件代碼的列表:
        EQ : 等于
        如果一次比較之后設置了 Z 標志。
        NE : 不等于
        如果一次比較之后清除了 Z 標志。
        VS : 溢出設置
        如果在一次算術操作之后設置了 V 標志,計算的結果不適合放入一個 32bit 目標寄存器中。
        VC : 溢出清除
        如果清除了 V 標志,與 VS 相反。
        HI : 高于(無符號)
        如果一次比較之后設置了 C 標志并清除了 Z 標志。
        LS : 低于或同于(無符號)
        如果一次比較操作之后清除了 C 標志或設置了 Z 標志。
        PL : 正號
        如果一次算術操作之后清除了 N。出于定義‘正號’的目的,零是正數的原因是它不是負數...
        MI : 負號
        如果一次算術操作之后設置了 N 標志。
        CS : 進位設置
        如果一次算術操作或移位操作之后設置了 C 標志,操作的結果不能表示為 32bit。你可以把 C 標志當作結果的第 33 位。
        CC : 進位清除
        與 CS 相反。
        GE : 大于或等于(有符號)
        如果一次比較之后...
        設置了 N 標志并設置了 V 標志
        或者...
        清除了 N 標志并清除了 V 標志。
        GT : 大于(有符號)
        如果一次比較之后...
        設置了 N 標志并設置了 V 標志
        或者...
        清除了 N 標志并清除了 V 標志
        并且...
        清除了 Z 標志。
        LE : 小于或等于(有符號)
        如果一次比較之后...
        設置了 N 標志并清除了 V 標志
        或者...
        清除了 N 標志并設置了 V 標志
        并且...
        設置了 Z 標志。
        LT : 小于(有符號)
        如果一次比較之后...
        設置了 N 標志并清除了 V 標志。
        或者...
        清除了 N 標志并設置了 V 標志。
        AL : 總是
        缺省條件,所以不用明顯聲明。
        NV : 從不
        不是特別有用,它表示應當永遠不執行這個指令。是窮人的 NOP。
        包含 NV 是為了完整性(與 AL 相對),你不應該在你的代碼中使用它。
        有一個在最后的條件代碼 S,它以相反的方式工作。當用于一個指令的時候,導致更改狀態標志。這不是自動發生的 - 除非這些指令的目的是設置狀態。例如:
        ADD R0, R0, R1
        ADDS R0, R0, R1
        ADDEQS R0, R0, R1
        第一個例子是一個基本的加法(把 R1 的值增加到 R0),它不影響狀態寄存器。
        第二個例子是同一個加法,只不過它導致更改狀態寄存器。
        最后一個例子是同一個加法,更改狀態寄存器。不同在于它是一個有條件的指令。只有前一個操作的結果是 EQ (如果設置了 Z 標志)的時候它才執行。
        下面是條件執行的一個工作中的例子。你把寄存器 0 與存儲在寄存器 10 中內容相比較。如果不等于 R10,則調用一個軟件中斷,增加它并分支回來再次做這些。否則清除 R10 并返回到調用它的那部分代碼(它的地址存儲在 R14)。
        條件執行的一個例子
        .loop ; 標記循環開始位置
        CMP R0, R10 ; 把 R0 與 R10 相比較
        SWINE &40017 ; 不等于: 調用 SWI &40017
        ADDNE R0, R0, #1 ; 向 R0 加 1
        BNE loop ; 分支到 loop
        MOV R10, #0 ; 等于 : 設置 R10 為零
        LDMFD R13!, {R0-R12,PC} ; 返回到調用者
        注解:
        SWI 編號就象我寫的這樣。在 RISC OS 下,它是給 Econet_DoImmediate 的編號。不要字面的接受它,這只是一個例子!
        你可能以前沒見過 LDMFD,它從棧中裝載多個寄存器。在這個例子中,我們從一個完全正式的棧中裝載 R0 至 R12 和 R14。關于寄存器裝載和存儲的更多信息請參閱 str.html。
        我說要裝載 R14。那么為什么要把它放入 PC 中? 原因是此時 R14 存儲的值包含返回地址。我們也可以采用:
        LDMFD R13!, {R0-R12,R14}
        MOV PC, R14
        但是直接恢復到 PC 中可以省略這個 MOV 語句。
        最后,這些寄存器很有可能被一個 SWI 調用所占用(依賴于在調用期間執行的代碼),所以你最好把你的重要的寄存器壓入棧中,以后在恢復它們。

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


        關鍵詞: arm條件執

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 金寨县| 新干县| 静安区| 桦川县| 三台县| 淳安县| 中江县| 海原县| 克拉玛依市| 烟台市| 淳化县| 天全县| 吉木乃县| 吉林市| 成安县| 临洮县| 泸定县| 黎川县| 田林县| 连平县| 无棣县| 玉环县| 尖扎县| 永修县| 新源县| 始兴县| 海城市| 连州市| 沧源| 武城县| 瑞丽市| 民和| 桐乡市| 曲松县| 曲周县| 江阴市| 崇阳县| 洪雅县| 台中市| 巴马| 天祝|