전체 코드

%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
  • 위처럼 콤마로 구분해 여러 값을 한 번에 정의 가능.
  • 메모리에 연속적으로 저장됨 (주소 연속성 가짐).
  • 실제 디버그로 보면:
    주소 0x403010 : 0x11
    주소 0x403011 : 0x22
    주소 0x403012 : 0x33
    주소 0x403013 : 0x44


4️⃣ 메모리 저장 결과 확인

문자열 저장 확인

  • msg에 저장된 데이터 디버그로 보면:
    0x403020 : 0x48 ('H')
    0x403021 : 0x65 ('e')
    0x403022 : 0x6C ('l')
    0x403023 : 0x6C ('l')
    0x403024 : 0x6F ('o')
    0x403025 : 0x20 (' ')
    0x403026 : 0x57 ('W')
    0x403027 : 0x6F ('o')
    0x403028 : 0x72 ('r')
    0x403029 : 0x6C ('l')
    0x40302A : 0x64 ('d')
    0x40302B : 0x00 (문자열 종료)

5️⃣ ASCII 코드란?

  • 문자 → 숫자 변환 테이블
  • 대표적인 ASCII 코드
    'A' = 0x41
    'a' = 0x61
    '0' = 0x30
    공백 = 0x20
  • 직접 db에 아스키 코드로 작성해도 되고, 그냥 문자열로 작성해도 동일.

6️⃣ 엔디언 (Endianness)

엔디언이란?

  • 여러 바이트로 구성된 데이터의 저장 순서
  • 리틀 엔디언 (Little Endian): 작은 자리수가 앞 (낮은 주소)
  • 빅 엔디언 (Big Endian): 큰 자리수가 앞 (낮은 주소)

7️⃣ 리틀 엔디언 저장 예시

b dd 0x12345678
  • 메모리 저장 순서:
    0x403030 : 0x78
    0x403031 : 0x56
    0x403032 : 0x34
    0x403033 : 0x12
  • 낮은 주소부터 작은 자리수 저장 (리틀 엔디언 특징)

8️⃣ 엔디언 비교 정리

구분리틀 엔디언빅 엔디언
저장 순서작은 자리수가 낮은 주소큰 자리수가 낮은 주소
장점캐스팅 (형변환) 유리숫자 비교 유리
사용처x86, x64 (Intel, AMD)네트워크, 일부 RISC

9️⃣ 엔디언이 캐스팅에 유리한 이유

  • 리틀 엔디언: 하위 바이트가 앞에 위치.
  • 예) 32비트 → 16비트로 변환 시 앞의 2바이트만 참조하면 됨.
  • 빅 엔디언은 반대로 앞의 큰 자리 바이트부터 저장해서, 자리 바꾸기가 필요함.

🔟 엔디언 요약 공식

작업리틀 엔디언빅 엔디언
0x12345678 저장78 56 34 1212 34 56 78
캐스팅쉬움어려움
숫자 비교어려움쉬움

profile
李家네_공부방

0개의 댓글