經典ARM指令格式以下:性能
<opcode> {<cond>} {S} <Rd>,<Rn>,<operand2>
ARM指令能夠經過添加適當的條件碼後綴來達到條件執行的目的
這樣能夠提升代碼密度,減小分支跳轉指令數目,提升性能。
測試
默認狀況下,數據處理指令不影響條件碼標誌位,但能夠選擇經過添加「S」來影響標誌位
CMP不須要增長 「S」就可改變相應的標誌位。
spa
使用條件碼能夠實現高效的邏輯操做,節省跳轉和條件語句,提升代碼效率
若是指令不標明條件碼,將默認爲無條件(AL)執行。
code
條件碼錶
blog
跳轉指令用於實現程序流程的跳轉,在ARM程序中有兩種方法能夠實現程序的跳轉,一種是使用跳轉指令直接跳轉,另外一種是直接向PC寄存器賦值實現跳轉。進程
B{條件} 目標地址
B指令最簡單的跳轉指令,一旦遇到一個B指令,ARM處理器當即跳轉至給定的目標地址,由此處繼續執行。跳轉指令B限制在當前指令的土32MB範圍內ip
BL{條件} 目標地址
BL是一另個跳轉指令,在跳轉前會將下一條指令的地址複製到R14中,而後跳轉到指定的地址運行程序。能夠經過將R14的內容從新加載到PC中,並返回到跳轉指令以後的那個指令處執行。 BL是實現子程序調用的一個基本但經常使用的手段。內存
BLX{條件} 目標地址
BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工做狀態由ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容到寄存器R14中。當程序使用Thumb指令集,而調用者使用ARM指令集時,能夠經過BLX指令實現程序的調用和處理器工做狀態的切換。子程序的返回能夠經過將寄存器R14複製到PC中來完成。it
BX{條件} 目標地址
BX指令是帶狀態切換的跳轉指令,跳轉到指定的目標地址執行程序。若目標地址寄存器的[0]位爲1,則跳轉時自動將CPSR中的標誌T置位,即把目標地址的代碼解釋爲Thumb指令。若目標地址寄存器的[0]位爲0,則跳轉時自動將CPSR中的標誌T復位,即把目標地址的代碼解釋爲ARM指令。io
MOV R0,R1
MOVS R1,R3,LSL,#3
MOV PC,LR
MVN R1,#0xFF
MVN R1,R2
MVN R0,#0
ADDS R1,R1,#1
ADD R1,R1,R2
ADD R0,R2,R3,LSL,#1
SUB R0,R0,#1
SUBS R0,R1,R2
SUB R0,R2,R3,LSL,#1
RSB R3,R1,#0xFF00
RSB R0,R2,R3,LSL,#1
RSB R0,R1,#0
ADDS R0,R0,R2
ADC R1,R2,R3
SUBS R0,R0,R2
SUB R1,R1,R3
RSBS R2,R0,#0
RSC R3,R1,#0
RSC R0,R1,R2
AND R0,R0,#3
AND R2,R1,R3
ORR R0,R0,#3
MOV R1,R2,LSR,#4
ORR R3,R1,R3,LSL,#4
EOR R1,R1,#0x0F
EOR R2,R1,R0
EORS R0,R5,#0x01
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 R0,#0x01
TST R0,#0x0F
TEQ R1,R2
ARM指令有兩條指令用於狀態寄存器和通用寄存器之間傳送數。修改寄存器通常是經過 「讀取-修改-寫回」 三個步驟的操做來實現的。這兩指令分別是狀態寄存器到通用寄存器的傳送指令MRS,通用寄存器到狀態寄存器的傳送指令MSR。
MRS R0,CPSR
MRS R0,SPSR
MSR CPSR_c,#0xD3
MSR CPSR_cxsf,R3
Load指令用於從內存中讀取數據放入寄存器中,Store指令用於將寄存器中的數據保存到內存。
LDR R0,#8
LDR R0,[R1,R2]
LDR R0,[R1,# 8]
STR #8,R0
STR R0,[R1,#8]
STMFD R13,{R0,R4-R12,LR}
DMFD R13,{R0,R4-R12,LR}
SWI,即software interrupt軟件中斷。該指令產生一個SWI異常。意思就是處理器模式改變爲超級用戶模式,CPSR寄器保存到超級用戶模式下的SPSR寄存器,而且跳轉到SWI向量。
指令格式以下:SWI{cond} immed_24
Cond域:是可選的條件碼 (參見 ARM彙編指令條件執行詳解).
immed_24域:範圍從 0 到 224-1 的表達式, (即0-16777215)。用戶程序可使用該常數來進入不一樣的處理流程。