UNIT-SPECIFIC ACTIVE LESSON · 3-4

바깥 loop 조건

`i < n-1`을 branch로 구현하세요.

학습 목표: C 조건 `i < n-1`을 반대 조건 `i >= n-1`의 `bge` 탈출 branch로 번역하고 매 outer iteration마다 j를 0으로 초기화한다.
공식 근거 범위: SoSe26 Probeklausur 시험 p7 Aufgabe 3의 `i < n-1` outer loop와 공식 해설 p10의 `addi/bge/li` 구현 범위.

왜 이 소문제를 따로 배우는가

Assembly에는 C의 loop header가 그대로 남지 않습니다. ‘계속할 조건’의 부정을 먼저 만들고 label 방향까지 추적해야 off-by-one과 branch target 뒤집힘을 피할 수 있습니다.

이 페이지는 Aufgabe 3의 공통 템플릿이 아니라 3-4 바깥 loop 조건에 필요한 내용만 담습니다. 챕터 전체 배경이 필요하면 Aufgabe 3 개념 수업을 먼저 읽으세요.

이 소문제에서 실제로 쓰는 용어

정의뿐 아니라 이 문제의 어느 판단에 쓰이는지까지 연결합니다.

loop guard
loop body를 실행할지 종료할지를 결정하는 조건입니다.이 소문제에서: C의 `i < n-1`을 Assembly branch와 연결합니다.
inverted condition
계속 조건을 부정해 종료 시점을 직접 검사하는 조건입니다.이 소문제에서: `not(i<n-1)`을 `i>=n-1`로 바꾸어 done으로 branch합니다.
bge
첫 source가 둘째 source보다 크거나 같으면 target으로 branch하는 instruction입니다.이 소문제에서: `bge s2,t0,done`으로 i와 n-1을 비교합니다.
loop invariant initialization
각 반복 시작에서 inner loop가 기대하는 초기 상태를 다시 만드는 작업입니다.이 소문제에서: 새 outer iteration마다 j를 s3=0으로 reset합니다.

이 소문제 전용 규칙과 종이 작업

탈출 조건 부정 규칙

body로 fall-through하는 구조에서는 C의 계속 조건을 부정한 조건으로 done에 branch합니다.

종이에: `continue: i<n-1` 아래에 `exit: i>=n-1`을 씁니다.

bound 한 번 계산 규칙

비교할 `n-1`을 temporary에 먼저 만들면 bge의 두 register operand가 명확해집니다.

종이에: `t0=n-1` register 의미를 branch 앞에 표시합니다.

j reset 위치 규칙

j=0은 함수 전체에서 한 번이 아니라 outer guard를 통과한 매 iteration 시작에 실행되어야 합니다.

종이에: `li s3,0`을 outer body 진입 직후, inner_loop label 전에 둡니다.

Aufgabe 전체 흐름은 챕터 흐름도에서 확인할 수 있습니다. 여기서는 현재 판단에 직접 필요한 규칙만 적용합니다.

이 소문제 전용 작은 예제

n=5일 때 `i<n-1` outer guard를 `addi t0,s1,-1; bge s2,t0,done`으로 실행한다. i=0부터 종료까지 guard 결과를 trace하세요.

주어진 것

  • s1=n=5입니다.
  • 각 outer iteration 끝에서 i는 1 증가합니다.
  1. bound n-1을 계산합니다.

    모든 guard에서 비교할 고정 upper bound를 얻습니다.

    종이 산출물: `t0=5-1=4`

  2. i=0,1,2,3에서 bge 결과를 확인합니다.

    이 값들은 모두 4보다 작아 branch가 taken되지 않고 body를 실행합니다.

    종이 산출물: `0>=4 F, 1>=4 F, 2>=4 F, 3>=4 F → body 4회`

  3. i=4에서 종료 branch를 확인합니다.

    계속 조건 `4<4`가 거짓인 첫 지점입니다.

    종이 산출물: `4>=4 T → done`

예제 답과 독립 검산 보기

bound는 4이고 i=0,1,2,3에서 body를 실행한 뒤 i=4에서 done으로 branch합니다.

독립 검산: body 실행 횟수 `n-1=4`와 trace의 네 번이 일치하는지 확인합니다.

이제 실제 시험 문제를 micro-work로 풀기

공식 시험이 요구하는 것

`i < n-1`을 branch로 구현하세요.

공식 답을 보기 전, 내 답 먼저 남기기

완성 문장이 아니어도 좋습니다. 중간값·register·cycle·cache state처럼 채점 가능한 흔적을 먼저 적으세요.

각 작업의 중간 산출물을 직접 적고 완료 조건을 만족한 뒤 체크하세요. 단계별 이유·산출물·오류가 현재 소문제에 맞게 따로 작성되어 있습니다.

n-1을 temporary t0에 계산합니다.

왜 하는가
RISC-V `bge`는 두 register를 비교하므로 C 식의 `n-1`을 먼저 materialize해야 합니다.
종이 산출물
`addi t0,s1,-1 # t0=n-1`
완료 조건
t0의 의미가 n-1로 표시되고 s1의 n 원본은 유지됩니다.
막혔을 때 단계 힌트·대표 오류

힌트: n 자체를 감소시키지 말고 temporary destination을 사용하세요.

이 단계의 대표 오류: `addi s1,s1,-1`로 n을 영구 변경해 이후 inner bound도 틀리게 만드는 것입니다.

i>=n-1이면 done으로 가는 inverted guard를 씁니다.

왜 하는가
계속 조건 `i<n-1`이 참일 때 body로 fall-through하려면 거짓 조건에서만 탈출해야 합니다.
종이 산출물
`bge s2,t0,done # if i>=n-1 exit`
완료 조건
source 순서 s2=i, t0=n-1과 target done의 의미가 주석에 일치합니다.
막혔을 때 단계 힌트·대표 오류

힌트: `not(i<n-1)`을 비교 연산으로 바꾸세요.

이 단계의 대표 오류: `blt s2,t0,done`으로 계속해야 할 때 종료하거나 bge operand를 뒤집는 것입니다.

guard를 통과한 새 outer iteration마다 j를 0으로 초기화합니다.

왜 하는가
inner loop는 각 i에서 index 0부터 새로운 범위를 검사해야 합니다.
종이 산출물
`li s3,0 # j=0 for this outer iteration`
완료 조건
`li s3,0`이 outer guard 뒤, inner_loop 진입 전에 위치합니다.
막혔을 때 단계 힌트·대표 오류

힌트: 이 instruction이 inner loop 종료 뒤 다시 실행되는 control-flow path에 있는지 보세요.

이 단계의 대표 오류: j를 Prolog에서 한 번만 0으로 만들고 다음 outer iteration에서도 이전 j를 이어 쓰는 것입니다.

공식 답을 열기 전 마지막 회상

n=1이면 body가 한 번도 실행되지 않는 이유를 trace해 보세요.

내 풀이 후 공식 결론·이유·대표 함정 확인

공식 결론

`addi t0,s1,-1; bge s2,t0,done; li s3,0`.

왜 이 답이 되는가

Assembly loop는 보통 계속 조건의 반대를 써서 done으로 탈출합니다.

대표 함정

`blt i,n-1,body`도 가능하지만 label 구조가 달라집니다. 조건과 target의 의미를 함께 검산하세요.

명령어와 식을 줄 단위로 읽기

본문 속 code를 한 줄씩 분리했습니다. 각 줄에서 source, operation, destination을 표시하세요.

i < n-1
addi t0,s1,-1;
bge s2,t0,done;
li s3,0;

새 문제로 전이하기

세 문항은 앞 문장의 반복이 아닙니다. 직접 답을 입력하면 rubric의 필수 기준을 하나씩 검사하고, 첫 누락 기준을 알려 줍니다.

1. 개념 재구성

C `while (x < limit) { body; }`를 body fall-through와 done label을 쓰는 RISC-V 골격으로 바꾸고 조건 부정 과정을 설명하세요.

제출 후 모델 답 보기

`loop: bge x,limit,done; body; j loop; done:` 골격입니다. 계속 조건 `x<limit`을 부정하면 종료 조건 `x>=limit`이므로 bge가 taken일 때 done으로 갑니다.

2. 변형 문제

n=3, i=0에서 시작하는 `i<n-1` outer loop의 body 실행 i 값과 횟수를 쓰고, 각 실행 직전 j가 가져야 할 값을 적으세요.

제출 후 모델 답 보기

`n-1=2`이므로 body는 i=0과 i=1에서 총 2회 실행되고 i=2에서 종료합니다. 각 body/inner loop 진입 직전에 j=0으로 초기화되어야 합니다.

3. 오류 진단

학생은 `addi t0,s1,-1; bge t0,s2,done`을 썼습니다. n=5, i=0에서 첫 비교 오류와 control-flow 결과를 설명하고 고치세요.

제출 후 모델 답 보기

첫 오류는 bge의 operand를 뒤집은 것입니다. `t0=4`, `s2=0`이므로 잘못된 code는 `4>=0`으로 즉시 done에 갑니다. 올바른 code는 `bge s2,t0,done`으로 `i>=n-1`을 검사합니다.

이 소문제를 끝냈다고 말할 수 있는 기준

이 소문제의 정확한 공식 페이지와 대조하기

왼쪽은 문제를 읽을 때, 오른쪽은 자신의 풀이를 끝낸 뒤에 확인하세요. 해설 이미지를 먼저 보면 중간 과정을 스스로 만드는 연습이 사라집니다.

3-4 관련 공식 시험 또는 해설 페이지
exam-p07.png · 클릭해 원본 크기로 확인
3-4 관련 공식 시험 또는 해설 페이지
solution-p08.png · 클릭해 원본 크기로 확인
3-4 관련 공식 시험 또는 해설 페이지
solution-p10.png · 클릭해 원본 크기로 확인

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11 · SoSe26 Probeklausur 시험 p7 Aufgabe 3의 `i < n-1` outer loop와 공식 해설 p10의 `addi/bge/li` 구현 범위.