1️⃣ 어셈블리 언어 개발 환경 준비 - SASM 설치 및 기본 세팅

✔️ SASM이란?

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

✔️ 설치 방법

  • 공식 홈페이지: https://dman95.github.io/SASM/
  • 각자 환경에 맞는 버전 다운로드 (Windows, Linux 등)
  • 설치 후 첫 화면에서 설정 필요 (Settings)


✔️ SASM 기본 세팅 방법

설정 항목
Modex64 (64비트)
AssemblerNASM
Linkerld

✔️ 단축키 정리

작업단축키
새 프로젝트 생성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_STRINGio64.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라는 이름의 문자열 데이터 정의.
  • dbdefine 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️⃣ 컴퓨터 데이터 흐름 - 프로그램 실행 과정

  1. 하드디스크에서 실행 파일 로드
  2. 메모리로 복사 (로드)
  3. CPU가 명령어 읽고 실행
  4. 결과 출력 (I/O 장치로 전달)
profile
李家네_공부방

0개의 댓글