新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編指令集之四——數據處理指令

        ARM匯編指令集之四——數據處理指令

        作者: 時間:2016-11-09 來源:網絡 收藏
        數據處理指令可分為數據傳送指令、算術邏輯運算指令和比較指令等。

        數據傳送指令用于在寄存器和存儲器之間進行數據的雙向傳輸。

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

        算術邏輯運算指令完成常用的算術與邏輯運算,該類指令不但將運算結果保存在目的寄存器中,同時更新CPSR中相應條件標志位。

        比較指令不保存運算結果,只更新CPSR中相應的條件標志位。

        數據處理指令共以下16條。

        1、MOV指令

        MOV指令的格式為:

        MOV{條件}{S}目的寄存器,源操作數

        MOV指令可完成從另一個寄存器、被移位的寄存器或將一個立即數加載到目的寄存器。

        其中S選項決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。

        指令示例:

        MOV R1,R0;將寄存器R0的值傳送到寄存器R1

        MOV PC,R14;將寄存器R14的值傳送到PC,常用于子程序返回

        MOV R1,R0,LSL#3;將寄存器R0的值左移3位后傳送到R1

        2、MVN指令

        MVN指令的格式為:

        MVN{條件}{S}目的寄存器,源操作數

        MVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。

        其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。

        指令示例:

        MVNR0,#0;將立即數0取反傳送到寄存器R0中,完成后R0=-1

        3、CMP指令

        CMP指令的格式為:

        CMP{條件}操作數1,操作數2

        CMP指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR中條件標志位的值。

        該指令進行一次減法運算,但不存儲結果,只更改條件標志位。標志位表示的是操作數1與操作數2的關系(大、小、相等),例如,當操作數1大于操作操作數2,則此后的有GT后綴的指令將可以執行。

        指令示例:

        CMPR1,R0;將寄存器R1的值與寄存器R0的值相減,并根據結果設置CPSR的標志位

        CMP R1,#100;將寄存器R1的值與立即數100相減,并根據結果設置CPSR的標志位

        4、CMN指令

        CMN指令的格式為:

        CMN{條件}操作數1,操作數2

        CMN指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后進行比較,同時更新CPSR中條件標志位的值。該指令實際完成操作數1和操作數2相加,并根據結果更改條件標志位。

        指令示例:

        CMNR1,R0;將寄存器R1的值與寄存器R0的值相加,并根據結果設置CPSR的標志位

        CMN R1,#100;將寄存器R1的值與立即數100相加,并根據結果設置

        5、TST指令

        TST指令的格式為:

        TST{條件}操作數1,操作數2

        TST指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,并根據運算結果更新CPSR中條件標志位的值。

        操作數1是要測試的數據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。

        指令示例:

        TSTR1,#%1;用于測試在寄存器R1中是否設置了最低位(%表示二進制數

        TST R1,#0xffe;將寄存器R1的值與立即數0xffe按位與,并根據結果設置CPSR的標志位

        6、TEQ指令

        TEQ指令的格式為:

        TEQ{條件}操作數1,操作數2

        TEQ指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,并根據運算結果更新CPSR中條件標志位的值。

        該指令通常用于比較操作數1和操作數2是否相等。

        指令示例:

        TEQR1,R2;將寄存器R1的值與寄存器R2的值按位異或,并根據結果設置CPSR的標志位

        7、ADD指令

        ADD指令的格式為:

        ADD{條件}{S}目的寄存器,操作數1,操作數2

        ADD指令用于把兩個操作數相加,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。

        指令示例:

        ADDR0,R1,R2;R0 = R1 + R2

        ADDR0,R1,#256;R0 = R1 + 256

        ADDR0,R2,R3,LSL#1;R0 = R2 + (R3 << 1)

        8、ADC指令

        ADC指令的格式為:

        ADC{條件}{S}目的寄存器,操作數1,操作數2

        ADC指令用于把兩個操作數相加,再加上CPSR中的C條件標志位的值,并將結果存放到目的寄存器中。它使用一個進位標志位,這樣就可以做比32位大的數的加法,注意不要忘記設置S后綴來更改進位標志。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。

        以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7~R4,第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄存器R3~R0:

        ADDSR0,R4,R8;加低端的字

        ADCSR1,R5,R9;加第二個字,帶進位

        ADCSR2,R6,R10;加第三個字,帶進位

        ADCR3,R7,R11;加第四個字,帶進位

        9、SUB指令

        SUB指令的格式為:

        SUB{條件}{S}目的寄存器,操作數1,操作數2

        SUB指令用于把操作數1減去操作數2,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令可用于有符號數或無符號數的減法運算。

        指令示例:

        SUBR0,R1,R2;R0 = R1 - R2

        SUBR0,R1,#256;R0 = R1 - 256

        SUBR0,R2,R3,LSL#1;R0 = R2 - (R3 << 1)

        10、SBC指令

        SBC指令的格式為:

        SBC{條件}{S}目的寄存器,操作數1,操作數2

        SBC指令用于把操作數1減去操作數2,再減去CPSR中的C條件標志位的反碼,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設置S后綴來更改進位標志。該指令可用于有符號數或無符號數的減法運算。

        指令示例:

        SBCSR0,R1,R2;R0 = R1 - R2 -!C,并根據結果設置CPSR的進位標志位

        11、RSB指令

        RSUB指令的格式為:

        RSB{條件}{S}目的寄存器,操作數1,操作數2

        RSB指令稱為逆向減法指令,用于把操作數2減去操作數1,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令可用于有符號數或無符號數的減法運算。

        指令示例:

        RSB R0,R1,R2;R0 = R2–R1

        RSB R0,R1,#256;R0 = 256–R1

        RSB R0,R2,R3,LSL#1;R0 = (R3 << 1) - R2

        12、RSC指令

        RSC指令的格式為:

        RSC{條件}{S}目的寄存器,操作數1,操作數2

        RSC指令用于把操作數2減去操作數1,再減去CPSR中的C條件標志位的反碼,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設置S后綴來更改進位標志。該指令可用于有符號數或無符號數的減法運算。

        指令示例:

        RSCR0,R1,R2;R0 = R2–R1 -!C

        13、AND指令

        AND指令的格式為:

        AND{條件}{S}目的寄存器,操作數1,操作數2

        AND指令用于在兩個操作數上進行邏輯與運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用于屏蔽操作數1的某些位。

        指令示例:

        AND R0,R0,#3;該指令保持R0的0、1位,其余位清零。

        14、ORR指令

        ORR指令的格式為:

        ORR{條件}{S}目的寄存器,操作數1,操作數2

        ORR指令用于在兩個操作數上進行邏輯或運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用于設置操作數1的某些位。

        指令示例:

        ORR R0,R0,#3;該指令設置R0的0、1位,其余位保持不變。

        15、EOR指令

        EOR指令的格式為:

        EOR{條件}{S}目的寄存器,操作數1,操作數2

        EOR指令用于在兩個操作數上進行邏輯異或運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用于反轉操作數1的某些位。

        指令示例:

        EOR R0,R0,#3;該指令反轉R0的0、1位,其余位保持不變。

        16、BIC指令

        BIC指令的格式為:

        BIC{條件}{S}目的寄存器,操作數1,操作數2

        BIC指令用于清除操作數1的某些位,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。操作數2為32位的掩碼,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不變。

        指令示例:

        BIC R0,R0,#%1011;該指令清除R0中的位0、1、和3,其余的位保持不變。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巨野县| 崇明县| 兰州市| 卢湾区| 东阳市| 博野县| 大港区| 南乐县| 万山特区| 浠水县| 酒泉市| 昔阳县| 洪洞县| 皮山县| 洛阳市| 四平市| 修武县| 泰和县| 黔江区| 莱州市| 保德县| 麻江县| 深圳市| 穆棱市| 海淀区| 文昌市| 武夷山市| 额敏县| 屏南县| 炉霍县| 和龙市| 昂仁县| 博爱县| 同仁县| 遂溪县| 富民县| 长阳| 青浦区| 绥滨县| 鹤岗市| 休宁县|