Assembly 실습 환경 설정 - SASM 기반 NASM 디버깅 입문
Windows 환경에서 NASM 어셈블리를 실습하려면 가장 쉬운 도구는 SASM입니다.
이 글에서는 SASM 설치 → Hello, world 예제 → 디버깅 방법 → 메모리/레지스터 분석까지
어셈블리 학습의 첫 실습 환경을 완벽하게 세팅하는 방법을 정리합니다.
1. SASM
SASM ( SimpleASM 의 약자 )은 NASM , MASM , GAS , FASM 어셈블리 언어를 위한 무료 오픈 소스 크로스 플랫폼 통합 개발 환경 입니다 . 구문 강조 기능과 디버거가 포함되어 있습니다.
1-1. SASM 설치하기
sasm 공식 홈페이지 : https://dman95.github.io/SASM/english.html
해당 홈페이지에 접속하여 설치파일 다운로드 후, 설치를 진행합니다.
1-2. SASM Setting

nasm x64 기준으로 진행 합니다.
설치 후, 설치 경로인 \SASM\Projects 폴더 안에 여러 예제를 테스트 할 수 있습니다.
File→Open 메뉴를 가보면 자동으로 \SASM\Projects 경로로 기본 설정 되어 있습니다.
NASM 위주로 학습을 진행할 예정이니, NASMHellox64.asm 를 살펴 봅시다.
1-3. NASMHellox64.asm
%include "io64.inc"
section .data
msg db 'Hello, world!', 0
section .text
global main
main:
mov rbp, rsp ; for correct debugging
PRINT_STRING msg ; print hello world
NEWLINE ; print newline
xor rax, rax ; set rax to 0
ret ; return
단축키 F9(Build and run)를 눌러 테스트를 진행할 수 있습니다.

단축키 F5(Debug)를 눌러보면

저처럼 memory와 registers를 볼 수 있도록
Debug→Show Memory, Show Registers 설정을 on으로 설정합시다!
1-4. 코드 흐름 살펴보기
%include "io64.inc"
io64.inc파일을 include 한다는 뜻.- 이 안에는
PRINT_STRING,NEWLINE같은 매크로(편의 함수)가 정의되어 있음. - 즉, 직접 WriteFile 같은 API 호출 안 해도 편하게 출력 가능하게 만든 것.
section .data
msg db 'Hello, world!', 0
.data섹션: 데이터를 정의하는 곳.msg라는 이름으로 문자열 저장.- 문자열 끝에
0(NULL) 추가. (C 스타일 문자열)
section .text
global main
main:
mov rbp, rsp
.text섹션: 실행되는 코드global main: 프로그램 진입점을main함수로 지정 (링커가 main 찾게)mov rbp, rsp: 디버깅할 때 스택 프레임 만들려고 넣는 것. (사실 없어도 돌아가긴 함)
PRINT_STRING msg
NEWLINE
PRINT_STRING msg:msg내용을 콘솔에 출력 (io64.inc 매크로 덕분)NEWLINE: 줄 바꿈 출력
xor rax, rax
ret
xor rax, rax: rax 레지스터를 0으로 세팅 (종료코드 0)ret: 함수 리턴 → 프로그램 종료
2. SASM 사용 방법
2-1. 디버깅 기본 단축키
| 기능 | 단축키 | 설명 |
|---|---|---|
| 디버깅 시작 | F5 | 프로그램 실행하면서 디버깅 모드 진입 |
| 브레이크 포인트 설정/해제 | F8 | 해당 줄 멈추기 (줄 번호 클릭하거나 F8) |
| 계속 실행 | F5 | 다음 브레이크 포인트까지 실행 |
| 일시정지 | F5 | 현재 실행 멈춤 (무한 루프 걸렸을 때 유용) |
| Step Into | F11 | 다음 명령어로 이동 + 함수 안으로 들어감 |
| Step Over | F10 | 다음 명령어로 이동 + 함수는 건너뜀 |
2-2. 디버깅 창 단축키
| 창 이름 | 단축키 | 기능 |
|---|---|---|
| 레지스터(Register) 창 | Ctrl+R | CPU 레지스터(RAX, RBP, RSP 등) 보기 |
| 메모리(Memory) 창 | Ctrl+M | 주소 또는 변수 메모리 직접 보기 |
해당 레지스터 창, 메모리 창은 디버깅할 때, 매우 중요하므로 켜두는게 좋음!
더 자세히 알고싶다면, F1을 눌러 Help를 읽거나 sasm 문서를 찾아보자!
2-3. 메모리/변수 보는 방법
- Memory 창에서
- “Add Variable…“에 변수 이름 입력
- 타입 지정:
b= byte(1바이트)w= word(2바이트)d= double word(4바이트)q= quad word(8바이트)
- 주소 직접 보고 싶으면 “Address” 체크
- 배열로 보면 “Array Size” 설정 가능
예시:
- 변수 주소:
msg - 명령어:
msg, b - 배열로 보면
"array size" = 13설정 (Hello, world! 길이)
2-4. SASM 디버깅 연습 미션&풀이
3. Assembly 변수 선언 방법
| 구문 | 의미 |
|---|---|
db (define byte) |
1바이트 변수 |
dw (define word) |
2바이트 변수 |
dd (define double word) |
4바이트 변수 |
dq (define quad word) |
8바이트 변수 |
메모리에 직접 값을 “저장”하는 것으로 변수처럼 사용(64bit 기준에서는 dq를 많이 사용)
3-1. 예시
section .data
a db 10 ; 1바이트짜리 변수 a = 10
b dw 1000 ; 2바이트짜리 변수 b = 1000
c dd 12345678h ; 4바이트짜리 변수 c = 0x12345678
d dq 123456789ABCDEF0h ; 8바이트짜리 변수 d = 0x123456789ABCDEF0
3-2. 중요한 포인트
a,b,c,d는 전부 메모리에 존재하는 이름(label).- 변수 자체가 아니라, “그 메모리 위치”를 가리키는 라벨.
- 값을 바꾸고 싶으면 메모리에 직접 접근해서 수정해야 함.
3-3. 참고: uninitialized 변수
section .bss
buffer resb 64 ; 64바이트짜리 빈 공간 (초기값 없음)
4. 빅 엔디안 vs 리틀 엔디안
엔디안(Endian) 은 “메모리에 데이터를 저장할 때, 바이트 순서를 어떻게 할 것인가” 를 정하는 규칙이다.
4-1. 리틀 엔디안 (Little Endian)
- “작은 게 먼저 저장” 된다.
- 숫자의 가장 하위 바이트(Least Significant Byte) 가 먼저 온다.
- x86, x86-64 (Windows PC) 는 리틀 엔디안 방식을 사용한다.
예시
32bit 숫자 0x12345678을 저장한다고 하면:
| 주소 | 값 |
|---|---|
| 0x00 | 0x78 |
| 0x01 | 0x56 |
| 0x02 | 0x34 |
| 0x03 | 0x12 |
※ 가장 오른쪽(가장 작은 값)부터 거꾸로 저장!
4-2. 빅 엔디안 (Big Endian)
- “큰 게 먼저 저장” 된다.
- 숫자의 가장 상위 바이트(Most Significant Byte) 가 먼저 온다.
- 네트워크 통신 규약(Internet Protocol, TCP/IP) 등에서는 빅 엔디안을 사용한다.
예시
32bit 숫자 0x12345678을 저장하면:
| 주소 | 값 |
|---|---|
| 0x00 | 0x12 |
| 0x01 | 0x34 |
| 0x02 | 0x56 |
| 0x03 | 0x78 |
※ 자연스럽게 왼쪽에서 오른쪽으로 읽는 느낌!
4-3. 리틀 vs 빅 간단 비교
| 구분 | 리틀엔디안 | 빅엔디안 |
|---|---|---|
| 저장 순서 | 가장 작은 바이트 → 가장 큰 바이트 | 가장 큰 바이트 → 가장 작은 바이트 |
| 사용 예시 | x86 CPU (PC), ARM(선택가능) | 네트워크 프로토콜, 일부 ARM 장치 |
| 메모리 디버깅할 때 | 값을 거꾸로 읽어야 함 | 값을 순서대로 읽음 |
4-4. 한 번 더 비교
리틀엔디안:
0x12345678 → 메모리: 78 56 34 12
빅엔디안:
0x12345678 → 메모리: 12 34 56 78
4-5. 요약 한방
- 어셈블리어에서는
db,dw,dd,dq같은 지시어로 변수를 메모리에 선언한다. - 리틀엔디안은 작은 바이트부터 저장하는 방식, 빅엔디안은 큰 바이트부터 저장하는 방식이다.
- Windows PC는 기본적으로 리틀엔디안이다.
- 스택에 저장할 때도 리틀엔디안이 적용돼서, push한 값도 거꾸로 쌓인다.
- C언어나 어셈블리 디버깅할 때 리틀엔디안/빅엔디안 이해 못하면 메모리 값 해석을 절대 못한다.
다음 편 :
assembly 기본 명령어부터 익히기


Leave a comment