1️⃣ 어셈블리 언어 개발 환경 준비 - SASM 설치 및 기본 세팅
✔️ SASM이란?
- SimpleASM의 약자.
- NASM, MASM, GAS, FASM을 지원하는 무료 오픈소스 크로스 플랫폼 통합 개발 환경(IDE).
- 개발자가 편하게 어셈블리 언어 코딩/컴파일/디버깅까지 할 수 있는 툴.
- 개발자: Dmitriy Manushin (Dman95)
- 기본적으로 간단한 입출력 매크로 라이브러리도 포함되어 있음.
✔️ 설치 방법

✔️ SASM 기본 세팅 방법
| 설정 항목 | 값 |
|---|
| Mode | x64 (64비트) |
| Assembler | NASM |
| Linker | ld |
✔️ 단축키 정리
| 작업 | 단축키 |
|---|
| 새 프로젝트 생성 | Ctrl + N |
| 실행 파일 만들기 | Ctrl + Shift + E |
| 빌드 & 실행 | F9 |
| 디버그 실행 | F5 |
2️⃣ "Hello World" 예제
%include "io64.inc"
설명
- 외부 매크로 라이브러리
io64.inc 포함.
io64.inc는 SASM과 함께 제공되는 입출력 매크로 모음 파일.
- 이 파일 덕분에
PRINT_STRING 같은 명령을 바로 쓸 수 있음.
- 꼭 필요한 부분이므로, 어셈블리 프로그램 작성 시 습관적으로 포함해주면 좋다.
section .text
설명
- 실행 코드가 저장되는 섹션을 정의.
section .text 안에 프로그램의 명령어(Instruction)가 들어감.
- CPU가 직접 해석하고 실행하는 코드는 전부 여기에 작성됨.
global CMAIN
설명
CMAIN이라는 라벨을 전역 심볼로 정의.
- 링커에게 프로그램의 진입점이
CMAIN임을 알려줌.
- C 언어에서
main 함수처럼 프로그램 시작점 역할.
- SASM에서는 기본적으로
CMAIN이 진입점으로 쓰임 (일부 환경에선 main 대신 CMAIN)
CMAIN:
설명
- 실제 프로그램 실행이 시작되는 레이블.
- 이 아래부터 프로그램이 수행할 명령어들이 순서대로 작성됨.
- 반드시 진입점과 일치해야 하며,
CMAIN:이라고 정확히 써줘야 함.
;write your code here
설명
- 주석(Comment). 세미콜론(
;) 이후는 설명문.
- 어셈블리 주석은 개발자가 참고하는 용도로 작성.
- 여기서는 "이곳에 코드를 작성하세요"라는 가이드라인.
PRINT_STRING msg
설명
- 문자열 출력 매크로.
PRINT_STRING은 io64.inc에 정의된 매크로.
- 뒤에 오는
msg 레이블이 가리키는 문자열을 화면에 출력.
- 고급 언어의
printf("Hello World!")와 비슷한 역할.
xor rax, rax
설명
rax 레지스터를 0으로 초기화하는 명령.
xor은 자기 자신과 XOR 연산을 하면 결과가 무조건 0이 되는 성질을 이용.
mov rax, 0보다 짧고 빠른 방법.
- 함수 종료 시 반환값으로 0을 의미하는 관례적인 처리 (성공적 종료 의미).
ret
설명
- 함수 종료 명령어.
- 현재 함수(
CMAIN)를 종료하고, 호출자(운영체제 또는 다른 프로그램)로 복귀.
- 프로그램 종료 역할.
section .data
설명
- 데이터 영역을 정의.
- 프로그램 실행 중 사용할 초기화된 데이터(상수, 문자열 등)를 저장.
- 주로 출력할 문자열이나 프로그램이 참조할 상수값을 여기에 저장.
msg db "Hello World!", 0x00
설명
msg라는 이름의 문자열 데이터 정의.
db는 define byte의 약자. 한 바이트씩 데이터 저장할 때 사용.
"Hello World!" 문장을 문자 하나하나 아스키코드로 저장.
- 마지막
0x00은 널 종료 문자(null terminator)로, 문자열 끝을 표시.
3️⃣ 전체 흐름 요약
| 단계 | 설명 |
|---|
| 1 | 외부 라이브러리(io64.inc) 포함 |
| 2 | 코드 섹션(text) 시작 |
| 3 | 진입점(CMAIN) 전역 정의 |
| 4 | 프로그램 실행 시작점(CMAIN 레이블) 정의 |
| 5 | 문자열 출력 명령 실행 |
| 6 | 프로그램 정상 종료 처리(xor rax, rax 후 ret) |
| 7 | 데이터 섹션 정의 및 출력할 문자열 준비 |
4️⃣ 최종 완성 코드 정리
%include "io64.inc"
section .text
global CMAIN
CMAIN:
; 여기에 코드를 작성합니다.
PRINT_STRING msg ; msg 문자열 출력
xor rax, rax ; 반환값 0 설정 (정상 종료 의미)
ret ; 프로그램 종료 및 복귀
section .data
msg db "Hello World!", 0x00 ; 출력할 문자열 정의 (널 종료 포함)
5️⃣ 추가 개념 정리 - 실행 파일 구조 & 메모리 구조
| 구성요소 | 설명 |
|---|
| text 섹션 | 실행 코드 저장 |
| data 섹션 | 초기화된 데이터 저장 |
| bss 섹션 | 초기화 안 된 데이터 저장 |
| stack | 함수 호출 시 지역 변수 및 복귀 주소 저장 |
| heap | 동적 할당 메모리 영역 |
6️⃣ 컴퓨터 데이터 흐름 - 프로그램 실행 과정
- 하드디스크에서 실행 파일 로드
- 메모리로 복사 (로드)
- CPU가 명령어 읽고 실행
- 결과 출력 (I/O 장치로 전달)