전체 코드

%include "io64.inc"

section .text
global CMAIN
CMAIN:
    mov rbp, rsp ; 디버깅용 프레임 설정

    ; 레지스터에 상수 저장 (레지스터 직접 조작)
    mov eax, 0x1234
    mov rbx, 0x12345678
    mov cl, 0xff

    ; 부분 레지스터 조작
    mov al, 0x00

    ; 레지스터끼리 복사
    mov rax, rdx

    ; 메모리 변수에 값 저장 (크기 지정 필요)
    mov [a], byte 0x55
    mov [a], word 0x6666

    xor rax, rax ; 반환값 0 설정
    ret

section .data
    a db 0x11       ; 1바이트 변수
    b dw 0x2222     ; 2바이트 변수
    c dd 0x33333333 ; 4바이트 변수
    d dq 0x4444444444444444 ; 8바이트 변수

section .bss
    e resb 10       ; 1바이트짜리 10개 공간 예약

1️⃣ 프로그램 메모리 구조

실행 파일이 메모리에 올라가는 구조

구역내용설명
Text 섹션프로그램 코드기계어 명령어 저장
Data 섹션초기화된 전역/정적 변수초기 값 있는 데이터 저장
BSS 섹션초기화 안 된 전역/정적 변수크기만 잡아두고, 실제 데이터는 0으로 초기화
Heap 영역동적 메모리 할당malloc, new 등으로 할당되는 공간
Stack 영역지역 변수 및 함수 호출 스택함수 호출 시 스택 프레임 구성

2️⃣ 변수란?

  • 데이터를 저장하는 바구니.
  • 메모리상의 특정 주소를 차지하는 공간.
  • 변수를 사용하려면:
    1. 이름 (변수명)
    2. 크기 (몇 바이트인지)
    3. 초기값 (optional)

3️⃣ 레지스터란?

  • CPU 내부 초고속 메모리.
  • 메인 메모리보다 빠르지만 용량이 적다.
  • CPU가 연산할 때 중간 결과값을 저장하는 공간.
  • 어셈블리에서는 변수를 직접 쓰기보다 레지스터에 올려서 처리하는 게 기본.

4️⃣ 데이터 크기 단위

단위크기(byte)
bit1비트
byte8비트
word2바이트
dword (double word)4바이트
qword (quad word)8바이트

5️⃣ 레지스터 크기와 부분 레지스터

레지스터크기역할
RAX64bit전체 레지스터
EAX32bit하위 32bit
AX16bit하위 16bit
AH8bit상위 8bit
AL8bit하위 8bit

6️⃣ 변수 선언 방식

초기화된 데이터 (.data)

예시의미
a db 0x111바이트 변수 a에 0x11 저장
b dw 0x22222바이트 변수 b에 0x2222 저장
c dd 0x333333334바이트 변수 c에 0x33333333 저장
d dq 0x44444444444444448바이트 변수 d에 0x4444444444444444 저장

초기화 안 된 데이터 (.bss)

예시의미
e resb 101바이트짜리 10개 공간 예약

7️⃣ 메모리와 레지스터 데이터 이동

명령어설명
mov reg, 상수상수를 레지스터에 저장
mov reg1, reg2레지스터끼리 데이터 복사
mov reg, [변수]메모리 변수 값 읽기
mov [변수], reg레지스터 값 메모리에 저장
mov [변수], 상수상수 값을 메모리에 저장 (크기 지정 필수)

9️⃣ 메모리 주소 개념

  • 메모리의 각 바이트는 고유 주소를 가짐.
  • 변수명은 사실 주소의 별명일 뿐.
  • 실제 어셈블리 코드에서는 주소로 접근.
  • a의 주소 = 0x403010이면,
    • a의 다음 주소는 b
    • a+1 = b 주소
    • 주소 연산으로 인접 변수 접근 가능

🔟 디버그 포인트

기능설명
F5디버그 시작
F9빌드 & 실행
F10한 줄 실행 (Step Over)
Ctrl+R레지스터 창 보기
Ctrl+M메모리 창 보기
Break Point멈추고 싶은 줄 클릭

📌 한눈에 보는 메모리 구조도

+------------------+
| Text  | 코드   |
| Data  | 초기화된 전역 변수 |
| BSS   | 초기화 안 된 전역 변수 |
| Heap  | 동적 할당 영역 |
| Stack | 함수 호출, 지역 변수 |
+------------------+

profile
李家네_공부방

0개의 댓글