이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Embedded] ARM Assembly

  • 2026.05.10 14:13
  • Computer Science/Embedded Software
반응형

 

 

 

ARMv4 시절 32비트 ARM은 명령어 하나하나가 4바이트라 임베디드 환경에서 너무 무거웠다.

그래서 Thumb이 나왔지만 표현력이 부족해 자주 32비트 ARM 모드로 돌아가야 했고, 그 때 마다 ISA를 갈아끼우는 비용이 발생함.

 

Thumb-2에서는 단일 ISA에서 16비트와 32비트를 혼합해서 해결한다. (Instruction Set Architecture)

모드 전환이 사라지고, 컴파일러가 알아서 적절한 크기를 고름.

그리고 Cortex-M4에서는 Thumb-2를 사용하기에 ARM ISA같은 모든 명령어 조건부 실행이 불가능. IT 블록으로 흉내낸다.

 

프로세서의 레지스터는 모두 32비트이다. (R0 ~ R15)

즉, 8비트나 16비트를 다룰 때도 32비트 레지스터에 담기게 된다. 

 

그러니 남는 공간이 생길 수밖에 없고, 0으로 채우거나 부호 비트로 채우는 방법을 선택한다.

64비트는 두 레지스터로 나눠서 보관한다. (R0 + R1 페어를 사용)

 

 

 

 

 

Mnemonic 자리에는 명령어나 Directive가 둘 다 위치할 수 있는데, 명령어는 CPU가 런타임에 실행하고 Directive는 어셈블러가 컴파일 시점에 처리한다. 

 

여기서 Directive는 어셈블러에게 전달하는 명령어가 아니다. 

AREA ENTRY END 등으로 구역을 정의하고, EQU DCB DCW DCD 등으로 값을 정의한다. (상수선언 8비트 16비트 32비트)

 

 

 

 

어셈블리 프로그래밍의 표준 구조는 다섯 단계로 구성됨.

section 정의 -> 진입점 선언 -> 실행 코드 -> 코드 실행 종료 -> 프로그램 종료 

EXPORT는 다른 파일에서 현재 심볼을 참조할 수 있도록 외부에 공개하는 Directive.

 

ELF section은 쪼갤 수 없는 영역으로, Code section / Data section / ZI section 으로 구분된다.

각각 명령어가 저장되는 곳, 초기값이 있는 전역변수, 초기값이 없는 전역변수를 의미함.

 

Thumb-2의 핵심은 16비트와 32비트의 혼합이다.

opcode 끝의 접미사를 통해 어떤 명령어가 어느 크기인지 결정함.

.N, .W, S 는 각각 16비트, 32비트, 플래그 갱신을 의미한다.

 

여기서 크기를 명시하는 명령어와 플래그를 갱신하는 명령어는 서로 독립적이니 함께 사용할 수 있음. 

CMP CMN TST TEQ 명령어는 자동으로 플래그를 갱신하니 S가 따로 붙지 않음에 주의. 

 

 

 


 

 

 

 

Cortex-M4의 모든 명령어는 6개의 카테고리로 묶인다.

 

1. Branch

CPU는 메모리의 명령어를위에서부터 아래로 읽으며 실행한다. 어디까지 읽었는지는 Program Counter 레지스터가 기억.

Branch는 이 흐름을 깨고 PC를 다른 곳으로 던진다. 어디로 점프할 지 알려주는게 중요함.

 

 

 

 

두 가지 방법이 있다. 코드에 점프 주소를 박아두거나, 레지스터에 들어있는 값을 사용하거나..

 

B는 그냥 점프 / BL은 LR에 리턴주소 저장하고 함수호출 / BLX는 Link와 Exchange 둘 다 수행

BL로 호출 후 BX LR로 리턴하는 구조를 사용한다. (BX는 레지스터 값으로 점프)

 

요점은 점프 주소를 어디서 받는지를 기준으로 두 가지로 구분되고, 명령어 이름의 글자가 추가 동작을 의미하는 것.

Exchange는 원래 ARM과 Thumb 간의 모드 교체에서 사용되는데, Cortex-M4는 Thumb 모드만 지원하니 검증 장치로 작동한다.

 

 

2. Data Processing

여기서부터는 C의 if 구문이 어셈블리에서 어떻게 구현되는지를 다룬다.

 

데이터 처리 명령어는 산술, 논리, 비교, 이동 으로 분류된다.

이 명령어들은 레지스터만 operand로 받고, 메모리에 직접 접근할 수 없다. 

비교 명령어는 자동으로 플래그를 갱신하니 CMPS 라는 명령어는 없음. (S는 기본)

 

<Operation>{<cond>}{S}  Rd, Rn, Operand2

- Operand2
ADD  R0, R1, R2              ; 일반 레지스터: Operand2 = R2
ADD  R0, R1, #5              ; 즉치값(immediate): Operand2 = 5
ADD  R0, R1, R2, LSL #2      ; 시프트된 레지스터: Operand2 = R2 << 2

 

 

문법에서 Operand2는 세 가지 형태로 올 수 있다.

x86이라면 Shift 한 번과 더하기 한 번으로 총 2개의 명령어가 필요하지만, ARM은 한 사이클에 끝난다.

 

 

 

 

 

Cortex-M4의 상태 레지스터는 위와 같이 구성됨. 여기서 S 접미사는 플래그를 갱신하고 다음 명령어의 조건으로 사용한다.

 

C언어의 if 구문을 구현하기 위해 비교가 필요하다 -> CMP TST 등 비교 명령어를 사용

비교 결과를 저장하기 위해 S 접미사가 활용된다 -> N / Z / C / V 플래그 사용 

플래그를 읽기 위해 조건 코드를 사용한다 -> EQ / NE / GT / LT 등 

조건에 따라 실행해준다. -> BEQ 분기 또는 IT 블록을 사용 (Cortex-M4는 IT 블록)

 

 

 


 

 

 

 

메모리와 레지스터 사이의 데이터 이동은 스택으로 일반화된다.

흐름은 단순함..

 

한 개 옮기기 (LDR / STR) ->

여러 개를 한 번에 옮기기 (LDM / STM) ->

자라나는 방향 설정 (IA / IB / DA / DB) ->

스택으로 일반화 -> Push / Pop (STMFD / LDMFD)

 

흐름을 쭉 따라가보자.

 

 

 

 

 

LDR은 Load Register, STR은 Store Register, R1은 주소로 해석하라는 의미 

레지스터는 32비트니까 메모리에서 byte나 halfword를 읽으면 나머지 비트는 0으로 채우거나 부호비트로 채운다.

 

STR 에는 Signed 변형이 없음. 어차피 하위 n비트만 잘라 쓰면 되니까..

Signed는 작은 값을 큰 레지스터에 넣을 때 필요한 작업이다.

 

함수 진입 시 R4~R11 여러 레지스터를 백업해야 할 때, 같은 코드를 8번 치지 않고 LDM / STM을 사용함.

 

 

 

명령어 차원에서는 네 가지로 구분된다.

 

Increment After : 저장 후 주소 증가

Increment Before : 주소 증가 후 저장 

Decrement After : 저장 후 주소 감소

Decrement Before : 주소 감소 후 저장 

 

이 네 가지는 스택과 매핑됨.

Stack Pointer가 어느 방향으로 자라는지, Stack Pointer가 어디를 가리키는지.

표를 보면 그게 다임.. 같은 명령어를 다른 관점에서 부르는 것. 그냥 STM과 LDM이 각각 4개씩 있다는 것.

표준은 STMDB = STMFD 

 

사실상 PUSH {R4-R11, LR} / POP {R4-R11, LR} 은 STMFD SP! / LDFMD SP! 의 별칭이다.

 

 

 


 

 

 

특수 레지스터는 일반 명령어로 다룰 수 없다. 그러니 MRS / MSR 같은 전용 명령어를 사용함.

xPSR, PRIMASK 같은 특수 레지스터는 R0~R15랑 다른 공간에 위치해 아무나 접근할 수 없음.

 

MRS는 Move from special Register to register이고 MSR은 Move to Special Register 이다. (두 번째 글자가 Destination)

평소 어셈블리에서는 거의 안 쓰지만, 컨텍스트 스위칭이나 부팅 코드에서는 자주 사용된다. (Privileged Mode 에서만 가능)

반응형
저작자표시 (새창열림)

'Computer Science > Embedded Software' 카테고리의 다른 글

[Embedded] General Purpose Input Output  (0) 2026.04.30
[Embedded] Interrupt  (0) 2026.03.31
[Embedded] Cortex-M4 Processor  (0) 2026.03.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Embedded] General Purpose Input Output

    [Embedded] General Purpose Input Output

    2026.04.30
  • [Embedded] Interrupt

    [Embedded] Interrupt

    2026.03.31
  • [Embedded] Cortex-M4 Processor

    [Embedded] Cortex-M4 Processor

    2026.03.18
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (695) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (154) N
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Data Science (8) N
      • Embedded Software (4) N
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
      • BlockChain (0)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (12)
    • 💬 기록 (9)
    • 📚 공부 (7)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / AXZ. Copyright © i3months.

티스토리툴바