스킬캠퍼스

오늘 끝나면

분기·루프·함수

  • 분기·루프·함수의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 분기이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

조건·점프·call/return — PC와 스택이 함께 움직인다 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 20

분기·루프
함수

CPU는 위에서 아래로만 흐르지 않는다.
조건을 보고 점프하고, 뒤로 돌아 반복하고, 불러갔다 되돌아온다.
그 전부가 PC를 어디로 보내느냐 하나로 정해진다.

P.01반도체 설계 · 20

흐름 제어 = PC를 어디로 보낼지 정하기

CPU는 명령을 하나 실행할 때마다 PC를 다음 주소로 옮긴다. 평소엔 그냥 +1이다.

PC(프로그램 카운터)는 ‘다음에 실행할 명령의 주소’를 담은 레지스터다.
직선 코드는 PC ← PC + 1만 반복한다. 위에서 아래로 줄줄 내려간다.

분기·루프·함수는 전부 이 PC + 1을 다른 값으로 갈아끼우는 일이다.
조건을 보고 갈아끼우면 분기, 뒤 주소로 끼우면 루프, 주소를 저장하고 끼우면 함수다.

기본은 +1 · 흐름 제어는 PC를 갈아끼움
PC = 다음 명령 주소
직선, PC + 1
instr 00instr 11instr 22instr 33instr 44+1
흐름제어, PC 갈아끼움
instr 00instr 11instr 22instr 33instr 44점프
분기·루프·함수 = 전부 PC를 +1 대신 다른 주소로 보내는 일
P.02반도체 설계 · 20

분기 = 조건을 보고 PC를 점프

if는 두 값을 빼서 같은지 보고, 결과에 따라 PC를 점프할지 말지 고르는 것이다.

ALU로 a − b를 하면 Zero 플래그가 나온다. 같으면 1, 다르면 0이다.
BEQ 같은 분기 명령은 이 플래그를 보고 정한다.
조건이 참이면 PC를 목표 주소로 점프하고, 거짓이면 그냥 PC + 1로 다음 줄로 간다.

그래서 고급 언어의 if (a == b)는 칩 안에서 빼기 → 플래그 → 조건부 PC 점프로 번역된다.
여기서 ‘조건이 참일 때 점프할 주소’를 ISA에 어떻게 담을지가 설계 선택이다. 이 선택이 최종 MyChip의 분기 명령 형식에 그대로 들어간다.

비교 → 참이면 점프 · 거짓이면 다음 줄
if = 비교 → 조건부 점프
ALU a−bZero점프참(1)PC+1거짓(0)
비교ZeroPC
a == b1→ 목표로 점프
a ≠ b0→ PC + 1 (다음 줄)
조건 한 비트(Zero)가 PC를 점프시킬지 말지 가름
P.03반도체 설계 · 20

루프 = PC를 뒤로 점프

반복은 이미 지나온 주소로 PC를 되돌려 같은 코드를 또 실행하는 것이다.

JMP는 조건 없이 PC를 정해진 주소로 보낸다. 그 주소가 지금보다 앞이면 ‘뒤로 점프’다.
뒤로 점프하면 그 사이 코드가 다시 돈다. 이게 루프의 뼈대다.

그냥 뒤로만 점프하면 영원히 돈다(무한 루프).
그래서 루프 안에 분기를 함께 둔다. 매 바퀴 카운터를 줄이고, 0이 되면 분기로 빠져나간다.
뒤로 점프(반복) + 조건 분기(탈출) 두 개를 엮으면 for·while이 된다.

뒤로 점프 + 조건 = 반복
루프 = 뒤로 점프 + 조건 탈출
3 ADD 합 += i4 SUB i -= 15 BEQZ i==0? 탈출6 JMP 3 (뒤로)뒤로 점프i==0 탈출
뒤로 점프가 반복을 만들고, 안의 조건 분기가 빠져나갈 문을 만든다. 둘이 합쳐 for·while이 된다
P.04반도체 설계 · 20

함수 = 복귀 주소를 스택에 저장하고 점프

함수는 점프인데, 끝나면 부른 자리로 정확히 돌아와야 한다. 그 ‘돌아올 자리’를 스택이 기억한다.

call은 두 가지를 한다. 먼저 PC + 1(call 다음 줄, 즉 복귀 주소)을 스택에 push하고, 함수 시작 주소로 점프한다.
함수가 끝나면 return이 스택에서 그 주소를 pop해 PC에 넣는다. 부른 자리로 정확히 복귀한다.

왜 스택이냐면, 함수가 함수를 또 부르면 복귀 주소가 여러 개 쌓이기 때문이다.
나중에 부른 게 먼저 끝나므로 ‘마지막에 넣은 걸 먼저 꺼내는’ 스택(LIFO)이 딱 맞는다.
스택을 가리키는 게 SP(스택 포인터)다. push하면 깊어지고 pop하면 얕아진다.
이 call/return 규약(무엇을 push하고 어떻게 pop할지)이 최종 MyChip의 호출 규약으로 들어간다.

call: push + 점프 · return: pop + 복귀
함수 = call(push+점프) · return(pop+복귀)
callpush + 점프

① 복귀주소(PC+1)를 스택에 push

② PC ← 함수 시작 주소

스택
→ 복귀주소 top
⋮ 이전 프레임

SP 깊어짐 ↑

returnpop + 복귀

① 스택 top을 pop

② PC ← pop한 복귀주소

스택
복귀주소 (pop됨)
→ 이전 프레임 top

SP 얕아짐 ↓

마지막에 넣은 복귀주소를 먼저 꺼낸다(LIFO). 그래서 스택이 딱 맞는다
P.05반도체 설계 · 20

흐름을 한 박자씩 직접 굴려본다

작은 프로그램을 한 명령씩 굴려본다. 분기·CALL·RET 직전엔 다음 PC가 어디로 갈지 먼저 예측하고 STEP과 맞춰본다.

이 프로그램은 CALL로 함수에 들어가 JMP로 루프를 돌며 r0번 누적하고, BEQZ로 r0가 0이 되면 빠져나와 RET으로 복귀한다.

분기는 PC만 갈리고, 루프는 PC가 뒤로 가며, 함수는 스택까지 움직인다.
이 세 흐름 제어가 19강에서 만든 명령 실행 위에 얹혀 진짜 프로그램이 된다. 여기서 본 PC·스택 동작이 최종 MyChip CPU의 제어 골격이다.

Q. 함수를 호출할 때(call) 스택에 저장하는 것은?정답은 돌아올 주소(복귀 주소)다.
call은 PC + 1(call 바로 다음 명령의 주소)을 스택에 push하고 함수로 점프한다.
함수가 끝나면 return이 그 주소를 pop해 PC에 넣어 부른 자리로 정확히 돌아온다.
함수가 함수를 또 부를 수 있어 복귀 주소가 여러 개 쌓이므로, 마지막에 넣은 걸 먼저 꺼내는 스택(LIFO)을 쓴다.
STEP으로 PC·스택 동시 추적 · 분기/루프/call·return
흐름 시뮬 · PC + 스택 한 박자씩
프로그램, ▶ 가 지금 실행할 줄(PC)
0SET r0, 3
1CALL 4함수
2HALT
3RET함수
4BEQZ r0, 3분기
5ADD r1, r1, r0
6SUB r0, r0, 1
7JMP 4루프
흐름, PC 이동 · 스택사건: 직선 진행
01234567sub스택 (복귀주소)····SP 깊이 = 0

▶ = 지금 PC · 곡선 = 점프/루프 · 오른쪽 칸이 스택(CALL이 push · RET이 pop)

근거 패널, 레지스터 · PC · 스택
PCr0 (카운터)r1 (합)SP 깊이
0000
스택 (복귀주소 · top이 오른쪽)

비어 있음

카운터 r0 = 3. 직선 진행이라 PC = 0+1 = 1.

3줄 요약

  1. 1조건·점프·call/return — PC와 스택이 함께 움직인다
  2. 2분기·루프·함수은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

분기

조건·점프·call/return — PC와 스택이 함께 움직인다

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩