[ARM] ARM指令集


ARM指令集

 

一、ARM指令的格式和分類

經典ARM指令格式如下:

<opcode>    {<cond>}    {S}    <Rd>,<Rn>,<operand2>
 
  • <> 為必選項,{}為可選項
  • 為操作碼,如ADD表示算術加操作指令
  • {} 決定指令執行條件域
  • {S} 決定指令執行是否影響CPSR寄存器的值
  • 為目的寄存器
  • 的第一個操作數為寄存器
  • 為第二個操作數
 

二、ARM指令條件執行及標志位

  • ARM指令可以通過添加適當的條件碼后綴來達到條件執行的目的
    這樣可以提高代碼密度,減少分支跳轉指令數目,提高性能。

  • 默認情況下,數據處理指令不影響條件碼標志位,但可以選擇通過添加“S”來影響標志位
    CMP不需要增加 “S”就可改變相應的標志位。

  • 使用條件碼可以實現高效的邏輯操作,節省跳轉和條件語句,提高代碼效率
    如果指令不標明條件碼,將默認為無條件(AL)執行。

  • 條件碼表

 

三、跳轉指令

  跳轉指令用於實現程序流程的跳轉,在ARM程序中有兩種方法可以實現程序的跳轉,一種是使用跳轉指令直接跳轉,另一種是直接向PC寄存器賦值實現跳轉。

  • B{條件} 目標地址
      B指令最簡單的跳轉指令,一旦遇到一個B指令,ARM處理器立即跳轉至給定的目標地址,由此處繼續執行。跳轉指令B限制在當前指令的土32MB范圍內

  • BL{條件} 目標地址
      BL是一另個跳轉指令,在跳轉前會將下一條指令的地址復制到R14中,然后跳轉到指定的地址運行程序。可以通過將R14的內容重新加載到PC中,並返回到跳轉指令之后的那個指令處執行。 BL是實現子程序調用的一個基本但常用的手段。

  • BLX{條件} 目標地址
      BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態由ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容到寄存器R14中。當程序使用Thumb指令集,而調用者使用ARM指令集時,可以通過BLX指令實現程序的調用和處理器工作狀態的切換。子程序的返回可以通過將寄存器R14復制到PC中來完成。

  • BX{條件} 目標地址
      BX指令是帶狀態切換的跳轉指令,跳轉到指定的目標地址執行程序。若目標地址寄存器的[0]位為1,則跳轉時自動將CPSR中的標志T置位,即把目標地址的代碼解釋為Thumb指令。若目標地址寄存器的[0]位為0,則跳轉時自動將CPSR中的標志T復位,即把目標地址的代碼解釋為ARM指令。

 

四、數據處理指令

  • MOV{條件} {S} 目的寄存器,源操作數
    MOV指令可以完成的功能包括:
    • 數據從一個寄存器到另一個寄存器的傳輸
    • 將常數傳送到寄存器中
    • 實現移位操作,左移位可以實現將操作數乘以2^n
    • 當PC寄存器作為目標寄存器時可以實現程序的跳轉
    • 當PC寄存器作為目標寄存器且指令中S位被設置時,指令在執行跳轉操作的同時,將當前處理器模式的處理器模式的SPSR寄存器內容復制到CPSR中
MOV    R0,R1
MOVS   R1,R3,LSL,#3
MOV    PC,LR

 

  • MVN{條件} {} 目的寄存器,源操作數
      MVN指令可完成從另一個寄存器、被移位的寄存器或將一個立即數加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。因為其具有取反功能,所以可以裝載范圍更廣的立即數。
MVN    R1,#0xFF
MVN    R1,R2
MVN    R0,#0

 

 

  • ADD{條件} {S} 目的寄存器,操作數1,操作數2
      ADD指令用於把兩個操作數相加,並將結果存放到目的寄存器中,同時根據操作的結果更新CPSR中相應的條件標志位
ADDS   R1,R1,#1
ADD    R1,R1,R2
ADD    R0,R2,R3,LSL,#1

 
  • SUB{條件} {S} 目的寄存器,操作數1,操作數2
      SUB指令用於把操作數1減去操作數2,並將結果存放在目的寄存器中,同時根據操作的結果更新CPSR中相應的條件標志位。該指令可用於有符號數或無符號數據減法運算。
SUB     R0,R0,#1
SUBS   R0,R1,R2
SUB     R0,R2,R3,LSL,#1

 
  • RSB{條件} {S} 目的寄存器,操作數1,操作數2
      RSB指令稱為逆向減法指令,用於把操作數2,減去操作數1,並將結果存放到目的寄存器中,同時根據操作的結果更新CPSP中相應的條件標志位。該指令可用於有符號數或無符號數據減法運算。
RSB    R3,R1,#0xFF00
RSB    R0,R2,R3,LSL,#1
RSB    R0,R1,#0 

 
  • ADC{條件} {S} 目的寄存器,操作數1,操作數2
      ADC指令用於把兩個操作數相加,再加上CPSR中的C條件標志位的值,並將結果存放到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位。它使用一個進位標志位,這樣就可以做比32位大的數據加法,注意不要忘記S后綴來更改進位標志。操作數1應是一個寄存器,操作數2可以是寄存器、被移位的寄存器或一個立即數。
ADDS   R0,R0,R2
ADC     R1,R2,R3

 
  • SBC{條件} {S} 目的寄存器,操作數1,操作數2
      SBC指令用於把操作數1減去操作數2,再減去CPSR中的C條件標志位的反碼,然后將結點存放到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位。該指令使用進位標志來表示借位,這樣就可以做大於32位的減法。注意不要忘記設置S后綴來更改進位標志,該指令可用於有符號數或無符號數據減法運算。
SUBS  R0,R0,R2
SUB   R1,R1,R3

 
  • RSC{條件} {S} 目的寄存器,操作數1,操作數2
      RSC指令用於把操作數2減去操作數1,再減去CPSR中的C條件標志位的反碼,並將結果存放到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位。該指令使用進位標志來表示借位,這樣就可以做大於32位的減法。注意不要忘記設置S后綴來更改進位標志,該指令可用於有符號數或無符號數據減法運算。
RSBS   R2,R0,#0
RSC    R3,R1,#0
RSC    R0,R1,R2

 
  • AND{條件} {S} 目的寄存器,操作數1,操作數2
      AND指令用在兩個操作數上進行邏輯與運算,並把結果存放到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位,該指令學用於屏蔽操作數1的某些位。
AND   R0,R0,#3
AND   R2,R1,R3

 
  • ORR{條件} {S} 目的寄存器,操作數1,操作數2
      ORR指令用在兩個操作數上進行邏輯或運算,並把結果旋轉到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位,該指令常用於設置操作數1的的某些位。
ORR     R0,R0,#3
MOV    R1,R2,LSR,#4
ORR     R3,R1,R3,LSL,#4

 
  • EOR{條件} {S} 目的寄存器,操作數1,操作數2
      EOR指令用在兩個操作數上進行邏輯異或運算,並把結果放置到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位,該指令常用於反轉操作數1的某些位。
EOR    R1,R1,#0x0F
EOR    R2,R1,R0
EORS   R0,R5,#0x01

 
  • BIC{條件} {S} 目的寄存器,操作數1,操作數2
      BIC指令用於清除操作數1的某些位,並把結果放置到目的寄存器中。同時根據操作的結果更新CPSR中相應的條件標志位。操作數2為32位的掩碼,如果在掩碼中設置了某一位,則清除這一位,未設置掩碼位保持不變。
BIC    R0,R0,#%1011
BIC    R1,R1,#0x0F
BIC    R1,R2,R3

 
  • CMP{條件} 操作數1,操作數2
      CMP指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR中的條件標志位的值。該指令進行一次減法運算,但不存儲結果,只更改條件標志位,標志位表示的是操作數1與操作數2的關系。如果操作數1大於操作數2,則此后GT后綴的指令將執行,不需顯示的指定S后綴更改狀態標志,如果指定了則忽略。

  • CMN{條件} 操作數1,操作數2
      CMN指令用於把一個寄存器的內容和另一個寄存器的內容或立即數據取反后進行比較。同時更新CPSR中條件標志位的值,該指令實際完成操作數1和操作數2相加,並根據結果更改條件標志位。CMN指令與ADD指令的區別在於CMN指令不保存運算結果。

CMN    R1,R0
CMN    R1,#100

 
  • TST{條件} 操作數1,操作數2
      TST指令用於把操作數1的內容和操作數的內容進行按位與運算,並根據運算結果更新CPSR中條件標志位的值。操作數1是要測試的數據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。
TST    R0,#0x01
TST    R0,#0x0F    

 
  • TEQ{條件} 操作數1,操作數2
      TEQ指令用於把操作數1的內容和操作數的內容進行按位異或運算,並根據運算結果更新CPSR中條件標志位的值。該指令通常用於比較操作數1和操作數2是否相等。
TEQ    R1,R2
 

 

五、程序狀態寄存器傳輸指令

  ARM指令有兩條指令用於狀態寄存器和通用寄存器之間傳送數。修改寄存器一般是通過 “讀取-修改-寫回” 三個步驟的操作來實現的。這兩指令分別是狀態寄存器到通用寄存器的傳送指令MRS,通用寄存器到狀態寄存器的傳送指令MSR。

  • MRS{條件} 通用寄存器,程序狀態寄存器
      當異常中斷允許被嵌套時,需要在進入異常中斷后嵌套中斷發生之前的保存當前處理器對應的SPSR。在進程切換時也需要保存當前狀態寄存器的值。
MRS    R0,CPSR
MRS    R0,SPSR

 
  • MSR{條件} 程序狀態寄存器_<域>,通用寄存器
      當退出異常中斷處理程序時,如果事先有保存狀態寄存器的內容,通常使用MSR將事先保存的數據恢復到狀態寄存器中。域用於設置程序狀態寄存器中需要操作的位,32位的程序狀態寄存器可分為4個域:
    • [31:24] 為條件標志位域,用f表示
    • [23:16] 為狀態位域,用s表示
    • [15:8] 為擴展位域,用x表示
    • [7:0] 為控制位域,用c表示
MSR   CPSR_c,#0xD3
MSR   CPSR_cxsf,R3
 

 

六、Load與Store指令

  Load指令用於從內存中讀取數據放入寄存器中,Store指令用於將寄存器中的數據保存到內存。

  • LDR{條件} 目的寄存器,<存儲器地址>
      LDR指令用於從存儲器中將一個32位的數據傳送到目的寄存器中。當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的數據被目的地址,從而實現程序流程的跳轉。
LDR    R0,#8
LDR    R0,[R1,R2]
LDR    R0,[R1, 8] 

 
  • STR{條件} 源寄存器,<存儲器地址>
    STR指令用於從源寄存器中將一個32位數據傳送到存儲器中。
STR    #8,R0
STR    R0,[R1,#8]    

 
  • LDM/STM{條件} {類型} 基址寄存器,寄存器列表
      LDM和STM可以實現在一組寄存器和一塊連續的內存單元之間傳輸數據。LDM為加載多個寄存器,STM為存儲多個寄存器。LDM、STM的主要用途是現場保存,數據復制,參數傳遞,其模式有8種:
    • 用於數據塊傳輸
      IA 每次傳送后地址加4
      IB 每次傳送前地址加4
      DA 每次傳送后地址減4
      DB 每次傳送前地址減4
    • 用於堆棧操作
      FD 滿遞減堆棧
      ED 空遞減堆棧
      FA 滿遞增堆棧
      EA 空遞增堆棧
STMFD    R13,{R0,R4-R12,LR}
DMFD    R13,{R0,R4-R12,LR}

 
  • SWP {條件} 目的寄存器,源寄存器1,[源寄存器2]
      SWP指令用於將源寄存器2中的把指向的存儲器中的數據傳送到目的寄存器中。同時將源寄存器1中的數據傳送到源寄存器2所指向的存儲器中。當源寄存器1和目的寄存器為同一寄存器時,指令將交換目的寄存器和存儲器的內容。

 

7、異常中斷產生指令

SWI,即software interrupt軟件中斷。該指令產生一個SWI異常。意思就是處理器模式改變為超級用戶模式,CPSR寄器保存到超級用戶模式下的SPSR寄存器,並且跳轉到SWI向量。

  指令格式如下:SWI{cond} immed_24
  Cond域:是可選的條件碼 (參見 ARM匯編指令條件執行詳解).
  immed_24域:范圍從 0 到 224-1 的表達式, (即0-16777215)。用戶程序可以使用該常數來進入不同的處理流程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM