ARM 彙編指令集

來源:互聯網
上載者:User

0. ARM寄存器


    R13: SP

    R14: LR 1. 跳轉指令

    跳轉指令用於實現程式流程的跳轉,在ARM 程式中有兩種方法可以實現程式流程的跳轉:
    1) 使用專門的跳轉指令。
    2) 直接向程式計數器PC 寫入跳轉地址值。

   通過向程式計數器PC 寫入跳轉地址值,可以實現在4GB 的地址空間中的任意跳轉,在跳轉之前結合使用

    MOV  LR,PC 

    等類似指令,可以儲存將來的返回地址值,從而實現在4GB 連續的線性地址空間的子程式調用。ARM 指令集中的跳轉指令可以完成從當前指令向前或向後的32MB 的地址空間的跳轉,包括以下4 條指令:


1.1 跳轉指令B

     B{條件} 目標地址

     B 指令是最簡單的跳轉指令。一旦遇到一個B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那裡繼續執行。注意儲存在跳轉指令中的實際值是相對當前PC 值的一個位移量,而不是一個絕對位址,它的

值由彙編器來計算(參考定址方式中的相對定址)。它是24 位有符號數,左移兩位後有符號擴充為32 位,表示的有效位移為26 位(前後32MB 的地址空間)。以下指令:
    # 程式無條件跳轉到標號Label 處執行

    B  Label ;

   

    #當CPSR 寄存器中的Z 條件碼置位時,程式跳轉到標號Label 處執行
    CMP R1,#0 

    BEQ Label 1.2  帶串連的跳轉指令BL

       BL{條件} 目標地址
[cpp] view plain copy <span style="font-family:Arial;">START   …                 BL   NEXT           @跳轉到標號NEXT處,同時儲存當前PC到R14中                 …                                    …   NEXT…                            @子程式入口                 MOV   PC,R14        @返回 </span>  

           BL 是另一個跳轉指令,但跳轉之前,會在寄存器R14 中儲存PC 的當前內容,因此,可以通過將R14 的內容重新載入到PC 中,來返回到跳轉指令之後的那個指令處執行。該指令是實現子程式調用的一個基本但常用的手段。 1.3 BLX 指令

      BLX 目標地址

      BLX 指令從ARM 指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態從ARM 狀態切換到Thumb 狀態,該指令同時將PC 的當前內容儲存到寄存器R14 中。因此,當子程式使用Thumb 指令集,而調用者使用ARM 指令集時,可以通過BLX 指令實現子程式的調用和處理器工作狀態的切換。同時,子程式的返回可以通過將寄存器R14
值複製到PC 中來完成。 1.4 BX 指令

      BX{條件} 目標地址

      BX 指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM 指令,也可以是Thumb 指令。 [cpp] view plain copy MOV   R0,  #0X0200   BX    R0   


2. 算術運算指令
2.1 不帶進位加法指令ADD      ADD{條件}{S} 目的寄存器,運算元1<寄存器>,運算元2
     ADD 指令用於把兩個運算元相加,並將結果存放到目的寄存器中。運算元1 應是一個寄存器,運算元2可以是一個寄存器,被移位的寄存器,或一個立即數。
     樣本如下: [cpp] view plain copy ADD R0,R1,R2        @ R0 = R1 + R2   ADD R0,R1,#256      @ R0 = R1 + 256   ADD R0,R2,R3,LSL#1 @ R0 = R2 + (R3 << 1)  
2.2 帶進位加法指令ADC       ADC{條件}{S} 目的寄存器,運算元1<寄存器>,運算元2
     ADC 指令用於把兩個運算元相加,再加上CPSR 中的C 條件標誌位的值,並將結果存放到目的寄存器中。它使用一個進位標誌位,這樣就可以做比32 位大的數的加法,注意不要忘記設定S 尾碼來更改進位標誌。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。

    以下指令序列完成兩個128 位元的加法,第一個數由高到低存放在寄存器R7~R4,第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄存器R3~R0: [cpp] view plain copy ADDS R0,R4,R8    @加低端的字   ADCS R1,R5,R9    @加第二個字,帶進位   ADCS R2,R6,R10   @加第三個字,帶進位   ADC  R3,R7,R11   @加第四個字,帶進位  
2.3 不帶進位減法SUB        SUB{條件}{S} 目的寄存器,運算元1,運算元2
      SUB 指令用於把運算元1 減去運算元2,並將結果存放到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令可用於有符號數或無符號數的減法運算。
      樣本如下: [cpp] view plain copy SUB R0,R1,R2         @R0 = R1 - R2   SUB R0,R1,#256       @R0 = R1 - 256   SUB R0,R2,R3,LSL#1  @R0 = R2 - (R3 << 1)  
2.4 帶進位減法指令SBC          SBC{條件}{S} 目的寄存器,運算元1,運算元2
        SBC 指令用於把運算元1 減去運算元2,再減去CPSR 中的C 條件標誌位的反碼,並將結果存放到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標誌來表示借位,這樣就可以做大於32 位的減法,注意不要忘記設定S 尾碼來更改進位標誌。該指令可用於有符號數或無符號數的減法運算。
樣本如下: [cpp] view plain copy SUBS  R0, R3, R6            @減最低位位元組,不帶進位   SBCS  R1, R4, R7            @減第二個字,帶進位   SBCS  R2, R5, R8            @減第三個字,帶進位      #三句話實現了96bit減法運算,由於ARM寄存器寬度只有32bit所以分三次相減  
2.5 不帶進位逆向減法指令RSB         RSB{條件}{S} 目的寄存器,運算元1,運算元2
        RSB指令稱為逆向減法指令,用於把運算元2 減去運算元1,並將結果存放到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令可用於有符號數或無符號數的減法運算。
樣本如下: [cpp] view plain copy RSB   R0, R1, R2                     @R0 = R2- R1   RSB   R0, R1,  #112                  @R0 = 112- R1   RSB   R0, R1, R2,  LSL#1             @R0 = (R2<<1)-R1  
2.6 帶進位逆向減法指令RSC          RSC{條件}{S} 目的寄存器,運算元1,運算元2
        RSC 指令用於把運算元2 減去運算元1,再減去CPSR 中的C 條件標誌位的反碼,並將結果存放到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標誌來表示借位,這樣就可以做大於32 位的減法,注意不要忘記設定S 尾碼來更改進位標誌。該指令可用於有符號數或無符號數的減法運算。

        樣本如下: [cpp] view plain copy RSBS   R0, R6, R3                    @減最低位元組的字,不帶進位   RSCS   R1, R7, R4                    @減第二個字,帶進位   RSCS   R2, R8, R5                    @減第三個字,帶進位   #三句話實現了96bit減法運算,由於ARM寄存器寬度只有32bit所以分三次相減   2.7乘法指令      乘法指令中的所有運算元、目的寄存器必須為通用寄存器,不能對運算元使用立即數或被移位的寄存器,同時,目的寄存器和運算元1 必須是不同的寄存器。 2.7.1  32位乘法指令MUL           MUL{條件}{S} 目的寄存器,運算元1<寄存器>,運算元2<寄存器>
          MUL 指令完成將運算元1 與運算元2 的乘法運算,並把結果放置到目的寄存器中,同時可以根據運算結果設定CPSR 中相應的條件標誌位。其中,運算元1 和運算元2 均為32 位的有符號數或無符號數。
         樣本如下: [cpp] view plain copy MUL R0,R1,R2     @R0 = R1 × R2   MULS R0,R1,R2    @R0 = R1 × R2,同時設定CPSR中的相關條件標誌位  
2.7.2 乘-累加指令 MLA         MLA{條件}{S} 目的寄存器,運算元1,運算元2,運算元3
        MLA 指令完成將運算元1 與運算元2 的乘法運算,再將乘積加上運算元3,並把結果放置到目的寄存器中,同時可以根據運算結果設定CPSR中相應的條件標誌位。其中,運算元1 和運算元2 均為32 位的有符號數或無符號數。
        樣本如下: [cpp] view plain copy MLA R0,R1,R2,R3      @R0 = R1 × R2 + R3   MLAS R0,R1,R2,R3     @R0 = R1 × R2 + R3,同時設定CPSR 中的相關條件標誌位  
2.7.3 有符號長乘指令SMULL         SMULL{條件}{S} 目的寄存器Low,目的寄存器低High,運算元1,運算元2
        SMULL 指令完成將運算元1 與運算元2 的乘法運算,並把結果的低32 位放置到目的寄存器Low 中,結果的高32 位放置到目的寄存器High 中,同時可以根據運算結果設定CPSR 中相應的條件標誌位。其中,運算元1 和運算元2 均為32 位的有符號數。
        樣本如下: [cpp] view plain copy SMULL R0,R1,R2,R3  @R0 = (R2 × R3)的低32 位;R1 = (R2 × R3)的高32 位                         @SMULL指令實現64bit有符號數乘法  
2.7.4 無符號數長乘指令 UMULL          UMULL{條件}{S} 目的寄存器Low,目的寄存器低High,運算元1,運算元2
         UMULL 指令完成將運算元1 與運算元2 的乘法運算,並把結果的低32 位放置到目的寄存器Low 中,結果的高32 位放置到目的寄存器High 中,同時可以根據運算結果設定CPSR 中相應的條件標誌位。其中,運算元1 和運算元2 均為32 位的無符號數。
樣本如下: [cpp] view plain copy UMULL R0,R1,R2,R3  @R0 = (R2 × R3)的低32 位;R1 = (R2 × R3)的高32 位                         @UMULL指令實現64bit無符號數乘法  
2.7.5 有符號長乘-累加指令 SMLAL         SMLAL{條件}{S} 目的寄存器Low,目的寄存器低High,運算元1,運算元2
        SMLAL 指令完成將運算元1 與運算元2 的乘法運算,並把結果的低32位同目的寄存器Low 中的值相加後又放置到目的寄存器Low 中,結果的高32 位同目的寄存器High 中的值相加後又放置到目的寄存器High中,同時可以根據運算結果設定CPSR 中相應的條件標誌位。其中,操
作數1 和運算元2 均為32 位的有符號數。
         對於目的寄存器Low,在指令執行前存放64 位元加數的低32 位,指令執行後存放結果的低32位。對於目的寄存器High,在指令執行前存放64 位元加數的高32 位,指令執行後存放結果的高32 位。
樣本如下: [cpp] view plain copy SMLAL R0,R1,R2,R3    @R0 = (R2 × R3)的低32 位+ R0;R1 = (R2 × R3)的高32 位+ R1                           @SMLAL 指令為64位有符號乘-累加指令  
2.7.6 無符號長乘-累加指令 UMLAL          UMLAL{條件}{S} 目的寄存器Low,目的寄存器低High,運算元1,運算元2
         UMLAL 指令完成將運算元1 與運算元2 的乘法運算,並把結果的低32 位同目的寄存器Low 中的值相加後又放置到目的寄存器Low 中,結果的高32 位同目的寄存器High 中的值相加後又放置到目的寄存器High 中,同時可以根據運算結果設定CPSR 中相應的條件標誌位。其中,運算元1 和運算元2 均為32 位的無符號數。
        對於目的寄存器Low,在指令執行前存放64 位元加數的低32 位,指令執行後存放結果的低32 位。對於目的寄存器High,在指令執行前存放64 位元加數的高32 位,指令執行後存放結果的高32 位。
       樣本如下: [cpp] view plain copy UMLAL R0,R1,R2,R3   @R0 = (R2 × R3)的低32 位+ R0;R1 = (R2 × R3)的高32 位+ R1                          @UMLAL 指令為64位無符號乘-累加指令  
2.8 比較指令CMP       CMP{條件} 運算元1,運算元2
      CMP 指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR 中條件標誌位的值。該指令進行一次減法運算,但不儲存結果,只更改條件標誌位。標誌位表示的是運算元1 與運算元2 的關係(大、小、相等),例如,當運算元1 大於操作運算元2,則此後的有GT 尾碼的指令將可以執行。
      樣本如下: [cpp] view plain copy CMP R1,R0    @將寄存器R1 的值與寄存器R0 的值相減,並根據結果設定CPSR 的標誌位   CMP R1,#100  @將寄存器R1 的值與立即數100相減,並根據結果設定CPSR 的標誌位  
2.9 負數比較指令CMN      CMN{條件} 運算元1,運算元2
     CMN 指令用於把一個寄存器的內容和另一個寄存器的內容或立即數取反後進行比較,同時更新CPSR 中條件標誌位的值。該指令實際完成運算元1 和運算元2 相加,並根據結果更改條件標誌位。
樣本如下:
[cpp] view plain copy CMN R1,R0    @將寄存器R1 的值與寄存器R0 的值相加,並根據結果設定CPSR 的標誌位   CMN R1,#100  @將寄存器R1 的值與立即數100相加,並根據結果設定CPSR 的標誌位  

3. 邏輯運算指令 3.1 “與”指令AND          AND{條件}{S} 目的寄存器,運算元1,運算元2
         AND 指令用於在兩個運算元上進行邏輯與運算,並把結果放置到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用於屏蔽運算元1 的某些位。
樣本如下: [cpp] view plain copy AND R0,R0,#3        @該指令保持R0的0、1 位,其餘位清零。  
3.2 “或”指令ORR         ORR{條件}{S} 目的寄存器,運算元1,運算元2
        ORR 指令用於在兩個運算元上進行邏輯或運算,並把結果放置到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用於設定作業數1 的某些位。
        樣本如下: [cpp] view plain copy ORR R0,R0,#3       @該指令設定R0 的0、1 位,其餘位保持不變。  


3.3 “異或”指令EOR         EOR{條件}{S} 目的寄存器,運算元1,運算元2
        EOR 指令用於在兩個運算元上進行邏輯異或運算,並把結果放置到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用於反轉運算元1 的某些位。
        樣本如下:
[cpp] view plain copy EOR R0,R0,#3     @該指令反轉R0 的0、1 位,其餘位保持不變。  
3.4 位清除指令BIC        BIC{條件}{S} 目的寄存器,運算元1,運算元2
       BIC 指令用於清除運算元1 的某些位,並把結果放置到目的寄存器中。運算元1 應是一個寄存器,運算元2 可以是一個寄存器,被移位的寄存器,或一個立即數。運算元2 為32 位的掩碼,如果在掩碼中設定了某一位,則清除這一位。未設定的掩碼位保持不變。
樣本如下: [cpp] view plain copy BIC R0,R0,#%1011  @該指令清除R0 中的位0、1、和3,其餘的位保持不變。  
3.5 測試比較指令TST       TST{條件} 運算元1,運算元2
      TST 指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位與運算,並根據運算結果更新CPSR 中條件標誌位的值。運算元1 是要測試的資料,而運算元2 是一個位元遮罩,該指令一般用來檢測是否設定了特定的位。
樣本如下: [cpp] view plain copy TST R1,#%1     @用於測試在寄存器R1 中是否設定了最低位(%表示位元)   TST R1,#0xffe  @將寄存器R1 的值與立即數0xffe 按位與,並根據結果設定CPSR的標誌位,應用中會在TST之後加一條跳轉指令  
3.6 異或測試指令TEQ        TEQ{條件} 運算元1,運算元2
      TEQ 指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位異或運算,並根據運算結果更新CPSR 中條件標誌位的值。該指令通常用於比較運算元1 和運算元2 是否相等。
樣本如下: [cpp] view plain copy TEQ R1,R2 @將寄存器R1 的值與寄存器R2的值按位異或,並根據結果設定CPSR 的標誌位  

4. 資料傳送指令  4.1 資料傳送指令MOV

      MOV{條件}{S} 目的寄存器,源運算元
     MOV 指令可完成從另一個寄存器、被移位的寄存器或將一個立即數載入到目的寄存器。其中S選項決定指令的操作是否影響CPSR 中條件標誌位的值,當沒有S時指令不更新CPSR 中條件標誌位的值。
     樣本如下:     [cpp] view plain copy MOV R1,R0         @將寄存器R0 的值傳送到寄存器R1   MOV PC,R14        @將寄存器R14 的值傳送到P

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.