Arm七種操作模式:
用戶(usr)、系統(sys)、快中斷(fiq)、中斷(irq)、管理(svc)、中止(abt)、未定義(und)
MOV
R1,R0
;將寄存器R0的值傳送到寄存器R1
MOV
PC,R14
;將寄存器R14的值傳送到PC,常用於子程序返回
MOV
R1,R0,LSL#3
;將寄存器R0的值左移3位後傳送到R1
MVN
R0,#0
;將立即數0取反傳送到寄存器R0中,完成後R0=-1
CMP R1,R0
;將寄存器R1的值與寄存器R0的值相減,並根據結果設置CPSR的標誌位
CMP R1,#100
;將寄存器R1的值與立即數100相減,並根據結果設置CPSR的標誌位
CMN R1,R0
;將寄存器R1的值與寄存器R0的值相加,並根據結果設置CPSR的標誌位
CMN R1,#100
;將寄存器R1的值與立即數100相加,並根據結果設置CPSR的標誌位
TST指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標誌位的值。操作數1是要測試的數據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。
TST
R1,#%1
;用於測試在寄存器R1中是否設置了最低位(%表示二進制數)
TST
R1,#0xffe
;將寄存器R1值與立即數0xffe按位與,並根據結果設置CPSR的標誌位
TEQ指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,並根據運算結果更新CPSR中條件標誌位的值。該指令通常用於比較操作數1和操作數2是否相等。
TEQ
R1,R2
;將寄存器R1值與寄存器R2的值按位異或,並根據結果設置CPSR的標誌位
ADD
R0,R1,R2
;
R0 = R1 + R2
ADD
R0,R1,#16
;
R0 = R1 + 16
ADD
R0,R2,R3,LSL#1
;
R0 = R2 + (R3 << 1)
以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7~R4,第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄存器R3~R0:
ADDS R0,R4,R8
;
加低端的字
ADCS R1,R5,R9
;
加第二個字,帶進位
ADCS R2,R6,R10
;
加第三個字,帶進位
ADC
R3,R7,R11
;
加第四個字,帶進位
SUB
R0,R1,R2
;
R0 = R1 - R2
SUB
R0,R1,#16
;
R0 = R1 - 16
SUB
R0,R2,R3,LSL#1
; R0 = R2 - (R3 << 1)
SUBS
R8,R6,#240
;R8=R6-240,影響CPSR
SUBS
PC,LR,#0X4
;PC=LR-4,CPSR=SPSR
SBC指令用於把操作數1減去操作數2,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。該指令使用進位標誌來表示借位,這樣就可以做大於32位的減法。
SBC
R0,R1,R2
;
R0 = R1 - R2 -
!C,並根據結果設置CPSR的進位標誌位
RSB
R0,R1,R2
;
R0 = R2 – R1
RSB
R0,R1,#16
;
R0 = 16 – R1
RSB
R0,R2,R3,LSL#1
;
R0 = (R3 << 1) - R2
RSC指令用於把操作數2減去操作數1,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。
RSC
R0,R1,R2
; R0 = R2 – R1 -
!C
該指令常用於屏蔽操作數1的某些位。
邏輯與運算
AND
R0,R0,#3
;
該指令保持R0的0、1位,其餘位清零。
該指令常用於設置操作數1的某些位。
邏輯或運算
ORR R0,R0,#3
;
該指令設置R0的0、1位,其餘位保持不變。
EOR指令用於在兩個操作數上進行邏輯異或運算。
EOR
R0,R0,#3
;
該指令反轉R0的0、1位,其餘位保持不變。
BIC指令用於清除操作數1的某些位,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。操作數2爲32位的掩碼,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不變。
BIC
R0,R0,#%1011
;
該指令清除 R0
中的位 0、1、3,其餘的位保持不變。
MUL
R0,R1,R2
;R0 = R1
× R2
MULS R0,R1,R2
;R0 = R1 × R2,同時設置CPSR中的相關條件標誌位
MLA R0,R1,R2,R3
;R0=R1×R2+R3
MLAS R0,R1,R2,R3
;R0=R1×R2+R3,同時設置CPSR中的相關條件標誌位
SMULL R0,R1,R2,R3 ;R0=(R2
× R3)的低32位,R1 =
(R2
× R3)的高32位
SMLAL R0,R1,R2,R3
;R0
=(R2 ×
R3)的低32位+R0,R1
=(R2×R3)的高32位+R1
UMULL R0,R1,R2,R3
;R0 =
(R2 × R3)的低32位,R1 =
(R2 × R3)的高32位
UMLAL R0,R1,R2,R3
;R0
=(R2 ×
R3)低32位+R0,R1
=(R2 ×
R3)的高32位+R1
LDR
R0,[R1]
;將存儲器地址爲R1的字數據讀入寄存器R0。
LDR
R0,[R1,R2] ;將存儲器地址爲R1+R2的字數據讀入寄存器R0。
LDR
R0,[R1,#8]
;將存儲器地址爲R1+8的字數據讀入寄存器R0。
LDR R0,[R1,R2]!
;將存儲器地址爲R1+R2的字數據讀入寄存器R0,並將新
;地址R1+R2寫入R1。
LDR R0,[R1],R2
;將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址
;R1+R2寫入R1。
LDR
R0,[R1,R2,LSL#2]!
;將存儲器地址爲R1+R2×4的字數據讀入
;寄存器R0,並將新地址R1+R2×4寫入R1。
LDR
R0,[R1],R2,LSL#2
;將存儲器地址爲R1的字數據讀入寄存器R0,
;並將新地址R1+R2×4寫入R1。
LDRB R0,[R1]
;將存儲器地址爲R1的字節數據讀入寄存器R0,
;並將R0的高24位清零。
LDRB R0,[R1,#8]
;將存儲器地址爲R1+8的字節數據讀入寄存器R0,
;並將R0的高24位清零。
LDRH R0,[R1]
;將存儲器地址爲R1的半字數據讀入寄存器R0,
;並將R0的高16位清零。
LDRH R0,[R1,#8]
;將存儲器地址爲R1+8的半字數據讀入寄存器R0,
;並將R0的高16位清零。
LDRH R0,[R1,R2]
;將存儲器地址爲R1+R2的半字數據讀入寄存器R0,
;並將R0的高16位清零。
STR
R0,[R1],#8
;將R0中的字數據寫入以R1爲地址的存儲器中,並將新
;地址R1+8寫入R1。
STR
R0,[R1,#8]
;將R0中的字數據寫入以R1+8爲地址的存儲器中。
STRB R0,[R1]
;將R0中的低8位字節數據寫入以R1爲地址的存儲器中。
STRB
R0,[R1,#8]
;將R0中的低8位字節數據寫入以R1+8爲地址的存儲器中。
STRH R0,[R1]
;將寄存器R0中的半字數據寫入以R1爲地址的存儲器中。
STRH R0,[R1,#8]
;將寄存器R0中的半字數據寫入以R1+8爲地址的存儲器中。
{!}爲可選後綴,若選用該後綴,則當數據傳送完畢之後,將最後的地址寫入基址寄存器,否則基址寄存器的內容不改變;
基址寄存器不允許爲R15,寄存器列表可以爲R0~R15的任意組合;
{∧}爲可選後綴,當指令爲LDM且寄存器列表中包含R15,選用該後綴時表示:除了正常的數據傳送之外,還將SPSR複製到CPSR。同時,該後綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當前模式下的寄存器。
STMFD
R13!,{R0,R4-R12,LR}
;將寄存器列表中的寄存器
;(R0,R4到R12,LR)存入堆棧。
LDMFD
R13!,{R0,R4-R12,PC}
;將堆棧內容恢復到寄存器
;(R0,R4到R12,PC)。
LDMFD R13!,{R0,R4-R12,PC}
∧
;將堆棧內容寄存
;器R0,R4到R12,PC,同時SPSR複製到CPSR
SWP R0,R1,[R2]
;R0<-[R2],R1->[R2]
SWP R0,R0,[R1]
;R0ßà[R1]
SWPB R0,R1,[R2]
;將R2所指向的存儲器中的字節數據傳送到R0,R0的高24位清零,
;同時將R1中的低8位數據傳送到R2所指向的存儲單元。
SWPB R0,R0,[R1]
;該指令完成將R1所指向的存儲器中的字節數據與R0中的
;低8位數據交換。
MRS R0,CPSR
;傳送CPSR的內容到R0
MRS R0,SPSR
;傳送SPSR的內容到R0