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: 결과값을 저장하는 레지스터 (반환값)
🧠 순서대로 쉽게 설명하면?
- (%rdi) → xp가 가리키는 상자의 값
- movq (%rdi), %rax → 그 값을 rax에 저장해 둔다. (원래 값)
- movq %rsi, (%rdi) → rsi에 있는 새 값을 그 상자에 넣는다.
- ret → %rax에 있던 원래 값을 결과로 돌려준다
3.4.4 "스택 데이터의 저장과 추출 (Pushing and Popping Stack Data)"
🎯 이 절의 핵심
컴퓨터가 데이터를 저장하고 꺼낼 수 있는 스택(stack)이라는 공간이 있고,
그 안에 값을 넣는(push) 방법과 꺼내는(pop) 방법을 배운다
📦 스택이란?
스택은 "먼저 들어간 건 나중에 나오고, 나중에 들어간 게 먼저 나오는" 상자다.
마치 책을 차곡차곡 쌓아두고, 맨 위에 있는 책만 꺼낼 수 있는 것과 같다.
🧰 스택 관련 어셈블리 명령어 2개
명령어 | 설명 |
pushq S | 값을 스택에 넣기 |
popq D | 값을 스택에서 꺼내기 |
🧠 스택의 작동 원리
- 스택의 맨 위 위치를 %rsp라는 레지스터가 가리키고 있다.
- 스택은 아래 방향으로 커진다. (주소가 줄어듦)
예시: pushq %rax
- %rsp를 8만큼 줄인다. (스택 공간 확보)
- %rax 값을 %rsp가 가리키는 위치에 저장
예시: popq %rdx
- %rsp가 가리키는 위치에서 값을 꺼내서 %rdx에 저장
- %rsp를 8만큼 늘린다 (스택 공간 되돌림)
🎨 스택 동작 그림 비유
🧱 처음 상태
%rsp → 0x108
(스택 맨 위는 0x108)
📥 pushq %rax
%rsp → 0x100 (8만큼 줄어듦) 0x100 위치에 %rax 값 저장
📤 popq %rdx
%rdx ← 0x100 위치에 있던 값 %rsp → 0x108 (8만큼 증가)
이처럼 push는 공간을 만들고 값을 넣고,
pop은 값을 꺼내고 공간을 되돌린다.
'크래프톤 정글 (컴퓨터 시스템: CSAPP) > 3장 프로그램의 기계수준 표현' 카테고리의 다른 글
컴퓨터 시스템 : CSAPP 3장 정리 - 3.6 장 제어문 Part.1 (0) | 2025.04.05 |
---|---|
컴퓨터 시스템 : CSAPP 3장 정리 - 3.5 장 산술 및 논리 연산 (0) | 2025.04.05 |
컴퓨터 시스템 : CSAPP 3장 정리 - 3.4 장 정보 접근하기 Part.2 (0) | 2025.04.05 |
컴퓨터 시스템 : CSAPP 3장 정리 - 3.4 장 정보 접근하기 Part.1 (0) | 2025.04.05 |
컴퓨터 시스템 : CSAPP 3장 정리 - 3.2장 프로그램의 인코딩 Part. 2 (1) | 2025.04.05 |