Operation

Assembler

Action

S flags

Copy and shift

MOV{cond}{S} Rd, <Oprnd>

d:= <Oprnd>

NZCR

Not

MVN{cond}{S} Rd, <Oprnd>

d:= ~<Oprnd>

NZCR

Add

ADD{cond}{S} Rd, Rn, <Oprnd>

d:= Rn + <Oprnd>

NZCVR

Add with carry

ADC{cond}{S} Rd, Rn, <Oprnd>

d:= Rn + <Oprnd> + Carry

NZCVR

Sub

SUB{cond}{S} Rd, Rn, <Oprnd>

d:= Rn - <Oprnd>

NZCVR

Sub with carry

SBC{cond}{S} Rd, Rn, <Oprnd>

d:= Rn - <Oprnd> - Not(Carry)

NZCVR

Reverse Sub

RSB{cond}{S} Rd, Rn, <Oprnd>

d:= <Oprnd> - Rn

NZCVR

Rev sub with carry

RSC{cond}{S} Rd, Rn, <Oprnd>

d:= <Oprnd> - Rn – Not(Carry)

NZCVR

Multiply

MUL{cond}{S} Rd, Rm, Rs

d:= Rm * Rs

NZR

Multiply Add

MLA{cond}{S} Rd, Rm, Rs, Rn

d:= (Rm * Rs) + Rn

NZR

Compare

CMP{cond} Rd, <Oprnd>

flags:= Rn - <Oprnd>

NZCV

Cmp Negative

CMN{cond} Rd, <Oprnd>

flags:= Rn + <Oprnd>

NZCV

Test

TST{cond} Rn, <Oprnd>

flags:= Rn And <Oprnd>

NZC

Test equivalence

TEQ{cond} Rn, <Oprnd>

flags:= Rn Xor <Oprnd>

NZC

And

AND{cond}{S} Rd, Rn, <Oprnd>

Rd:= Rn And <Oprnd>

NZC

Xor

EOR{cond}{S} Rd, Rn, <Oprnd>

Rd:= Rn Xor <Oprnd>

NZC

 

XOR{cond}{S} Rd, Rn, <Oprnd>

Rd:= Rn Xor <Oprnd>

NZC

Or

ORR{cond}{S} Rd, Rn, <Oprnd>

Rd:= Rn Or <Oprnd>

NZC

BitClear (~And)

BIC{cond}{S} Rd, Rn, <Oprnd>

Rd:= Rn And Not <Oprnd>

NZC

Branch

B{cond} label

R15/PC:= address

 

Gosub

BL{cond} label

R14:=R15/PC, R15/PC:= address

 

Load Int

LDR{cond} Rd, <a_mode>

Rd:= [address]

 

 

LDR{cond} Rd, Label

Rd:= data at label. The label address is calculated

 

 

relative to the PC. This does not work with

 

 

constants

 

Load Byte

LDR{cond}B Rd, <a_mode>

Rd:= [byte at address] 0 extended

 

 

LDRB{cond} Rd, Label

Rd:= data at label. The label address is calculated

 

 

relative to the PC. This does not work with

 

 

constants

 

Multiple load

 

Stack operations (Pop)

 

Inc Before

LDM{cond}IB Rd{!}, {reg list}

! sets the W bit (updates the base

 

Inc After

LDM{cond}IA Rd{!}, {reg list}

register after the transfer)

 

Dec Before

LDM{cond}DB Rd{!}, {reg list}

 

 

Dec After

LDM{cond}DA Rd{!}, {reg list}

 

 

Store Int

STR{cond} Rd, <a_mode>

[address]:= Rd

 

 

STR{cond} Rd, Label

data at label:= Rd. The label address is calculated

 

 

relative to the PC. This does not work with

 

 

constants

 

Store Byte

STRB{cond} Rd, <a_mode>

[address]:= byte value from Rd

 

 

STRB{cond} Rd, Label

data at label:= Rd. The label address is calculated

 

 

relative to the PC. This does not work with

 

 

constants

 

Multiple Store

 

Stack operations (Push)

 

Inc Before

STM{cond}IB Rd{!}, {reg list}

! sets the W bit (updates the base

 

Inc After

STM{cond}IA Rd{!}, {reg list}

register after the transfer)

 

Dec Before

STM{cond}DB Rd{!}, {reg list}

 

 

Dec After

STM{cond}DA Rd{!}, {reg list}

 

 

Multiplication

MUL rd, r1 r2

rd=r1*r2

 

 

MLA rd, r1, r2, r3

rd=r1*r2+r3

 

 

SMULL rd1, rd2, r1, r2

Signed mul rd1=low r1*r2, rd2=high r1*r2

 

SMLAL rd1, rd2, r1, r2

Signed mul add rd1+=low r1*r2, rd2+=high r1*r2

 

UMULL rd1, rd2, r1, r2

rd1=low r1*r2, rd2=high r1*r2

 

 

UMLAL rd1, rd2, r1, r2

mul add rd1+=low r1*r2, rd2+=high r1*r2

*labelName

 

Creates a label

 

$

 

See $ in ASM mode

 

“, ¢

 

See ASM mode

 

6-32 The Development Library