티스토리 뷰
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에 저장됨
구분 |
명령어 |
분기 명령 |
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에 저장
'Embedded' 카테고리의 다른 글
ARM환경 ELF의 PLT, GOT 모습 (0) | 2016.08.18 |
---|---|
라즈베리파이3 세팅 ~ OS설치 및 업데이트 (2) | 2016.08.16 |
Windows QEMU 및 라즈베리 파이 간편 설치 - 구버전 (0) | 2016.07.16 |
ARM QEMU 설치 (0) | 2016.07.06 |
ARM 리버스 Shellcode (0) | 2016.05.17 |