Jooyoung Lee
기록 일지
Jooyoung Lee
  • 분류 전체보기 (27)
    • 임베디드 (9)
    • 딥러닝 (11)
      • ML (3)
      • Notions (4)
      • AI math (4)
      • 강의 리뷰 (0)
    • 논문 리뷰 (1)
    • 스터디 (1)
    • 컴퓨터 비전 (5)

블로그 메뉴

  • About me,
GitHub Contribution
Loading data ...
Jooyoung Lee

기록 일지

임베디드

ARM assembly

2025. 2. 20. 11:36

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
    '임베디드' 카테고리의 다른 글
    • V4L2 (Video 4 Linux 2)
    • Basic #1
    • SocketCAN
    • ALSA
    Jooyoung Lee
    Jooyoung Lee
    Embedded software engineer

    티스토리툴바