정의
CPU는 명령어를 실행할 때마다 “다음에 어떤 명령어를 가져올지(fetch)”를 알아야 합니다. 이때 다음 명령어의 위치를 들고 있는 레지스터가 PC(Program Counter)입니다.
x86 계열은 같은 개념을 IP(Instruction Pointer) 또는 RIP 같은 이름으로 부르기도 합니다. 결론적으로 PC/IP는 실행 흐름(control flow)의 “현재 위치”를 나타내는 포인터입니다.
“if/for/while, 함수 호출/리턴, 예외 처리 같은 고수준 제어 흐름은 결국 PC를 어디로 바꾸느냐의 문제다.”
- 제어 흐름은 PC 갱신으로 구현된다 -동작 원리
분기가 없다면 PC는 다음 명령어 위치로 이동합니다. RISC는 명령어 길이가 고정인 경우가 많아 “+4”처럼 직관적으로 설명할 수 있고, x86 같은 CISC는 길이가 가변이므로 “다음 명령어 주소로 이동”이라고 이해하는 편이 정확합니다.
조건 분기에서는 비교 결과(예: 플래그 레지스터의 ZF/SF/OF 등)를 보고 PC가 분기 대상 주소로 바뀝니다. 이 동작이 if/else, switch, 루프 조건을 구성합니다.
함수 호출은 PC를 “함수 시작 주소”로 이동시키되, 복귀 주소를 저장해야 합니다. 일반적으로 복귀 주소는 스택에 저장되고, 리턴 시 PC는 그 복귀 주소로 되돌아갑니다.
대표 상황
성능 관점
CPU는 다음 PC가 어디일지 미리 예측하고 명령어를 준비해 파이프라인을 채웁니다. 예측이 틀리면 파이프라인이 비워지는(flush) 비용이 생겨 지연이 커질 수 있습니다.
“분기가 많아서 느리다”는 말은 보통 예측이 어려운 분기가 많아 비용이 커진 경우입니다. 규칙적인 분기는 예측이 잘 맞아 영향이 작을 수 있습니다.
실무/디버깅
디버거가 특정 라인에서 멈춘다는 건 “해당 라인에 대응되는 머신 코드 주소(=PC 위치)”에서 실행을 멈춘다는 뜻입니다. step over/into는 PC가 다음 주소로 어떻게 이동하는지 추적하는 과정입니다.
핵심 요약
✅ 핵심 요약
- ✔️ PC/IP는 다음에 실행할 명령어 주소를 가리키는 레지스터다.
- ✔️ 순차 실행에서는 다음 위치로 이동하고, 분기/점프/호출/예외에서는 목적지로 갱신된다.
- ✔️ 성능에서는 “다음 PC를 맞히는 문제(분기 예측)”가 중요하며, 실패하면 파이프라인 비용이 커진다.