왜 이 소문제를 따로 배우는가
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 증가합니다.
- bound n-1을 계산합니다.
모든 guard에서 비교할 고정 upper bound를 얻습니다.
종이 산출물: `t0=5-1=4`
- i=0,1,2,3에서 bge 결과를 확인합니다.
이 값들은 모두 4보다 작아 branch가 taken되지 않고 body를 실행합니다.
종이 산출물: `0>=4 F, 1>=4 F, 2>=4 F, 3>=4 F → body 4회`
- 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 골격으로 바꾸고 조건 부정 과정을 설명하세요.
`not(x<limit)`은 어떤 비교인지 쓰세요.
제출 후 모델 답 보기
`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가 가져야 할 값을 적으세요.
bound는 2입니다.
제출 후 모델 답 보기
`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가 둘째보다 크거나 같을 때 branch합니다.
제출 후 모델 답 보기
첫 오류는 bge의 operand를 뒤집은 것입니다. `t0=4`, `s2=0`이므로 잘못된 code는 `4>=0`으로 즉시 done에 갑니다. 올바른 code는 `bge s2,t0,done`으로 `i>=n-1`을 검사합니다.
이 소문제를 끝냈다고 말할 수 있는 기준
이 소문제의 정확한 공식 페이지와 대조하기
왼쪽은 문제를 읽을 때, 오른쪽은 자신의 풀이를 끝낸 뒤에 확인하세요. 해설 이미지를 먼저 보면 중간 과정을 스스로 만드는 연습이 사라집니다.
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` 구현 범위.


