ARMv7-M Assembly Cheatsheet
Data Movement
MOV R0, #10 ; Move immediate value to R0
MOV R1, R0 ; Copy value from R0 to R1
LDR R0, =LABEL ; Load address of label into R0
Arithmetic Instructions
ADD R2, R0, R1 ; R2 = R0 + R1
SUB R2, R0, R1 ; R2 = R0 - R1
MUL R2, R0, R1 ; R2 = R0 * R1
Logical and Bitwise Operations
AND R2, R0, R1 ; Bitwise AND: R2 = R0 & R1
ORR R2, R0, R1 ; Bitwise OR: R2 = R0 | R1
EOR R2, R0, R1 ; Bitwise XOR: R2 = R0 ^ R1
MVN R2, R0 ; Bitwise NOT: R2 = ~R0
Comparison
CMP R0, R1 ; Compare R0 to R1 (sets flags based on R0 - R1)
Flags affected:
Z (Zero): set if R0 == R1
N (Negative): set if result < 0
C (Carry): set if unsigned overflow
V (Overflow): set if signed overflow
Conditional Branching
BEQ LABEL ; Branch if equal (Z == 1)
BNE LABEL ; Branch if not equal (Z == 0)
BGT LABEL ; Branch if greater than (Z == 0 and N == V)
BLT LABEL ; Branch if less than (N != V)
B LABEL ; Unconditional branch
Memory Access
LDR R0, [R1] ; Load word from address in R1 into R0
STR R0, [R1] ; Store word in R0 into address in R1
Stack Operations
LDR SP, =0x20001000 ; Initialize stack pointer
PUSH {R0, R1} ; Push R0 and R1 onto the stack
POP {R2, R3} ; Pop top two values into R2 and R3
Program Flow
LABEL: ; Define label
B LABEL ; Branch to label (loop or jump)
MOV PC, R0 ; Jump to address in R0 (manual control flow)
Register Overview
R0–R12: General-purpose registers
R13 (SP): Stack Pointer
R14 (LR): Link Register
R15 (PC): Program Counter
xPSR: Program Status Register (holds flags like Z, N, C, V)