在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            arm條件執(zhí)行

            作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            條件執(zhí)行

            指令格式
            ARM 處理器的一個(gè)非常特殊的特征是它的條件執(zhí)行。我們指的不是基本的如果進(jìn)位則分支,ARM 使這個(gè)邏輯階段進(jìn)一步深化為如果進(jìn)位則 XXX - 這里的 XXX 是任何東西。
            為了舉例,下面是 Intel 8086 處理器分支指令的一個(gè)列表:
            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
            作為對(duì)比,ARM 處理器只提供了:
            B 分支
            BL 帶連接的分支
            但 ARM 提供了條件執(zhí)行,你可以不受這個(gè)表面上不靈活的方式的限制:
            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
            還有兩個(gè)代碼,
            AL - ALways,缺省條件所以不須指定
            NV - NeVer,不是非常有用。你無論如何不要使用這個(gè)代碼...
            當(dāng)你發(fā)現(xiàn)所有 Bxx 指令實(shí)際上是同一個(gè)指令的時(shí)候,緊要關(guān)頭就到了。接著你會(huì)想,如果你可以在一個(gè)分支指令上加上所有這些條件,那么對(duì)一個(gè)寄存器裝載指令能否加上它們? 答案是可以。
            下面是可獲得的條件代碼的列表:
            EQ : 等于
            如果一次比較之后設(shè)置了 Z 標(biāo)志。
            NE : 不等于
            如果一次比較之后清除了 Z 標(biāo)志。
            VS : 溢出設(shè)置
            如果在一次算術(shù)操作之后設(shè)置了 V 標(biāo)志,計(jì)算的結(jié)果不適合放入一個(gè) 32bit 目標(biāo)寄存器中。
            VC : 溢出清除
            如果清除了 V 標(biāo)志,與 VS 相反。
            HI : 高于(無符號(hào))
            如果一次比較之后設(shè)置了 C 標(biāo)志并清除了 Z 標(biāo)志。
            LS : 低于或同于(無符號(hào))
            如果一次比較操作之后清除了 C 標(biāo)志或設(shè)置了 Z 標(biāo)志。
            PL : 正號(hào)
            如果一次算術(shù)操作之后清除了 N。出于定義‘正號(hào)’的目的,零是正數(shù)的原因是它不是負(fù)數(shù)...
            MI : 負(fù)號(hào)
            如果一次算術(shù)操作之后設(shè)置了 N 標(biāo)志。
            CS : 進(jìn)位設(shè)置
            如果一次算術(shù)操作或移位操作之后設(shè)置了 C 標(biāo)志,操作的結(jié)果不能表示為 32bit。你可以把 C 標(biāo)志當(dāng)作結(jié)果的第 33 位。
            CC : 進(jìn)位清除
            與 CS 相反。
            GE : 大于或等于(有符號(hào))
            如果一次比較之后...
            設(shè)置了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
            或者...
            清除了 N 標(biāo)志并清除了 V 標(biāo)志。
            GT : 大于(有符號(hào))
            如果一次比較之后...
            設(shè)置了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
            或者...
            清除了 N 標(biāo)志并清除了 V 標(biāo)志
            并且...
            清除了 Z 標(biāo)志。
            LE : 小于或等于(有符號(hào))
            如果一次比較之后...
            設(shè)置了 N 標(biāo)志并清除了 V 標(biāo)志
            或者...
            清除了 N 標(biāo)志并設(shè)置了 V 標(biāo)志
            并且...
            設(shè)置了 Z 標(biāo)志。
            LT : 小于(有符號(hào))
            如果一次比較之后...
            設(shè)置了 N 標(biāo)志并清除了 V 標(biāo)志。
            或者...
            清除了 N 標(biāo)志并設(shè)置了 V 標(biāo)志。
            AL : 總是
            缺省條件,所以不用明顯聲明。
            NV : 從不
            不是特別有用,它表示應(yīng)當(dāng)永遠(yuǎn)不執(zhí)行這個(gè)指令。是窮人的 NOP。
            包含 NV 是為了完整性(與 AL 相對(duì)),你不應(yīng)該在你的代碼中使用它。
            有一個(gè)在最后的條件代碼 S,它以相反的方式工作。當(dāng)用于一個(gè)指令的時(shí)候,導(dǎo)致更改狀態(tài)標(biāo)志。這不是自動(dòng)發(fā)生的 - 除非這些指令的目的是設(shè)置狀態(tài)。例如:
            ADD R0, R0, R1
            ADDS R0, R0, R1
            ADDEQS R0, R0, R1
            第一個(gè)例子是一個(gè)基本的加法(把 R1 的值增加到 R0),它不影響狀態(tài)寄存器。
            第二個(gè)例子是同一個(gè)加法,只不過它導(dǎo)致更改狀態(tài)寄存器。
            最后一個(gè)例子是同一個(gè)加法,更改狀態(tài)寄存器。不同在于它是一個(gè)有條件的指令。只有前一個(gè)操作的結(jié)果是 EQ (如果設(shè)置了 Z 標(biāo)志)的時(shí)候它才執(zhí)行。
            下面是條件執(zhí)行的一個(gè)工作中的例子。你把寄存器 0 與存儲(chǔ)在寄存器 10 中內(nèi)容相比較。如果不等于 R10,則調(diào)用一個(gè)軟件中斷,增加它并分支回來再次做這些。否則清除 R10 并返回到調(diào)用它的那部分代碼(它的地址存儲(chǔ)在 R14)。
            條件執(zhí)行的一個(gè)例子
            .loop ; 標(biāo)記循環(huán)開始位置
            CMP R0, R10 ; 把 R0 與 R10 相比較
            SWINE &40017 ; 不等于: 調(diào)用 SWI &40017
            ADDNE R0, R0, #1 ; 向 R0 加 1
            BNE loop ; 分支到 loop
            MOV R10, #0 ; 等于 : 設(shè)置 R10 為零
            LDMFD R13!, {R0-R12,PC} ; 返回到調(diào)用者
            注解:
            SWI 編號(hào)就象我寫的這樣。在 RISC OS 下,它是給 Econet_DoImmediate 的編號(hào)。不要字面的接受它,這只是一個(gè)例子!
            你可能以前沒見過 LDMFD,它從棧中裝載多個(gè)寄存器。在這個(gè)例子中,我們從一個(gè)完全正式的棧中裝載 R0 至 R12 和 R14。關(guān)于寄存器裝載和存儲(chǔ)的更多信息請(qǐng)參閱 str.html。
            我說要裝載 R14。那么為什么要把它放入 PC 中? 原因是此時(shí) R14 存儲(chǔ)的值包含返回地址。我們也可以采用:
            LDMFD R13!, {R0-R12,R14}
            MOV PC, R14
            但是直接恢復(fù)到 PC 中可以省略這個(gè) MOV 語句。
            最后,這些寄存器很有可能被一個(gè) SWI 調(diào)用所占用(依賴于在調(diào)用期間執(zhí)行的代碼),所以你最好把你的重要的寄存器壓入棧中,以后在恢復(fù)它們。

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


            關(guān)鍵詞: arm條件執(zhí)

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉