어셈블러

어셈블러(Assembler)는 어셈블리어로 작성된 명령어·지시문과 레이블을 특정 명령어 집합 아키텍처의 기계 명령·오브젝트 파일로 변환하는 프로그램이다. 컴파일러가 고수준 언어를 어셈블리 소스로 출력하는 경우 그 결과를 받아 실행 가능한 프로그램을 만드는 도구 체인의 한 단계가 된다....

영어 명칭Assembler
분류시스템 소프트웨어, 저수준 코드 변환 도구
입력어셈블리어 소스 코드
출력오브젝트 파일·기계 코드
관련 기술링커, 로더, 기계어
주요 구현GNU as(GAS), NASM, MASM, LLVM Integrated Assembler
대상 플랫폼x86·ARM·RISC-V 등 ISA별
주요 기능명령어 인코딩·심벌·재배치·섹션
오브젝트 포맷ELF, COFF, Mach-O 등 대상별
공식 참조GNU as Manual
LLVM 구현LLVM MC

어셈블러(Assembler)는 어셈블리어로 작성된 명령어·지시문과 레이블을 특정 명령어 집합 아키텍처의 기계 명령·오브젝트 파일로 변환하는 프로그램이다. 컴파일러가 고수준 언어를 어셈블리 소스로 출력하는 경우 그 결과를 받아 실행 가능한 프로그램을 만드는 도구 체인의 한 단계가 된다. 어셈블리어는 저수준 프로그래밍 언어이고 어셈블러는 그 언어를 번역하는 소프트웨어이므로 같은 문서로 합치면 개념이 혼동된다.[1]

어셈블러는 소스 파일의 명령어·피연산자와 레지스터를 구문 분석한 뒤 CPU가 이해하는 명령어 바이트로 인코딩한다. 동시에 코드·데이터 섹션과 심벌 테이블, 레이블의 주소를 처리한다. 외부 함수나 다른 파일의 데이터가 참조되면 재배치 항목을 만들어 링커가 최종 위치를 정하도록 한다. 따라서 오브젝트 파일 생성과 최종 실행 파일의 링크는 서로 다른 작업이다.

GNU as, NASM, MASM, FASM 및 LLVM 통합 어셈블러는 모두 어셈블리 문장을 처리하지만 문법·매크로·지시문과 지원 오브젝트 형식·대상 CPU가 다르다. AT&T·Intel 구문을 같은 아키텍처에서 병행하는 경우도 있으며 CPU 확장 명령의 지원 여부는 도구 버전에 영향을 받는다. 한 ISA용 소스를 다른 ISA에 어셈블하는 과정은 단순 문법 변경만으로 해결되지 않는다.

일부 어셈블러는 전처리·매크로·조건부 어셈블이나 자체 링커·오브젝트 작성 기능을 포함한다. 통합 어셈블러는 LLVM처럼 컴파일러 백엔드와 기계 명령 인코딩 계층을 공유할 수 있다. 그러나 도구가 여러 기능을 하나로 제공하더라도 내부적으로 코드 생성·재배치·링킹의 구분이 사라지는 것은 아니다.[2]

어셈블러는 부트로더·커널과 펌웨어, JIT 코드 생성, 운영체제의 시스템 호출 진입점과 ABI 구현에서 자주 사용된다. 명령어 인코딩과 레지스터·정렬 및 재배치 제약을 정확히 적용해야 하며, 소스의 오류가 기계 코드의 잘못된 동작으로 이어질 수 있다. 아키텍처별 명령어 사양과 오브젝트 파일 표준은 어셈블러 구현의 중요한 기준이다.

역사

개발 배경과 설계

주요 구성 요소

프로그램 분석과 중간 표현

명령어·코드 생성

지원 플랫폼과 언어

빌드·개발 도구

라이선스와 공동체

장점과 한계

영향

관련 문서

  1. GNU Assembler Manual ↩
  2. LLVM MC subsystem ↩