전체 코드
%include "io64.inc"
section .text
global CMAIN
CMAIN:
mov rbp, rsp ; 디버깅 편의를 위한 프레임 포인터 설정
; msg라는 문자열 출력 (PRINT_STRING 매크로 활용)
PRINT_STRING msg
xor rax, rax ; 반환값 0 설정
ret
section .data
; 문자열 데이터 선언 (ASCII 코드로 직접 선언 가능)
; msg db 'Hello World', 0x00 → 아래처럼 아스키 코드 직접 기입해도 동일
msg db 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f,0x72,0x6c,0x64,0x0
; 여러 데이터 한번에 선언 (배열 느낌)
a db 0x11, 0x22, 0x33, 0x44
; 정수 데이터 선언 (4바이트 - dd 사용)
b dd 0x12345678 ; 리틀 엔디언 방식으로 메모리에 저장됨
section .bss
e resb 10 ; 초기화되지 않은 10바이트 공간 예약
🔔 프로그램 메모리 구조 복습
| 구역 | 내용 |
|---|
| Text 섹션 | 프로그램 명령어 (코드) 저장 |
| Data 섹션 | 초기화된 전역/정적 변수 저장 |
| BSS 섹션 | 초기화되지 않은 전역/정적 변수 저장 |
| Heap | 동적 메모리 영역 |
| Stack | 지역 변수 및 함수 호출 스택 |
1️⃣ 문자 타입 변수 선언
문자란?
- 문자도 결국 숫자(아스키 코드)로 저장된다.
- 'A' → 0x41, 'B' → 0x42 이런 식으로 ASCII Code로 변환되어 메모리에 저장됨.
- 어셈블리에서 문자열은
db를 사용해 선언하고, 끝에 0x00을 붙여 문자열 끝 표시.
2️⃣ 여러 개의 변수 한 번에 선언
a db 0x11, 0x22, 0x33, 0x44
4️⃣ 메모리 저장 결과 확인
문자열 저장 확인
5️⃣ ASCII 코드란?
6️⃣ 엔디언 (Endianness)
엔디언이란?
- 여러 바이트로 구성된 데이터의 저장 순서
- 리틀 엔디언 (Little Endian): 작은 자리수가 앞 (낮은 주소)
- 빅 엔디언 (Big Endian): 큰 자리수가 앞 (낮은 주소)
7️⃣ 리틀 엔디언 저장 예시
b dd 0x12345678
8️⃣ 엔디언 비교 정리
| 구분 | 리틀 엔디언 | 빅 엔디언 |
|---|
| 저장 순서 | 작은 자리수가 낮은 주소 | 큰 자리수가 낮은 주소 |
| 장점 | 캐스팅 (형변환) 유리 | 숫자 비교 유리 |
| 사용처 | x86, x64 (Intel, AMD) | 네트워크, 일부 RISC |
9️⃣ 엔디언이 캐스팅에 유리한 이유
- 리틀 엔디언: 하위 바이트가 앞에 위치.
- 예) 32비트 → 16비트로 변환 시 앞의 2바이트만 참조하면 됨.
- 빅 엔디언은 반대로 앞의 큰 자리 바이트부터 저장해서, 자리 바꾸기가 필요함.
🔟 엔디언 요약 공식
| 작업 | 리틀 엔디언 | 빅 엔디언 |
|---|
| 0x12345678 저장 | 78 56 34 12 | 12 34 56 78 |
| 캐스팅 | 쉬움 | 어려움 |
| 숫자 비교 | 어려움 | 쉬움 |