PC vs SP 비교
핵심 인사이트 (3줄 요약)
PC는 "다음에 실행할 명령어가 어디 있나?"를, SP는 "다음에 저장할 데이터를 어디에 둘까?"를 관리한다. PC는 코드 영역을, SP는 스택 영역을 가리킨다. 둘 다 주소를 저장하지만 목적과 동작 방식이 완전히 다르다.
📝 기술사 모의답안 (2.5페이지 분량)
📌 예상 문제
"PC vs SP 비교의 개념과 핵심 원리를 설명하고, 비교 분석 및 실무 적용 방안을 기술하시오."
Ⅰ. 개요
2. 개념적 차이
PC (Program Counter)
"요리책에서 다음에 볼 페이지"
┌─────────────────┐
│ 메모리 (코드) │
├─────────────────┤
│ 0x100: MOV R1, 1│ ← PC가 여기 가리킴
│ 0x104: MOV R2, 2│ "이거 실행해!"
│ 0x108: ADD R1, R2│
│ 0x10C: ... │
└─────────────────┘
SP (Stack Pointer)
"접시 쌓기에서 맨 위 접시 위치"
↓ 스택은 아래로 자람
┌─────────────────┐
│ ... │
├─────────────────┤
│ 지역변수 B │
├─────────────────┤
│ 지역변수 A │ ← SP가 여기 가리킴
└─────────────────┘ "여기가 끝이야!"
Ⅱ. 구성 요소 및 핵심 원리
1. 한눈에 보는 핵심 차이
| 구분 | PC (Program Counter) | SP (Stack Pointer) |
|---|---|---|
| 질문 | "다음에 무엇을 실행할까?" | "데이터를 어디에 저장할까?" |
| 가리키는 것 | 명령어 주소 | 데이터 주소 (스택 최상단) |
| 메모리 영역 | 코드(Code/Text) 영역 | 스택(Stack) 영역 |
| 주요 용도 | 프로그램 흐름 제어 | 함수 호출/지역변수 관리 |
| 동작 방식 | 순차 증가 + 분기 시 변경 | PUSH↓ / POP↑ |
| 방향 | 주로 증가 (앞으로) | 주로 감소 (아래로) |
| 대응 개념 | 요리책 북마크 📖 | 접시 탑의 꼭대기 🍽️ |
3. 동작 시점 비교
PC 동작 (명령어 사이클)
1. PC 값으로 명령어 인출 (Fetch)
2. PC 증가 (다음 명령어 준비)
3. 명령어 실행
4. 분기면 PC 변경, 아니면 그대로
반복!
SP 동작 (함수 호출 시)
함수 진입:
1. 반환 주소 PUSH → SP 감소
2. 지역변수 공간 확보 → SP 감소
함수 종료:
1. 지역변수 공간 해제 → SP 증가
2. 반환 주소 POP → SP 증가
4. 실제 동작 예시
void main() { // PC=0x100
int a = 1; // PC=0x104
func(10); // PC=0x108 → 분기!
}
void func(int x) { // PC=0x200 (함수 시작)
int b = x + 1; // PC=0x204
} // PC=0x208 → 복귀!
이때 SP와 PC의 변화
main() 실행 중:
┌──────────────────────────────────────┐
│ PC = 0x108 (func 호출 직전) │
│ SP = 0x7FF0 (메인의 스택 사용 중) │
└──────────────────────────────────────┘
↓ CALL func
┌──────────────────────────────────────┐
│ PC = 0x200 (func 시작) │
│ SP = 0x7FE0 (반환주소 + 지역변수) │ ← SP 감소!
└──────────────────────────────────────┘
↓ RET (func 종료)
┌──────────────────────────────────────┐
│ PC = 0x10C (main으로 복귀) │
│ SP = 0x7FF0 (원래대로 복구) │ ← SP 증가!
└──────────────────────────────────────┘
5. 왜 따로 관리할까?
┌─────────────────────────────────────────────────────┐
│ 메모리 맵 │
├─────────────────────────────────────────────────────┤
│ 0x0000 ┌─────────────┐ │
│ │ 코드 │ ← PC가 관리 │
│ │ (명령어) │ "무엇을 실행할지" │
│ ├─────────────┤ │
│ │ 데이터 │ │
│ ├─────────────┤ │
│ │ 힙 │ │
│ │ ↓ │ │
│ │ ... │ │
│ │ ↑ │ │
│ │ 스택 │ ← SP가 관리 │
│ 0xFFFF └─────────────┘ "데이터를 어디에" │
└─────────────────────────────────────────────────────┘
→ 코드와 스택은 독립적으로 성장!
→ PC와 SP가 따로 관리되어야 유연한 실행 가능
6. 혼동하기 쉬운 점
| 오해 | 진실 |
|---|---|
| "둘 다 주소니까 비슷하다" | 목적이 완전히 다름 (명령어 vs 데이터) |
| "SP도 명령어를 가리킨다" | SP는 데이터(변수, 반환주소)만 관리 |
| "PC는 항상 증가한다" | 분기/호출/인터럽트 시 변경됨 |
| "SP는 항상 감소한다" | POP/함수복귀 시 증가 |
7. 기술사 시험 포인트
암기 팁
PC = Program Counter = 명령어 위치 = 코드 쪽
SP = Stack Pointer = 데이터 위치 = 스택 쪽
P → Program → 명령어
S → Stack → 데이터
시험에서 물어볼 수 있는 것
- PC와 SP의 차이점 (본 항목)
- 함수 호출 시 두 레지스터의 변화
- 인터럽트 발생 시 PC와 SP의 동작
- 파이프라인에서 PC의 역할 (분기 예측)
- 스택 오버플로우와 SP의 관계
8. 관련 레지스터와의 관계
함수 호출 시 3대 레지스터 동작:
PC: "다음 명령어 어디?" → 함수 주소로 변경
LR: "돌아올 곳 어디?" → 호출한 곳 다음 주소 저장
SP: "스택 어디까지?" → 반환주소 저장하고 내려감
CALL func 시:
LR = PC + 4 (돌아올 주소)
PUSH LR (스택에 저장 → SP 감소)
PC = func (함수로 이동)
RET 시:
POP PC (스택에서 반환주소 꺼내 → SP 증가)
PC = LR (원래 위치로 복귀)
Ⅲ. 기술 비교 분석
비교표를 통해 주요 기술과 차이점을 분석한다.
Ⅳ. 실무 적용 방안
PC vs SP 비교의 실무 적용 시나리오와 고려사항.
Ⅴ. 기대 효과 및 결론
| 효과 영역 | 내용 | 정량적 목표 |
|---|---|---|
| 성능 향상 | 처리 속도·응답 시간 개선 | 기존 대비 20~40% 향상 |
| 비용 절감 | 운영비·인프라 비용 절감 | 연간 15~30% 절감 |
| 품질/안정성 | 가용성·장애 감소 | UpTime 99.9% 이상 |
※ 참고 표준: 해당 기술 관련 NIST / ISO / IEEE / 과기정통부 가이드라인
어린이를 위한 종합 설명
PC vs SP 비교를 쉽게 이해해보자!
PC는 "다음에 실행할 명령어가 어디 있나?"를, SP는 "다음에 저장할 데이터를 어디에 둘까?"를 관리한다. PC는 코드 영역을, SP는 **
왜 필요할까?
기존 방식의 한계를 넘기 위해
어떻게 동작하나?
복잡한 문제 → PC vs SP 비교 적용 → 더 빠르고 안전한 결과!
핵심 한 줄:
PC vs SP 비교 = 똑똑하게 문제를 해결하는 방법
비유: PC vs SP 비교은 마치 요리사가 레시피를 따르는 것과 같아. 혼란스러운 재료들을 정해진 순서대로 조합하면 → 맛있는 요리(최적 결과)가 나오지! 🍳