FASM

FASM (Flat Assembler) – 어셈블러

FASM은 이진 실행 파일을 직접 생성할 수 있는 고성능 어셈블러로, 주로 x86 및 x86‑64 아키텍처용으로 사용된다. 2000년 초기 버전이 발표된 이래, Pascal 계열 언어인 Flat Assembler라는 이름처럼 간결하고 직관적인 문법을 제공하며, 소스 코드를 한 번에 전체 컴파일하는 단일 패스 방식을 채택한다.

주요 특징

구분 내용
지원 플랫폼 Windows, Linux, macOS (POSIX 호환 시스템)
지원 아키텍처 x86 (16/32‑bit), x86‑64 (64‑bit)
라이선스 자유 소프트웨어·BSD‑style 라이선스 (소스 공개)
컴파일 방식 단일 패스(One‑pass) 어셈블, 직접 바이너리 생성
문법 MASM, NASM 등과 유사하지만 자체적인 매크로 시스템과 고유 지시어 제공
디버깅 외부 디버거(gdb, OllyDbg 등)와 연동 가능, 독자적인 디버깅 도구 제공 (fasmdbg)
출력 포맷 PE, ELF, COFF, Mach‑O 등 다양한 실행 파일 포맷 지원

역사와 개발

  • 2000년: 플레어 소프트웨어(FlaSh)은 독립 개발자 Alexei Shevchenko에 의해 최초 버전이 공개되었다. 당시 16‑bit 실모드 어셈블러로 시작했으며, 이후 32‑bit, 64‑bit 지원으로 확장되었다.
  • 2002~2005년: Windows와 Linux용 공식 바이너리 배포가 시작되었으며, 커뮤니티가 활발히 매크로 라이브러리와 예제 코드를 공유했다.
  • 2008년: 다중 플랫폼 지원을 강화하기 위해 소스 코드가 완전 이식성 C로 재작성되었다.
  • 2015년: 공식 홈페이지에 최신 버전(1.73b)이 릴리스되었으며, 마이크로소프트의 PE 포맷과 GNU의 ELF 포맷 모두 완전 지원한다.

사용 예시

; 간단한 32‑bit Windows Hello World 프로그램
format PE console
entry start

section '.data' data readable writeable
    msg db 'Hello, World!',13,10,0

section '.code' code readable executable
start:
    ; Windows API WriteConsoleA 호출
    push    dword len msg
    push    dword msg
    push    dword -11          ; STD_OUTPUT_HANDLE
    call    [WriteConsoleA]

    ; 프로세스 종료
    push    0
    call    [ExitProcess]

section '.idata' import data readable
library kernel32,'KERNEL32.DLL'
import kernel32,\
    ExitProcess,'ExitProcess',\
    WriteConsoleA,'WriteConsoleA'

위 코드는 FASM의 format 지시어를 이용해 PE 실행 파일을 직접 생성하고, Windows API를 호출한다.

장점 및 단점

  • 장점

    • 속도: 단일 패스 어셈블러이므로 대규모 프로젝트에서도 빠른 컴파일이 가능하다.
    • 직접 바이너리 생성: 링커가 필요 없으며, 파일 헤더와 섹션을 직접 제어할 수 있다.
    • 가벼움: 실행 파일 크기가 작고, 설치가 필요 없는 포터블 형태로 배포할 수 있다.
  • 단점

    • 학습 곡선: 매크로와 섹션 정의 등 고급 기능을 활용하려면 어셈블리 언어에 대한 깊은 이해가 필요하다.
    • IDE 지원 제한: 전용 IDE가 없으며, 일반 텍스트 편집기와 명령줄 빌드에 의존한다.

관련 툴 및 자료

  • 공식 사이트: https://flatassembler.net/ (다운로드, 문서, 예제 코드)
  • 매뉴얼: fasm.doc – 전체 지시어와 매크로 시스템을 상세히 설명
  • 커뮤니티: Reddit r/asm, Stack Overflow, FASM 포럼 등에서 다양한 활용 사례와 라이브러리를 공유

요약

FASM은 고성능, 이식성, 그리고 직접 바이너리 생성을 목표로 설계된 무료 어셈블러이다. 단일 패스 방식과 풍부한 매크로 시스템 덕분에 시스템 프로그래밍, 부트로더 제작, 고성능 게임 엔진 등 저수준 개발에 널리 활용되고 있다.

둘러보기

더 찾아볼 만한 주제