c++/기초

어셈블리 단계

코드망령 2026. 5. 20. 09:10

어셈블리 단계 (Assembly)

컴파일 단계에서 생성된 어셈블리 코드를 실제 CPU가 실행 가능한 기계어(바이너리 코드)로 변환하는 과정

  • 어셈블리 코드를 기계어로 변환함
  • 오브젝트 파일(.o, .obj) 생성
  • 심볼 테이블(Symbol Table) 생성
  • 재배치 정보(Relocation) 생성

어셈블러 (Assembler)

어셈블리 코드를 기계어로 변환하는 프로그램

어셈블리어 → 기계어

변환 수행


어셈블러의 역할

  • 어셈블리 명령어를 CPU 아키텍처에 맞는 기계어로 변환
  • 코드와 데이터를 섹션 단위로 분리
  • 심볼 테이블 생성
  • 재배치 정보 생성

섹션 (Section)

오브젝트 파일 내부에서 코드와 데이터를 구분하는 영역

섹션 역할
.text 실행 코드 저장
.data 초기화된 전역 변수 저장
.bss 초기화되지 않은 전역 변수 저장
.rodata 읽기 전용 데이터 저장

심볼 테이블 (Symbol Table)

함수와 변수 정보를 저장하는 테이블

예시:

void Attack()
{
}

심볼:
Attack

오프셋 (Offset)

어셈블리 단계에서는 아직 실제 메모리 주소가 정해지지 않음

  • 아직 링크 단계가 끝나지 않았고
  • 프로그램이 메모리 어디에 배치될지도 모르기 때문

 

그래서 함수나 변수의 위치를 실제주소 대신 섹션 내부 기준 상대 위치에 저장함

 

이 상대 위치 값을 오프셋(Offset)이라고 함


예시

.text 섹션

0byte  : Move()
20byte : Attack()
50byte : Jump()

여기서 Attack()의 오프셋은: 20byte (.text 시작 기준 +20byte 위치)

 


이후 링크 단계

링커가 실제 .text 시작 주소를 결정한 뒤:

실제 주소 = 섹션 시작 주소 + 오프셋

형태로 최종 주소를 계산함


재배치 정보 (Relocation)

외부 함수나 다른 파일의 변수를 사용할 경우 실제 주소를 아직 알 수 없음

예시:

extern void Attack();

Attack();

현재는 Attack()의 실제 주소를 모르기 때문에:

"나중에 실제 주소로 수정 필요"

라는 정보를 저장함

이를 재배치 정보(Relocation)라고 함


오브젝트 파일의 구성 요소

어셈블리 단계에서 생성된 오브젝트 파일에는:

구성 요소 설명
기계어 코드 CPU 실행 코드
섹션 정보 .text, .data
심볼 테이블 함수/변수 이름 정보
재배치 정보 나중에 주소 수정이 필요한 위치

 


특징

  • 오브젝트 파일은 아직 실행 파일이 아님
  • 실제 메모리 주소가 확정되지 않은 상태
  • 외부 심볼 연결도 아직 완료되지 않음
  • 이후 링크(Link) 단계에서 최종 연결 수행

핵심 요약

  • 어셈블리 단계는 어셈블리어를 기계어로 변환하는 과정
  • 결과로 오브젝트 파일(.o, .obj) 생성
  • 오브젝트 파일에는 기계어뿐 아니라 심볼 테이블과 재배치 정보도 포함됨
  • 실제 주소 연결은 아직 완료되지 않은 상태
  • 이후 링크 단계에서 최종 실행 파일로 연결됨

'c++ > 기초' 카테고리의 다른 글

자료형  (0) 2026.05.22
운영체제  (0) 2026.05.21
링크 단계  (0) 2026.05.20
심볼과 심볼 테이블  (0) 2026.05.20
컴파일 단계  (0) 2026.05.20