- 후입선출(LIFO: Last-In, First-Out) 자료 구조
- x86-64 아키텍처에선 주소가 높은 곳에서 낮은 곳으로 자람
- 스택의 꼭대기는 항상 %rsp 레지스터가 가리킴
- %rsp는 push할 때 내려가고, pop할 때 올라감
명령어 요약
| 명령어 | 동작 설명 |
|---|---|
| pushq S | %rsp -= 8, M[%rsp] = S |
| popq D | D = M[%rsp], %rsp += 8 |
- q는 quad-word, 즉 8바이트
- 모든 연산은 8바이트 정렬을 따름


📍 pushq %rax 실행 전
%rsp = 0x108
[0x108] ↑ (아직 안 쓴 공간)
📍 pushq %rax 실행 후
%rsp = 0x100
[0x100] = %rax의 값
📍 popq %rbx 실행 후
%rsp = 0x108
[0x100] = (0x123 등, 값은 여전히 남아 있음!)
📦 사용 목적
| 상황 | 이유 |
|---|---|
| 함수 호출 시 | call 명령은 return address를 스택에 push |
| 함수 종료 시 | ret 명령은 return address를 스택에서 pop |
| 지역 변수 저장 | %rsp를 내려서 공간 확보 (ex. subq $16, %rsp) |
| 레지스터 백업 | 함수에서 레지스터 값을 바꾸기 전 push, 끝날 때 pop |
728x90
'CS:APP' 카테고리의 다른 글
| 컴파일러 드라이버 (0) | 2025.08.04 |
|---|---|
| 함수는 추상화의 결과다 - CS:APP 3.7 프로시저 호출 (0) | 2025.04.08 |
| [C, Assembly] movq 예제 (0) | 2025.04.07 |
| mov 인스트럭션 - CS:APP 3.4.2 (0) | 2025.04.07 |
| 오퍼랜드 식별자(operand specifier 어셈블리의 시작과 끝 - CS:APP 3.4.1 (0) | 2025.04.07 |