ARM 32bit Instruction Set (ARM Code)

ARM Instruction Summary

Logical ALU Operations

Instruction Cycles Flags Explanation
MOV{cond}{S} Rd,Op2 1S+x+y NZc- Rd = Op2
MVN{cond}{S} Rd,Op2 1S+x+y NZc- Rd = NOT Op2
ORR{cond}{S} Rd,Rn,Op2 1S+x+y NZc- Rd = Rn OR Op2
EOR{cond}{S} Rd,Rn,Op2 1S+x+y NZc- Rd = Rn XOR Op2
AND{cond}{S} Rd,Rn,Op2 1S+x+y NZc- Rd = Rn AND Op2
BIC{cond}{S} Rd,Rn,Op2 1S+x+y NZc- Rd = Rn AND NOT Op2
TST{cond}{P} Rn,Op2 1S+x NZc- Void = Rn AND Op2
TEQ{cond}{P} Rn,Op2 1S+x NZc- Void = Rn XOR Op2

Arithmetic ALU Operations

Instruction Cycles Flags Explanation
ADD{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Rn+Op2
ADC{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Rn+Op2+Cy
SUB{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Rn-Op2
SBC{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Rn-Op2+Cy-1
RSB{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Op2-Rn
RSC{cond}{S} Rd,Rn,Op2 1S+x+y NZCV Rd = Op2-Rn+Cy-1
CMP{cond}{P} Rn,Op2 1S+x NZCV Void = Rn-Op2
CMN{cond}{P} Rn,Op2 1S+x NZCV Void = Rn+Op2

Multiply

Instruction Cycles Flags Explanation
MUL{cond}{S} Rd,Rm,Rs 1S+mI NZx- Rd = Rm*Rs
MLA{cond}{S} Rd,Rm,Rs,Rn 1S+mI+1I NZx- Rd = Rm*Rs+Rn
UMULL{cond}{S} RdLo,RdHi,Rm,Rs 1S+mI+1I NZx- RdHiLo = Rm*Rs
UMLAL{cond}{S} RdLo,RdHi,Rm,Rs 1S+mI+2I NZx- RdHiLo = Rm*Rs+RdHiLo
SMULL{cond}{S} RdLo,RdHi,Rm,Rs 1S+mI+1I NZx- RdHiLo = Rm*Rs
SMLAL{cond}{S} RdLo,RdHi,Rm,Rs 1S+mI+2I NZx- RdHiLo = Rm*Rs+RdHiLo
SMLAxy{cond} Rd,Rm,Rs,Rn ARMv5TE(xP) —-q Rd=HalfRm*HalfRs+Rn
SMLAWy{cond} Rd,Rm,Rs,Rn ARMv5TE(xP) —-q Rd=(Rm*HalfRs)/10000h+Rn
SMULWy{cond} Rd,Rm,Rs ARMv5TE(xP) —- Rd=(Rm*HalfRs)/10000h
SMLALxy{cond} RdLo,RdHi,Rm,Rs ARMv5TE(xP) —- RdHiLo=RdHiLo+HalfRm*HalfRs
SMULxy{cond} Rd,Rm,Rs ARMv5TE(xP) —- Rd=HalfRm*HalfRs

Memory load/store

Instruction Cycles Flags Explanation
LDR{cond}{B}{T} Rd,<Address> 1S+1N+1I+y —- Rd=[Rn+/-]
LDR{cond}H Rd,<Address> 1S+1N+1I+y —- Load Unsigned halfword
LDR{cond}D Rd,<Address>   —- Load Dword ARMv5TE
LDR{cond}SB Rd,<Address> 1S+1N+1I+y —- Load Signed byte
LDR{cond}SH Rd,<Address> 1S+1N+1I+y —- Load Signed halfword
LDM{cond}{amod} Rn{!},{^} nS+1N+1I+y —- Load Multiple
STR{cond}{B}{T} Rd,<Address> 2N —- [Rn+/-]=Rd
STR{cond}H Rd,<Address> 2N —- Store halfword
STR{cond}D Rd,<Address>   —- Store Dword ARMv5TE
STM{cond}{amod} Rn{!},{^} (n-1)S+2N —- Store Multiple
SWP{cond}{B} Rd,Rm,[Rn] 1S+2N+1I —- Rd=[Rn], [Rn]=Rm
PLD <Address> 1S —- Prepare Cache ARMv5TE

Jumps, Calls, CPSR Mode, and others

Instruction Cycles Flags Explanation
B{cond} label 2S+1N —- PC=$+8+/-32M
BL{cond} label 2S+1N —- PC=$+8+/-32M, LR=$+4
BX{cond} Rn 2S+1N —- PC=Rn, T=Rn.0 (THUMB/ARM)
BLX{cond} Rn 2S+1N —- PC=Rn, T=Rn.0, LR=PC+4, ARM9
BLX label 2S+1N —- PC=PC+$+/-32M, LR=$+4, T=1, ARM9
MRS{cond} Rd,Psr 1S —- Rd=Psr
MSR{cond} Psr{_field},Op 1S (psr) Psr[field]=Op
SWI{cond} Imm24bit 2S+1N —- PC=8, ARM Svc mode, LR=$+4
BKPT Imm16bit ??? —- PC=C, ARM Abt mode, LR=$+4 ARM9
The Undefined Instruction 2S+1I+1N —- PC=4, ARM Und mode, LR=$+4
cond=false 1S —- Any opcode with condition=false
NOP 1S —- R0=R0
CLZ{cond} Rd,Rm ??? —- Count Leading Zeros ARMv5
QADD{cond} Rd,Rm,Rn   —-q Rd=Rm+Rn ARMv5TE(xP)
QSUB{cond} Rd,Rm,Rn   —-q Rd=Rm-Rn ARMv5TE(xP)
QDADD{cond} Rd,Rm,Rn   —-q Rd=Rm+Rn*2 ARMv5TE(xP)
QDSUB{cond} Rd,Rm,Rn   —-q Rd=Rm-Rn*2 ARMv5TE(xP)

Go back