乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      arm 指令 學(xué)習(xí)載錄

       最初九月雪 2017-04-14

      ARM尋址方式:

      1、 立即尋址,操作數(shù)在指令中給出。

      ADDR0,R0,#1;    R0?R0+1

      ANDR8,R7,#&FF; R8?R7[7:0];

      ADDR0,R0,#&3F R0?R0+0X3F

             立即數(shù)要求加上#作為前綴,十六進(jìn)制使用0x,或者&表示

      2、 寄存器尋址,直接使用寄存器名字

      ADD R0,R1,R2;      R0?R1+R2

      3、 寄存器移位尋址,ARM特有

      ADD R3,R2,R1,LSL#3; R3?R2+8*R1

      其中LSL #3 為左移三位

      表示移位的還有:

              LSL:邏輯左移

              LSR:邏輯右移

              ASR:算術(shù)右移

              ROR:循環(huán)右移

              RRX:擴(kuò)展為1的循環(huán)右移

      4、 寄存器間接尋址,寄存器中的值作為操作數(shù)地址,操作數(shù)在RAM中

      LDR R0,[R1];         R0?[R1]

      STR R0,[R1];         [R1]?R0

      5、 基址尋址,給定寄存器的值加上一個(gè)偏移作為操作數(shù)地址,操作數(shù)在RAM中

      LDR R0,[R1,#4];           R0?[R1+4]

      LDR R0,[R1,#4]!;          R0?[R1+4],R1?R1+4

      LDR R0,[R1],#4;           R0?[R1],R1?R1+4

      LDR R0,[R1,R2];           R0?[R1+R2]

      6、 多寄存器尋址,一條指令可以完成多個(gè)寄存器值的傳送,最多16個(gè)寄存器

      LDMIAR0,{R1,R2,R3,R4};          R1?[R0],R2?[R0+4],R3?[R0+8],R4?[R0+12]

                格式:LDM+

                                  IB:地址增加在先      

                                   R1?[R0+4],R2?[R0+8],R3?[R0+12],R4?[R0+16]

                                  IA:地址增加在后

                                                R1?[R0],R2?[R0+4],R3?[R0+8],R4?[R0+12]

                                  DB:地址減少在先

                                                R1?[R0-4],R2?[R0-8],R3?[R0-12],R4?[R0-16]

                                  DA:地址減少在后

                                                R1?[R0],R2?[R0-4],R3?[R0-8],R4?[R0-12]

                           I:Increment

                           D:Decrement

                           B:Before

                           A:After

      7、 堆棧尋址

      堆棧尋址有四種情況

      1, 堆棧向高地址方向生長(zhǎng)

      2, 堆棧向低地址方向生長(zhǎng)

      3, 當(dāng)前堆棧指針指向有意義的數(shù)據(jù)[滿](推送數(shù)據(jù)前堆棧需騰出4字節(jié)空間)

      4, 當(dāng)前堆棧指針指向無意義的數(shù)據(jù)(可直接向當(dāng)前位置推送數(shù)據(jù))

      1,2情況與3,4情況兩兩組合,產(chǎn)生四種結(jié)果,四種結(jié)果如下

             滿遞增堆棧(FA):

                    堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。

                    入棧:STMFA,出棧:LDMFA

             滿遞減堆棧(FD):

                    堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。

                    入棧:STMFD,出棧:LDMFD

             空遞增堆棧(EA):

                    堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。

                    入棧:STMEA,出棧:LDMEA

             空遞減堆棧(ED):

                    堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。

                    入棧:STMED,出棧:LDMED

      STMFA r13!, {r0-r5} ; Push onto a FullAscending Stack

      LDMFA r13!, {r0-r5} ; Pop from a FullAscending Stack

      STMFD r13!, {r0-r5} ; Push onto a FullDescending Stack

      LDMFD r13!, {r0-r5} ; Pop from a Full DescendingStack

      STMEA r13!, {r0-r5} ; Push onto an EmptyAscending Stack

      LDMEA r13!, {r0-r5} ; Pop from an EmptyAscending Stack

      STMED r13!, {r0-r5} ; Push onto EmptyDescending Stack

      LDMED r13!, {r0-r5} ; Pop from an EmptyDescending Stack

      SP=0x0FF8

       

      出棧

       

      入棧

       

      SP=0x1000

       

      SP

       

      SP

       

                                         

      8、 相對(duì)尋址

      以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。

       

                                         LDRPC,[PC,#+0xFF0];PC ←[PC+8+0xFF0]        

      ARM微處理器指令分類

      1、  跳轉(zhuǎn)指令

      2、  數(shù)據(jù)處理指令

      3、  程序狀態(tài)寄存器(PSR)傳輸指令

      4、  加載、存儲(chǔ)(Load/Store)指令

      5、  協(xié)處理器指令

      6、  異常中斷產(chǎn)生指令

      ARM微處理器指令格式

      典型的ARM指令格式(機(jī)器碼)如下:

              

      語法格式:

      <opcode>{<cond>}{S}<Rd>,<Rn>,<Shifter_operand>

      <opcode>:指令助記符

      {<cond>}:指令執(zhí)行條件

      {<S>}     :指令的操作是否影響CPSR的值

      <Rd>      :目標(biāo)寄存器

      <Rn>      :包含第一個(gè)操作數(shù)的寄存器

      <shifter_operand>:第二個(gè)操作數(shù)

      指令的條件域

               當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均可根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行滿足條件時(shí)被執(zhí)行。

      每一條ARM指令包含4位條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼可用兩個(gè)字符表示,這兩個(gè)字符可以添加在指令助記符的后面和指令同時(shí)使用。

      B       無條件跳轉(zhuǎn)

      BEQ 相等則跳轉(zhuǎn),即當(dāng)CPSR中的Z標(biāo)志置位時(shí)發(fā)生跳轉(zhuǎn)。

      條件碼

      助記符后綴

      標(biāo) 志

      含 義

      0000

      EQ

      Z置位

      相等

      0001

      NE

      Z清零

      不相等

      0010

      CS/HS

      C置位

      無符號(hào)數(shù)大于或等于

      0011

      CC/LO

      C清零

      無符號(hào)數(shù)小于

      0100

      MI

      N置位

      負(fù)數(shù)

      0101

      PL

      N清零

      正數(shù)或零

      0110

      VS

      V置位

      溢出

      0111

      VC

      V清零

      未溢出

      1000

      HI

      C置位Z清零

      無符號(hào)數(shù)大于

      1001

      LS

      C清零Z置位

      無符號(hào)數(shù)小于或等于

      1010

      GE

      N等于V

      帶符號(hào)數(shù)大于或等于

      1011

      LT

      N不等于V

      帶符號(hào)數(shù)小于

      1100

      GT

      Z清零且(N等于V)

      帶符號(hào)數(shù)大于

      1101

      LE

      Z置位或(N不等于V)

      帶符號(hào)數(shù)小于或等于

      1110

      AL

      忽略

      無條件執(zhí)行

       

               幾乎所有的ARM數(shù)據(jù)處理指令均可以根據(jù)執(zhí)行結(jié)果來選擇是否更新條件碼標(biāo)志。若要更新條件碼標(biāo)志,則指令中須包含后綴S

               一些指令(CMP,CMN,TST,TEQ)不需要后綴S

               一些指令只更新部分標(biāo)志,而不影響其他標(biāo)志

      跳轉(zhuǎn)指令

               在ARM程序中有兩種方法可以實(shí)現(xiàn)程序的跳轉(zhuǎn)

                    1、使用跳轉(zhuǎn)指令

                    2、直接向程序計(jì)數(shù)器PC寫入目標(biāo)地址值

               通過向PC寄存器寫入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4G的地址空間中任意跳轉(zhuǎn)。這種跳轉(zhuǎn)指令稱為長(zhǎng)跳轉(zhuǎn)。

               ARM的跳轉(zhuǎn)指令可以從當(dāng)前指令向前或者向后的32M的地址空間跳轉(zhuǎn),包括以下四條指令:

               B          跳轉(zhuǎn)指令

               BL        帶返回的跳轉(zhuǎn)指令

               BLX      帶返回和狀態(tài)切換的跳轉(zhuǎn)指令

               BX        帶狀態(tài)切換的跳轉(zhuǎn)指令

       

      Cond(31:28)

      1 0 1

      L(24)

      Signed_immed_24(23:0)

      指令的語法格式

               B{L}{<cond>}<targt_address>

               L:是否保存返回地址( L:PCàLR )

               <cond>:指令執(zhí)行的條件碼

               <targt_address>:指令跳轉(zhuǎn)的目標(biāo)地址。計(jì)算方法,24 位有符號(hào)數(shù)補(bǔ)碼立即數(shù)擴(kuò)展為 32 位,再左移2位;將得到的值加到PC寄存器中,即得到跳轉(zhuǎn)的目標(biāo)地址。(-32MB~+32MB)。

      B(跳轉(zhuǎn)指令)及BL(帶返回的跳轉(zhuǎn)指令)

               指令的使用

               子程序返回:

               BX  R14

               MOV  PC,R14

               STMFDR13!,{<registers>,R14}

               LDMFDR13!,{<registers>,PC}

               示例    

               B   Label              ;程序跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行

               BCS Label           ;當(dāng)CPSR寄存器中的C條件碼置位時(shí),程序                        ;跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行

               BL  func_1          ;程序跳轉(zhuǎn)到子程序func_1處執(zhí)行,同時(shí)將當(dāng)前PC值               ;保存到LR中

      BLX(1)

               BLX(1)指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC寄存器的內(nèi)容復(fù)制到LR寄存器中。

               本指令屬于無條件執(zhí)行的指令

       

               指令的語法格式

               BLX  <targt_address>

      BLX(2)

               BLX(2)指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址的指令可以是ARM指令,也可以是Thumb指令。目標(biāo)地址放在指令中的寄存器<Rm>中,當(dāng)<Rm>寄存器的bit[0]值為0時(shí),目標(biāo)地址處的指令類型為ARM指令;當(dāng)<Rm>寄存器的bit[0]值為1時(shí),目標(biāo)地址處的指令類型為Thumb指令。該指令同時(shí)將PC寄存器的內(nèi)容復(fù)制到LR寄存器中。

               指令的語法格式

               BLX{<cond>}  <Rm>

      BLX(2)

               BLX  目標(biāo)地址

               BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)從ARM狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC的當(dāng)前內(nèi)容保存到寄存器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時(shí),可以通過BLX指令實(shí)現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時(shí),子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。

      BX指令

               BX{條件}  目標(biāo)地址

               BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。

      數(shù)據(jù)處理指令:

               數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較指令等。

               數(shù)據(jù)傳送指令用于在寄存器之間進(jìn)行數(shù)據(jù)的傳輸。

               算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)邏輯運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位。

               比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。

      ARM指令集中數(shù)據(jù)處理指令集包括:

      傳送指令:

               MOV           數(shù)據(jù)傳送指令

               MVN           數(shù)據(jù)取反傳送指令

      比較指令:

               CMP            比較指令

               CMN           反值比較指令

               TST             位測(cè)試指令

               TEQ            相等測(cè)試指令

      算術(shù)指令:

               ADD            加法指令

               ADC            帶進(jìn)位加法指令

               SUB             減法指令

               SBC            帶借位減法指令

               RSB            逆向減法指令

               RSC            帶借位的逆向減法指令

      邏輯指令:

               AND            邏輯與指令

               ORR           邏輯或指令

               EOR            邏輯異或指令

               BIC             位清除指令

      MOV指令

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

               MOV指令可完成從另一個(gè)寄存器、被移位的寄存器或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。其中S選項(xiàng)決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。

       

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

                    MOV      PC,R14

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

                    MOV      R1,R0,LSL #3

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

      MVN指令

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

               MVN指令可完成從另一個(gè)寄存器、被移位的寄存器、或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。

                    MVN      R0,#0

                    ;將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1

      CMP指令

               CMP{條件} 操作數(shù)1,操作數(shù)2

               CMP指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等)。

               CMP     R1,R0

               ;將寄存器R1的值與寄存器R0的值相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

               CMP     R1,#100

               ;將寄存器R1的值與立即數(shù)100相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

      CMN指令

               CMN{條件} 操作數(shù)1,操作數(shù)2

               CMN指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)取反后進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令實(shí)際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標(biāo)志位。

               CMN    R1,R0

               ;將寄存器R1的值與寄存器R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

               CMN    R1,#100

               ;將寄存器R1的值與立即數(shù)100相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

      TST指令

               TST{條件} 操作數(shù)1,操作數(shù)2

               TST指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的與運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測(cè)試的數(shù)據(jù),而操作數(shù)2是一個(gè)位掩碼,該指令一般用來檢測(cè)是否設(shè)置了特定的位。

               TST      R1, #2_1

               ;用于測(cè)試在寄存器R1中是否設(shè)置了最低位

             TST       R1, #0xff0

               ;將寄存器R1的值與立即數(shù)0xff0按位與,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

      TEQ指令

               TEQ{條件} 操作數(shù)1,操作數(shù)2

               TEQ指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的異或運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。

               TEQ     R1,R2

               ;將寄存器R1的值與寄存器R2的值按位異或,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位。

      ADD指令

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

               ADD指令用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。

                    ADD      R0,R1,R2         ; R0 = R1 + R2

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

                    ADD      R0,R2,R3,LSL#1 

                                         ; R0 = R2 + (R3 << 1)

                                         ; R0 = R2 + 2×R3

      ADC指令

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

               ADC指令用于把兩個(gè)操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,這樣就可以做比32位大的數(shù)的加法。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。

               兩個(gè)128位數(shù)的加法:

                    ADDS    R0,R4,R8          ; 加低端的字,帶進(jìn)位     ADCS   R1,R5,R9          ; 加第二個(gè)字,帶進(jìn)位

                    ADCS    R2,R6,R10       ; 加第三個(gè)字,帶進(jìn)位

                    ADC      R3,R7,R11 ; 加第四個(gè)字

      SUB指令

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

               SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。

                    SUB       R0,R1,R2        ; R0 = R1 - R2

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

                    SUB       R0,R2,R3,LSL #1 

                    ; R0 = R2 - (R3 << 1)

      SBC指令

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

               SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。

               SBCS   R0,R1,R2

              ;R0 = R1 - R2 - !C,并根據(jù)結(jié)果設(shè)置CPSR的進(jìn)位標(biāo)志位

      RSB指令

               RSB指令的格式為:

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

               RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。

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

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

                    RSB       R0,R2,R3,LSL#1

                ; R0 = (R3 << 1) - R2

      RSC指令

               RSC指令的格式為:

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

               RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。

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

      AND指令

               AND指令的格式為:

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

               AND指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。

               AND    R0,R0,#3  

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

      ORR指令

               ORR指令的格式為:

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

               ORR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。

               ORR    R0,R0,#3

               ; 該指令設(shè)置R0的0、1位,其余位保持不變。

      EOR指令

               EOR指令的格式為:

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

               EOR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。

                    EOR       R0,R0,#3

                   ;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。

      乘法指令與乘加指令

               ARM微處理器支持的乘法指令與乘加指令共有6條,可分為運(yùn)算結(jié)果為32位和運(yùn)算結(jié)果為64位兩類,與前面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器必須為通用寄存器,不能對(duì)操作數(shù)使用立即數(shù)或被移位的寄存器,同時(shí),目的寄存器和操作數(shù)1必須是不同的寄存器。

               乘法指令與乘加指令共有以下6條:

                    MUL              32位乘法指令

                    MLA              32位乘加指令

                    SMULL   64位有符號(hào)數(shù)乘法指令

                    SMLAL   64位有符號(hào)數(shù)乘加指令

                    UMULL   64位無符號(hào)數(shù)乘法指令

                    UMLAL   64位無符號(hào)數(shù)乘加指令

      MUL指令

               MUL指令的格式為:

               MUL{條件}{S}   目的寄存器,操作數(shù)1,操作數(shù)2

               MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果(低32位)放置到目的寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)或無符號(hào)數(shù)。

               MUL     R0,R1,R2

               ;R0 = R1 × R2低32位

               ;R1=0x00FFFFFF,R2=0x00123456,R0=0x55EDCBAA

               ;0x00FFFFFF*0x00123456=0x123455EDCBAA

      SMULL指令

               SMULL指令的格式為:

               SMULL{條件}{S}      目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2

               SMULL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。

               SMULL R0,R1,R2,R3 

               ;  R0 = (R2 × R3)的低32位;R1 = (R2 × R3)的高32位

               ;R2=0x00FFFFFF,R3=0x00123456

               ; R0=0x55EDCBAA,R1=0x00001234

               ;0x00FFFFFF*0x00123456=123455EDCBAA

      SMLAL指令

               SMLAL指令的格式為:

               SMLAL{條件}{S}      目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2

               SMLAL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。

               對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。

               對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。

              SMLAL R0,R1,R2,R3 

               ;R0 = (R2 × R3)的低32位 + R0       ;R1 = (R2 × R3)的高32位 + R1

      UMULL指令

               UMULL指令的格式為:

               UMULL{條件}{S}      目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2

               UMULL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號(hào)數(shù)。

                    UMULL     R0,R1,R2,R3    

                    ;R0 = (R2 × R3)的低32位

                    ;R1 = (R2 × R3)的高32位

      UMLAL指令

               UMLAL指令的格式為:

               UMLAL{條件}{S}      目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2

               UMLAL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號(hào)數(shù)。

               對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。

               對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。

               UMLAL R0,R1,R2,R3 

               ;R0 = (R2 × R3)的低32位 + R0

               ;R1 = (R2 × R3)的高32位 + R1

      程序狀態(tài)寄存器訪問指令

               ARM微處理器支持程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:

               MRS     程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令

               MSR     通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令

      MRS指令

               MRS指令的格式為:

               MRS{條件} 通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR)

               MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下幾種情況:

               當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時(shí),可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。

               當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。

                    MRS       R0,CPSR     ;傳送CPSR的內(nèi)容到R0

                    MRS       R0,SPSR     ;傳送SPSR的內(nèi)容到R0

      MSR指令

               MSR指令的格式為:

               MSR{條件} 程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù)

               MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。<域>用于設(shè)置程序狀態(tài)寄存器中需要操作的位,32位的程序狀態(tài)寄存器可分為4個(gè)域:

               位[31:24]為條件標(biāo)志位域,用f表示;

               位[23:16]為狀態(tài)位域,用s表示;

               位[15:8]為擴(kuò)展位域,用x表示;

               位[7:0]為控制位域,用c表示;

               該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,在使用時(shí),一般要在MSR指令中指明將要操作的域。

                    MSR       CPSR_cxsf,R0           ;傳送R0的內(nèi)容到CPSR

                    MSR       SPSR_cxsf,R0           ;傳送R0的內(nèi)容到SPSR

                    MSR       CPSR_c,R0        

                    ;傳送R0的內(nèi)容到SPSR,但僅僅修改CPSR中的控制位域

      加載/存儲(chǔ)指令

               ARM微處理器支持加載/存儲(chǔ)指令用于在寄存器和存儲(chǔ)器之間傳送數(shù)據(jù),加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則完成相反的操作。常用的加載存儲(chǔ)指令如下:

               LDR            字?jǐn)?shù)據(jù)加載指令

               LDRB          字節(jié)數(shù)據(jù)加載指令

               LDRH          半字?jǐn)?shù)據(jù)加載指令

               STR             字?jǐn)?shù)據(jù)存儲(chǔ)指令

               STRB           字節(jié)數(shù)據(jù)存儲(chǔ)指令

               STRH          半字?jǐn)?shù)據(jù)存儲(chǔ)指令

      LDR指令

               LDR指令的格式為:

               LDR{條件} 目的寄存器,<存儲(chǔ)器地址>

               LDR指令用于從存儲(chǔ)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲(chǔ)器中讀取32位的字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。當(dāng)程序計(jì)數(shù)器PC作為目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣。

      LDR    R0,[R1]       ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0

        LDR   R0,[R1,R2]       ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0

        LDR   R0,[R1,#8]     ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0

        LDR   R0,[R1,R2]!

        ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1

        LDR   R0,[R1,#8]!

        ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+8寫入R1

        LDR   R0,[R1],R2      

        ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1

        LDR   R0,[R1,R2,LSL#2]!

        ;將存儲(chǔ)器地址為R1+R2×4的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1

        LDR   R0,[R1],R2,LSL#2

        ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1

      LDRB指令

               LDRB指令的格式為:

               LDR{條件}B 目的寄存器,<存儲(chǔ)器地址>

               LDRB指令用于從存儲(chǔ)器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高24位清零。該指令通常用于從存儲(chǔ)器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。

               LDRB   R0,[R1]

               ;將存儲(chǔ)器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零

               LDRB   R0,[R1,#8]

             ;將存儲(chǔ)器地址為R1+8的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零

      LDRH指令

               LDRH指令的格式為:

               LDR{條件}H 目的寄存器,<存儲(chǔ)器地址>

               LDRH指令用于從存儲(chǔ)器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高16位清零。該指令通常用于從存儲(chǔ)器中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。

             LDRH    R0,[R1]

             ;將存儲(chǔ)器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零

                    LDRH    R0,[R1,#8]

            ;將存儲(chǔ)器地址為R1+8的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零

                    LDRH    R0,[R1,R2]

            ;將存儲(chǔ)器地址為R1+R2的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零

      STR指令

               STR指令的格式為:

               STR{條件} 源寄存器,<存儲(chǔ)器地址>

               STR指令用于從源寄存器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。

               STR      R0,[R1],#8    

               ;將R0中的字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中,并將新地址R1+8寫入R1

               STR      R0,[R1,#8]    

               ;將R0中的字?jǐn)?shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中

      STRB指令

               STRB指令的格式為:

               STR{條件}B 源寄存器,<存儲(chǔ)器地址>

               STRB指令用于從源寄存器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。

                    STRB     R0,[R1]

                   ;將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1為地址的存儲(chǔ)器中

                    STRB     R0,[R1,#8]

            ;將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中

      STRH指令

               STRH指令的格式為:

               STR{條件}H 源寄存器,<存儲(chǔ)器地址>

               STRH指令用于從源寄存器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。

                    STRH     R0,[R1]

                   ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中

                    STRH     R0,[R1,#8]

            ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中

      批量數(shù)據(jù)加載/存儲(chǔ)指令

               ARM微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。

               常用的加載存儲(chǔ)指令如下:

               LDM            批量數(shù)據(jù)加載指令

               STM            批量數(shù)據(jù)存儲(chǔ)指令

      LDM(或STM)指令

               LDM(或STM)指令的格式為:

               LDM(或STM){條件}{類型} 基址寄存器{!},寄存器列表{∧}

               LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送數(shù)據(jù),該指令的常見用途是將多個(gè)寄存器的內(nèi)容入?;虺鰲?。其中,{類型}為以下幾種情況:

               IA 每次傳送后地址加1;

               IB 每次傳送前地址加1;

               DA每次傳送后地址減1;

               DB       每次傳送前地址減1;

               FD 滿遞減堆棧;

               ED 空遞減堆棧;

               FA 滿遞增堆棧;

               EA 空遞增堆棧;

               {!}為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。

               基址寄存器不允許為R15,寄存器列表可以為R0~R15的任意組合。

               {∧}為可選后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含R15,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。

      從子程序返回:

      無嵌套

                MOV   PC,LR

      有嵌套

               STMFD  R13!,{R0,R4-R12,LR}

               ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧

               ……

               LDMFD  R13!,{R0,R4-R12,PC}

               ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)

      從異常返回(例如IRQ中斷):

      無嵌套

               SUBS    PC,LR,#4

      其他

               SUBS   LR,LR,#4

               STMFD      R13!,{R0,R4-R12,LR}

               ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧

               LDMFD      R13!,{R0,R4-R12,PC}^

               ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)

      數(shù)據(jù)交換指令(信號(hào)量操作指令)

               ARM微處理器所支持?jǐn)?shù)據(jù)交換指令能在存儲(chǔ)器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令有如下兩條:

               SWP            字?jǐn)?shù)據(jù)交換指令

               SWPB          字節(jié)數(shù)據(jù)交換指令

      SWP指令

               SWP指令的格式為:

               SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]

               SWP指令用于將源寄存器2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。

               SWP  R0,R1,[R2]

              ;將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R0,同時(shí)將R1中的字?jǐn)?shù)據(jù)傳送到R2所指向的存儲(chǔ)單元

               SWP  R0,R0,[R1]

              ;該指令完成將R1所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)與R0中的字?jǐn)?shù)據(jù)交換

      SWPB指令

               SWPB指令的格式為:

               SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]

               SWPB指令用于將源寄存器2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時(shí)將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。

               SWPB R0,R1,[R2]

               ;將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到R0,R0的高24位清零,同時(shí)將R1中的低8位數(shù)據(jù)傳送到R2所指向的存儲(chǔ)單元

               SWPB R0,R0,[R1]

               ;該指令完成將R1所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)與R0中的低8位數(shù)據(jù)交換, R0的高24位清零

      移位操作

               ARM微處理器內(nèi)嵌的桶型移位器(Barrel Shifter),支持?jǐn)?shù)據(jù)的各種移位操作,移位操作在ARM指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中是一個(gè)字段,在匯編語言中表示為指令中的選項(xiàng)。例如,數(shù)據(jù)處理指令的第二個(gè)操作數(shù)為寄存器時(shí),就可以加入移位操作選項(xiàng)對(duì)它進(jìn)行各種移位操作。移位操作包括如下6種類型:

               LSL  邏輯左移

               ASL  算術(shù)左移

               LSR  邏輯右移

               ASR  算術(shù)右移

               ROR  循環(huán)右移

               RRX  帶擴(kuò)展的循環(huán)右移

      LSL(或ASL)操作

               LSL(或ASL)操作的格式為:

               通用寄存器,LSL(或ASL) 操作數(shù)    

               LSL(或ASL)可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~31)。

               MOV    R0, R1, LSL #2

               ;將R1中的內(nèi)容左移兩位后傳送到R0中。

      LSR操作

               LSR操作的格式為:

               通用寄存器,LSR 操作數(shù)    

               LSR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~32)。

       

              MOV    R0, R1, LSR #2

               ;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用零來填充。

      ASR操作

               ASR操作的格式為:

               通用寄存器,ASR 操作數(shù)    

               ASR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位的值來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~32)。

              MOV    R0, R1, ASR #2

               ;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用第31位的值來填充。

      ROR操作

               ROR操作的格式為:

               通用寄存器,ROR 操作數(shù)    

               ROR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~31)。

              MOV    R0, R1, ROR #2

               ;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0中。

      RRX操作

               RRX操作的格式為:

               通用寄存器,RRX

               RRX可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進(jìn)位標(biāo)志位C來填充。

              MOV    R0, R1, RRX

               ;將R1中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移一位后傳送到R0中。

      協(xié)處理器指令

               ARM微處理器可支持多達(dá)16個(gè)協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過程中,每個(gè)協(xié)處理器只執(zhí)行針對(duì)自身的協(xié)處理指令,忽略ARM處理器和其他協(xié)處理器的指令。

               ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在ARM協(xié)處理器的寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括以下5條:

               CDP     協(xié)處理器數(shù)據(jù)操作指令

               LDC     協(xié)處理器數(shù)據(jù)加載指令

               STC      協(xié)處理器數(shù)據(jù)存儲(chǔ)指令

               MCR     ARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令

               MRC     協(xié)處理器寄存器到ARM處理器寄存器的數(shù)據(jù)傳送指令

      CDP指令

               CDP指令的格式為:

               CDP{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器協(xié)處理器操作碼2

               CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲(chǔ)器。

       

               CDP P5,2,C12,C10,C3,4

              ;該指令完成協(xié)處理器P5的初始化

      LDC指令

               LDC指令的格式為:

               LDC{條件}{L} 協(xié)處理器編碼,目的寄存器,[源寄存器]

               LDC指令用于將源寄存器所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

               LDC P6,CR1,[R4]

              ;將ARM處理器的寄存器R4所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器P6的寄存器CR1中。

      STC指令

               STC指令的格式為:

               STC{條件}{L} 協(xié)處理器編碼,源寄存器,[目的寄存器]

               STC指令用于將源寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向的存儲(chǔ)器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

               STC P8,CR8,[R2,#4]!

              ;將協(xié)處理器P8的寄存器CR8中的字?jǐn)?shù)據(jù)傳送到ARM處理器的寄存器R2+4所指向的存儲(chǔ)器中,R2=R2+4。

      MCR指令

               MCR指令的格式為:

               MCR{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2{,協(xié)處理器操作碼2}

               MCR指令用于將ARM處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協(xié)處理器的寄存器。

               MCR P15,0,R0,C1,C0

               ;CP15 register 1:=R0

      MRC指令

               MRC指令的格式為:

               MRC{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2

               MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協(xié)處理器的寄存器。

               MRC P15,0,R0,C1,C0

      ;R0:=CP15 register 1

      異常產(chǎn)生指令

        ARM微處理器所支持的異常指令有如下兩條:

        SWI             軟件中斷指令

        BKPT           斷點(diǎn)中斷指令

      SWI指令

        SWI指令的格式為:

        SWI{條件} 24位的立即數(shù)

        SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應(yīng)的系統(tǒng)服務(wù),指令中24位的立即數(shù)指定用戶程序調(diào)用系統(tǒng)例程的類型,相關(guān)參數(shù)通過通用寄存器傳遞,當(dāng)指令中24位的立即數(shù)被忽略時(shí),用戶程序調(diào)用系統(tǒng)例程的類型由通用寄存器R0的內(nèi)容決定,同時(shí),參數(shù)通過其他通用寄存器傳遞。

             SWI      0x02

                 ;該指令調(diào)用操作系統(tǒng)編號(hào)為02的系統(tǒng)例程。

      BKPT指令

               BKPT指令的格式為:

               BKPT      16位的立即數(shù)

               BKPT指令產(chǎn)生軟件斷點(diǎn),引起Prefetch Abort 異常??捎糜诔绦虻恼{(diào)試。

      u     ARM體系結(jié)構(gòu)除了支持執(zhí)行效率很高的32位ARM指令集以外,同時(shí)支持16位的Thumb指令集。Thumb指令集是ARM指令集的一個(gè)子集,允許指令編碼為16位的長(zhǎng)度。與等價(jià)的32位代碼相比較,Thumb指令集在保留32代碼優(yōu)勢(shì)的同時(shí),大大節(jié)省了系統(tǒng)的存儲(chǔ)空間。

      u     所有的Thumb指令都有對(duì)應(yīng)的ARM指令,而且Thumb的編程模型也對(duì)應(yīng)于ARM的編程模型,在應(yīng)用程序的編寫過程中,只要遵循一定調(diào)用的規(guī)則,Thumb子程序和ARM子程序就可以互相調(diào)用。當(dāng)處理器在執(zhí)行ARM程序段時(shí),稱ARM處理器處于ARM工作狀態(tài),當(dāng)處理器在執(zhí)行Thumb程序段時(shí),稱ARM處理器處于Thumb工作狀態(tài)。

      u     與ARM指令集相比較,Thumb指令集中的數(shù)據(jù)處理指令的操作數(shù)仍然是32位,指令地址也為32位,但Thumb指令集為實(shí)現(xiàn)16位的指令長(zhǎng)度,舍棄了ARM指令集的一些特性,如大多數(shù)的Thumb指令是無條件執(zhí)行的,而幾乎所有的ARM指令都是有條件執(zhí)行的;大多數(shù)的Thumb數(shù)據(jù)處理指令的目的寄存器與其中一個(gè)源寄存器相同。

      u     由于Thumb指令的長(zhǎng)度為16位,即只用ARM指令一半的位數(shù)來實(shí)現(xiàn)同樣的功能,所以,要實(shí)現(xiàn)特定的程序功能,所需的Thumb指令的條數(shù)較ARM指令多。在一般的情況下,Thumb指令與ARM指令的時(shí)間效率和空間效率關(guān)系為:

      u     Thumb代碼所需的存儲(chǔ)空間約為ARM代碼的60%~70%

      u     Thumb代碼使用的指令數(shù)比ARM代碼多約30%~40%

      u     若使用32位數(shù)據(jù)寬度的存儲(chǔ)器,ARM代碼比Thumb代碼快約40%

      u     若使用16位數(shù)據(jù)寬度的存儲(chǔ)器,Thumb代碼比ARM代碼快約40%~50%

      u     與ARM代碼相比較,使用Thumb代碼,存儲(chǔ)器的功耗會(huì)降低約30%

      u     顯然,ARM指令集和Thumb指令集各有其優(yōu)點(diǎn),若對(duì)系統(tǒng)的性能有較高要求,應(yīng)使用32位的存儲(chǔ)系統(tǒng)和ARM指令集,若對(duì)系統(tǒng)的成本及功耗有較高要求,則應(yīng)使用16位的存儲(chǔ)系統(tǒng)和Thumb指令集。當(dāng)然,若兩者結(jié)合使用,充分發(fā)揮其各自的優(yōu)點(diǎn),會(huì)取得更好的效果。 

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多