전체 코드
%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️⃣ 변수란?
- 데이터를 저장하는 바구니.
- 메모리상의 특정 주소를 차지하는 공간.
- 변수를 사용하려면:
- 이름 (변수명)
- 크기 (몇 바이트인지)
- 초기값 (optional)
3️⃣ 레지스터란?
- CPU 내부 초고속 메모리.
- 메인 메모리보다 빠르지만 용량이 적다.
- CPU가 연산할 때 중간 결과값을 저장하는 공간.
- 어셈블리에서는 변수를 직접 쓰기보다 레지스터에 올려서 처리하는 게 기본.
4️⃣ 데이터 크기 단위
| 단위 | 크기(byte) |
|---|
| bit | 1비트 |
| byte | 8비트 |
| word | 2바이트 |
| dword (double word) | 4바이트 |
| qword (quad word) | 8바이트 |
5️⃣ 레지스터 크기와 부분 레지스터
| 레지스터 | 크기 | 역할 |
|---|
| RAX | 64bit | 전체 레지스터 |
| EAX | 32bit | 하위 32bit |
| AX | 16bit | 하위 16bit |
| AH | 8bit | 상위 8bit |
| AL | 8bit | 하위 8bit |
6️⃣ 변수 선언 방식
초기화된 데이터 (.data)
| 예시 | 의미 |
|---|
| a db 0x11 | 1바이트 변수 a에 0x11 저장 |
| b dw 0x2222 | 2바이트 변수 b에 0x2222 저장 |
| c dd 0x33333333 | 4바이트 변수 c에 0x33333333 저장 |
| d dq 0x4444444444444444 | 8바이트 변수 d에 0x4444444444444444 저장 |
초기화 안 된 데이터 (.bss)
| 예시 | 의미 |
|---|
| e resb 10 | 1바이트짜리 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 | 함수 호출, 지역 변수 |
+------------------+