티스토리 뷰

Embedded

ARM 기초 공부

Tribal 2016. 5. 17. 18:54

ARM(Advanced Risc Machine) : RISC 방식의 32비트 명령어를 사용


ARM 아키텍쳐와 프로세서의 종류

 아키텍쳐

프로세서 

 v4

 ARM7TDMI, ARM720T, ARM940T, ARM920T, ARM922T

v5TE 

 ARM946E-S, ARM926E-S, Xscale

 v5TEJ

 ARM926EJ-S

 v6

 ARM1136JF-S

 v7

 Cortex A, M, R

  • T :Thumb (ARM을 16bit로 자주 사용하는 명령어만 압축한 형태)
  • D: Debug Port(JTAG)
  • M : 8비트 곱셈기
  • I : Break Point나 Watch Point 설정 가능, 'D'와 같이 사용
  • -E : DSP 연산 명령어 추가 (연산을 빠르게 처리)
  • -S : VHDL, Verilog로 회로도가 제공
  • -J : Java Byte Code 해석 가능

ARM 동작 모드

 Mode

설명 

 Supervisor(SVC)

 Reset이나 SWI 명령이 실행될 때, OS를 위한 모드

 Privileged Mode(권한 모드)

 FIQ(Fast Interrupt reQuest)

 Fast Interrupt 요청이 들어왔을 때,
 가장 빠르게 처리되어야 할 인터럽트(우선순위가 높은)

 IRQ(Interrupt ReQuest)

 일반 Interrupt 요청이 들어왔을 때,
 일반적인 프로세서의 인터럽트와 같음

 Abort

 데이터나 명령어 인출(fetch)에 실패할 때 ,
 데이터를 읽거나 쓸 때, 메모리 시스템이 읽거나 쓸 수 없는 경우

 Undefined

 명령어를 인출(fetch)했으나, 정의되지 않은 명령어일 때 

 System

 User 모드와 같지만, 특권 모드, 주로 OS Kernel에서 사용

 User

 응용프로그램이나 OS 실행할 때 

 Unprivieged Mode

권한 모드에서는 Interrupt의 사용유무를 설정가능, 권한 모드에서는 서로 변경이 자유롭지만, 권한이 없는 모드는 변경이 불가능


ARM 레지스터

  • R0 ~ R10 : 범용 레지스터, 일반 연산 및 임시 저장 장소 등으로 사용
  • R11 : Current Stack Frame Pointer, 현재 함수의 프레임 포인터
  • R12 : Intra-Procedure call Scratch Register, 임시 데이터를 저장하는 서브루틴에 사용됨(결론 : 골 때리는 레지스터)
  • R13 : Stack Pointer(SP), 동작 모드 별로 별도 존재
  • R14 : Link Register(LR), 함수 호출 시 리턴될 주소를 가지고 있음, 스택에 넣는 것보다 빠름
  • R15 : Program Counter(PC), 다음에 실행될 명령어를 가지고 메모리로부터 가지고 옴
  • CPSR : Program Status Register(CPSR), 각 모드마다 하나씩 존재하며 모드가 변경될 때마다 변경되기 전의 CPSR이 SPSR에 저장됨

ARM 32bit 명령어 구문

 구분

명령어 

 분기 명령

 B, BL 

 데이터 연산 명령

 ADD, ADC, SUB, SBC, RSB, RSC, AND, ORR, BIC, MOV, MVN, CMP, CMN. TST, TEQ

 Multiply 명령

 MUL, MLA, SMULL, SMLAL, UMULL, UMLAL

 Load/Store 명령

 LER, LDRB, LDRBT, LDRH, LDRSB, LDRSH, LDRT, STR, STRB, STRBT, STRH, STRT 

 Load/Store Multiply 명령

 LDM, STM 

 Swap 명령

 SWP, SWPB 

 Software Interrupt 명령

 SVC (기존 SWI에서 변경) 

 Co-Processor 명령

 MRC, MCR, LDC, STC 

 Branch Exchange 명령

 BX 

 ...

 기타 등등... 


ARM은 메모리 내에 직접 데이터를 쓰거나, 가져올 수 없어 특정 명령을 통해 메모리 값을 레지스터에 가져오거나, 레지스터 값을 메모리에 써야 함(LDR, STR 명령어 사용)

사용 예제

ADD R0, R1, R2 - R1과 R2를 더하여 R0에 저장

SUBEQ R0, R1, #8 - EQ조건이면, R2에서 8을 빼 R0에 저장하고, 결과에 따라 CPSR Flag 설정

BICLE R1, R2, R0 - LE조건이면, R2와 R0를 XOR하고 결과를 R1에 저장

BL - Somewhere로 분기, LR에 돌아올 주소 저장하고 복귀할 때는 MOV PC, LR 사용 (함수 호출에 사용)

B - Somewhere로 분기

LDR R1, [R2, R3] - R2+R3 위치에서 데이터를 워드만큼 읽어서, R1에 저장

LDR R1, [R2, R3]! - R1 저장 후, R2의 값은 R2+R3로 변경

LDR R1, [R2], #4 - R2에서 워드만큼 읽어서 R1에 저장 후, R2+4로 R2를 변경

LDR R1, =0xdeadbeef - 데이터 0xdeadbeef를 R1에 저장

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31