ARM Register 구성
- 범용 레지스터 (GPR) : General Purpose Register
- R0 - R12
- 특수 레지스터 (SPR) : Special Purpose Register
- R13 (SP): Stack Pointer register
- R14 (LR): Link Register
- R15 (PC): Program Counter
- CPSR: 상태 레지스터
ARM Assembly 특징
- 첫 operand는 반드시 레지스터 이름이어야 한다.
- immediate는 상수 앞에 “#”을 붙인다.
- 단, LDR 명령어에서만은 예외적으로 “=’를 사용한다.
- 간접 참조는 “[ ]” 를 사용한다.
- 다른 ISA에 비해 비교적 간단.
- x86처럼 push, pop이 없어서 RISC-V 처럼 SP를 일일이 계산해줘야 한다.
- ARM은 RISC-V 처럼 32 비트의 고정된 명령어 길이를 갖는다.
MOV
- 데이터 이동에 MOV명령이 사용된다.
- cf. MOV stands for Move.
- 단, 메모리 Load/Store 연산에도 MOV가 사용되는 x86과는 달리 레지스터 사이나 Immediate 연산에서만 사용된다.
ex)
- MOV R0, R1 : R1의 값을 R0에 저장
- MOV R0, #23 : immediate 23을 R0에 저장
- immediate는 **#**으로 명시한다.
LDR
- 메모리에서 레지스터로 데이터를 가져오는 로드 연산
- cf. LDR stands for Load to Register
- 레지스터에 immediate 값을 저장할 때도 사용
- cf. MOV보다 큰 범위의 immediate 값을 명시할 때 , # 대신 **=**가 사용
- ex)
- LDR R0, = 0x1234: immediate 0x1234 값을 R0에 저장
STR
- 레지스터 값을 메모리에 저장하는 Store 연산
- cf. STR stands for Store
Indirect Addressing Mode
- ARM 주소 지정 모드 중 간접 주소 지정이 존재
- [ ] 를 사용한다.
- C언어 포인터에 사용되는 간접 지정 연산자(*)와 비슷
ex)
- STR R0, [R1]: R1에 저장되어 있는 값을 주소로서 참조한 메모리 공간에 R0 값을 저장
- LDR R0, [R1]: R1에 저장되어 있는 값을 주소로서 참조한 메모리 공간에 존재하는 값을 R0으로 로드
- LDR R0, [0x1234] 은 사용 불가
Base Plus Offset
Post-indexing
- base 로 명령어 실행 후 base에 offset 을 더하여 base 를 갱신
- LDR R0, [R1], #4: R1 주소에 있는 값을 R0으로 로드 후 R1 값에 +4를 수행
- LDR R0, [R1], R3, LSL #2: R1주소에 있는 값을 R0으로 로드 후 R3의 값에 2번 왼쪽 시프트를 한 값을 더하기 수행
- ex)
Pre-indexing
- 명령어를 실행하기 전 base에 offset을 더하는 방식
- base 값은 갱신하지 않는다.
- LDR R0, [R1, #4]: R1 + 4 주소에 있는 값을 R0으로 로드 수행
- ex)
Auto-indexing
- Pre-indexing과 동일하지만, base 값을 갱신한다는 점이 다름
- Pre-indexing 명령어 뒤에 ! (suffix)를 붙여서 사용
- LDR R0, [R1, #4]!: R1 + 4 주소에 있는 값을 R0으로 load하고, R1 값은 갱신한다.
- ex)
ADD
- ADDS처럼 suffix s가 붙은 명령은 동일하게 동작하지만, ARM 프로세서의 모드를 바꾼다.
- ADD R0, R1, R2: R0 = R1 + R2
- ADD R0, R1, #128 ; R0 = R1 + 128
- ex)
SUB
SUB R0, R1, R2: R0 = R1 - R2
SUB R0, R1, #128: R0 = R1 - 128
Data Types in ARM Core
- Byte: 8 bits
- Halfword: 16 bits
- Word: 32 bits
- Doubleword: 64 bits
Processor registers are 32 bits in size.
Declaration
keyword bytes
.byte | 1 |
.hword | 2 |
.word | 4 |
.quad | 8 |
.octa | 16 |
'임베디드' 카테고리의 다른 글
V4L2 (Video 4 Linux 2) (0) | 2025.02.26 |
---|---|
Basic #1 (0) | 2024.08.26 |
SocketCAN (0) | 2024.04.22 |
ALSA (0) | 2023.12.21 |
Automotive SPICE (업데이트 中) (0) | 2023.06.20 |