[Arm 아키텍처의 구조와 원리] Assembly Instruction

Merry Berry·2023년 7월 15일
0

ARM Architecture

목록 보기
2/2
post-thumbnail

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>

0개의 댓글