컴퓨터 시스템 : CSAPP 3장 정리 - 3.4 장 정보 접근하기 Part.3

3.4.3 "데이터 이동 예제(Data Movement Example)"

🎯 이 절의 핵심

메모리에서 값을 읽고 쓰는 방식을 실제 C 코드와 어셈블리 코드 예제를 통해 배워본다.


📘 C 코드 예시

long exchange(long *xp, long y) {
    long x = *xp;
    *xp = y;
    return x;
}

💡 무슨 뜻인가?

  • xp는 숫자가 들어 있는 상자의 주소이다.
  • y는 바꿔치기할 새 숫자
  • *xp = y: xp가 가리키는 곳의 값을 y로 바꿔준다.
  • return x: 바꾸기 전에 있던 값을 결과로 돌려준다.

마치 “친구 상자에 있는 숫자를 내가 보고, 그 자리에 새 숫자를 넣고, 원래 있던 숫자를 기억해 두는 것” 같다.


🔧 어셈블리 코드

exchange:
    movq (%rdi), %rax     ; %rdi가 가리키는 곳의 값을 읽어와 %rax에 저장
    movq %rsi, (%rdi)     ; %rsi의 값을 %rdi가 가리키는 주소에 저장
    ret                   ; 함수 끝, %rax의 값을 반환

💡 레지스터 설명

  • %rdi: xp → 값을 바꿀 대상 주소
  • %rsi: y → 새로 넣을 숫자
  • %rax: 결과값을 저장하는 레지스터 (반환값)

🧠 순서대로 쉽게 설명하면?

  1. (%rdi) → xp가 가리키는 상자의 값
  2. movq (%rdi), %rax → 그 값을 rax에 저장해 둔다. (원래 값)
  3. movq %rsi, (%rdi) → rsi에 있는 새 값을 그 상자에 넣는다.
  4. ret → %rax에 있던 원래 값을 결과로 돌려준다

3.4.4 "스택 데이터의 저장과 추출 (Pushing and Popping Stack Data)"

🎯 이 절의 핵심

컴퓨터가 데이터를 저장하고 꺼낼 수 있는 스택(stack)이라는 공간이 있고,
그 안에 값을 넣는(push) 방법과 꺼내는(pop) 방법을 배운다


📦 스택이란?

스택은 "먼저 들어간 건 나중에 나오고, 나중에 들어간 게 먼저 나오는" 상자다.

마치 책을 차곡차곡 쌓아두고, 맨 위에 있는 책만 꺼낼 수 있는 것과 같다.

🧰 스택 관련 어셈블리 명령어 2개

명령어 설명
pushq S 값을 스택에 넣기
popq D 값을 스택에서 꺼내기

🧠 스택의 작동 원리

  • 스택의 맨 위 위치를 %rsp라는 레지스터가 가리키고 있다.
  • 스택은 아래 방향으로 커진다. (주소가 줄어듦)

예시: pushq %rax

  1. %rsp를 8만큼 줄인다. (스택 공간 확보)
  2. %rax 값을 %rsp가 가리키는 위치에 저장

예시: popq %rdx

  1. %rsp가 가리키는 위치에서 값을 꺼내서 %rdx에 저장
  2. %rsp를 8만큼 늘린다 (스택 공간 되돌림)

🎨 스택 동작 그림 비유

🧱 처음 상태

%rsp → 0x108
(스택 맨 위는 0x108)

📥 pushq %rax

%rsp → 0x100 (8만큼 줄어듦) 0x100 위치에 %rax 값 저장

📤 popq %rdx

%rdx ← 0x100 위치에 있던 값 %rsp → 0x108 (8만큼 증가)

이처럼 push는 공간을 만들고 값을 넣고,
pop은 값을 꺼내고 공간을 되돌린다.