TIL/2025

assembly 파일 분석 방법

고무 오리 2025. 4. 24. 12:08
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