728x90
📢 assembly 파일 분석을 위해 구조 및 주요 문법을 알아봐요
1. 코드의 시작점 (ENTRY(_start))
.section .text
.global _start
_start:
b reset_handler
Linker Script에 ENTRY(_start) 을 적어 프로그램의 진입점을 지정해요
_start는초기 PC로 점프되는 주소죠.
2. 벡터 테이블 구조 이해
인터럽트마다 핸들러를 등록하는 구조로 weak symbol과 b . 같은 무한 루프를 기본 값으로 두기도 해요
.section .vector_table
.word _start // Reset
.word nmi_handler // NMI
.word hardfault_handler
...
3. 스택 포인터 초기화
ldr sp, =_stack_top
초기화 코드에서 가장 먼저 수행돼요
_stack_top은 링커 스크립트에 정의되어 있어야 하죠
4. 데이터 초기화 (.data, .bss 섹션 처리)
ROM(Flash)에서 RAM으로 .data(초기값 있는 전역/정적 변수)복사
ldr r0, =_sdata // RAM 목적지 시작
ldr r1, =_edata // RAM 목적지 끝
ldr r2, =_sidata // ROM의 복사본 시작
copy_data:
cmp r0, r1
ittt lt
ldrlt r3, [r2], #4 // ROM에서 값 읽고
strlt r3, [r0], #4 // RAM에 저장
blt copy_data
RAM에 .bss(초기값이 없는 전역/정적 변수) 로드하며 0으로 초기화
ldr r0, =_sbss // RAM 시작 주소
ldr r1, =_ebss // RAM 끝 주소
movs r2, #0
clear_bss:
cmp r0, r1
itt lt
strlt r2, [r0], #4
blt clear_bss
5. main 진입 전 초기화 흐름
SystemInit()은 클럭 설정, MPU 초기화 등 시스템 레벨 설정을 담당해요
main으로 진입한 후 b .(무한루프)를 통해 종료를 방지해요
bl SystemInit
bl main
b .
6. 분석 순서
보통 위에서 아래로 순차적으로 명령어들을 분석하면 돼요
- assembly 코드는 분기가 없다면 label 상관 없이 그냥 다음 줄이 실행되죠
- 조건 분기나 점프 명령이 없다면 label은 아무 의미 없어요 그냥 전부 실행해요
7. label
일반 레이블
이 경우 흐름은: start → init (복귀) → main_loop → main_loop → …
start:
bl init
b main_loop
init:
...
bx lr
main_loop:
...
b main_loop ; 무한루프
숫자 레이블 (1:, 2: 등) 이해하기
1:
cmp r0, r1
bne 1b ; ← 이전 1:으로 분기
...
2:
b 2f ; ← 다음 2:로 분기
- 1b → "가장 가까운 이전의 1: 레이블"
- 2f → "가장 가까운 다음의 2: 레이블"
🔁 loop나 조건 분기할 때 매우 자주 써요
이 정도 지식을 숙지하고 assembly 코드를 분석하면 더 많은 의미를 느낄 수 있어요!
728x90
'TIL > 2025' 카테고리의 다른 글
| Overview of Armv8-R AArch32, Cortex-R52 (1) | 2025.04.28 |
|---|---|
| 나만의 C++ 문자열 클래스 만들기, GuString (0) | 2025.04.24 |
| 멀티코어 환경 section offset 기반 복사 & 재매핑 패턴 (0) | 2025.04.24 |
| 링커 스크립트 분석 5단계 (0) | 2025.04.24 |
| 주요 Compile Extension & Builtin Function 예시를 알아보자 (1) | 2025.04.23 |