1. Data Processing
1.1. Move
- MOV: 레지스터 간 데이터 복사
- MVN: 피연산자에 not 연산 결과를 저장
mov R0, #7 // R0 = 7
mvn R0, #7 // R0 = ~7 (0xFFFF_FFF8)
1.2. Arithmetic
- ADD: 덧셈
- ADC: carry와 덧셈
- SUB: 뺄셈
- SBC: carry와 뺄셈
- RSB: 피연산자 순서 바꾸어 뺄셈
- RSC: 피연산자 순서 바꾸어 ~carry와 뺄셈
ADD R0, R1, #8 // R0 = R1 + 8
ADC R0, R1, #8 // R1 = 0x2000 -> R0 = 0x2000 + 0x8 + 1(carry)
SUB R0, R1, #8 // R0 = R1 - 8
SBC R0, R1, #8 // R1 = 0x2000 -> R0 = 0x2000 - 0x8 - 0(~carry)
RSB R0, R1, #8 // R0 = 8 - R1
RSC R0, R1, #8 // R1 = 0x2000 -> R1 = 0x8 - 0x2000 - 0(~carry)
1.3. Bit Shift
- LSL: Logical Shift Left
- LSR: Logical Shift Right
- ASR: Arithmetic Shift Right
- ROR: Rotate Right
LSL R0, R1, #2 // R0 = R1 << 2
LSR R0, R1, #2 // RO = R1 >> 2
ASR R0, R1, #2 // R0 = R1 >>> 2
ROR R0, R1, #2 // RO = right rotate R0 for twice
1.4. Bitwise
- ADD: and
- ORR: or
- ORN: or not
- EOR: excusive or
- BIC: bit clear
AND R0, R0, #0X123 // R0 = R0 & #x123
ORR R0, R0, #0X123 // R0 = R0 | 0x123
ORN R0, R0, #0X123 // R0 = R0 | ~0x123
EOR R0, R0, #0X123 // R0 = R0 ^ 0x123
BIC R0, R0, #0X123 // R0 = R0 & ~0x123
2. Memory
2.1. Load
메모리에 있는 데이터를 레지스터에 저장
- LDR: 32bit
- LDRH: 16bit zero-extended
- LDRSH: 16bit sign-extended
- LDRB: 8bit zero-extended
- LDRSB: 8bit sign-extended
LDR R0, [R1] // R0 = MEM[R1]
LDR R0, [R1, #8] // R0 = MEM[R1 + 8]
2.2. Store
메모리에 있는 데이터를 레지스터에 저장
- STR: 32bit
- STRH: 16bit
- STRB: 8bit
STR R0, [R1] // MEM[R1] = R0
STR R0, [R1, #8] // MEM[R1 + 8] = R0
3. ARMv7-A32 Compare & Branch
3.1. Set Condition Flag
CPSR.{N, Z, C, V}를 설정
- CMP: 두 피연산자의 뺄셈 결과에 따라 flag 설정
- CMN: 두 피연산자의 덧셈 결과에 따라 flag 설정
- TST: 두 피연산자의 AND 결과에 따라 flag 설정
- TEQ: 두 피연산자의 XOR 결과에 따라 flag 설정
3.2. Condition Code & Suffix
CPSR.{N, Z, C, V}에 따라 동작 수행 여부 결정

3.3. B & BL
- B (offset): offset으로 지정된 주소로 분기
- BL (offset): offset으로 지정된 주소로 분기하면서 링크 레지스터 업데이트
- BR <Rt>: <Rt>로 분기
- BLR <Rt>: <Rt>로 분기하면서 링크 레지스터 업데이트
4. ARMv8-A64 Conditional Branch
4.1. B.COND
PSTATE.{N, C, C, V}에 따라 분기 여부 결정
Condition Code 참조
4.2. Compare & Test Branch
CBZ Rt, <label>: Rt == 0이면 <label>로 분기, 아니면 PC+4로 이동
CBNZ Rt, <label>: Rt != 0이면 <label>로 분기, 아니면 PC+4로 이동
TBZ Rt, bit, <label>: Rt[bit] == 0이면 <label>로 분기, 아니면 PC+4로 이동
TBNZ Rt, bit, <label>: Rt[bit] != 0이면 <label>로 분기, 아니면 PC+4로 이동
5. Trap
5.1. SVC (Supervisor Call)
user application에서 kernel로 진입 (system call)
- ARMv7: User → Supervisor
- ARMv8: EL0 → EL1
5.2. HVC (Hypervisor Call)
kernel에서 hypervisor로 진입
- ARMv7: Supervisor → Hypervisor
- ARMv8: EL1 → EL2
5.3. SMC (Secure Monitor Call)
trust zone에서 활용되며, non-secure world와 secure world의 스위칭 시 사용
6. Processor State Control
6.1. CPSR, SPSR set
- MRS <Rt> xPSR: <Rt> ← xPSR
- MSR xPSR_<field> <Rt>: xPSR_<field> ← <Rt>
- c: [7:0]
- x: [15:8]
- s: [23:16]
- f: [31:24]
MSR CPSR_c R0
MSR SPSR_fsxc R0
6.2. PSTATE set
- MSR DAIFSet, <Xt>: PSTATE.DAIF |= <Xt>
- MSR DAIFClr, <Xt>: PSTATE.DAIF &= ~<Xt>