← Probeklausur overview

Aufgabe 3 · 8 Punkte · trace

C in RISC-V übersetzen

C variable을 register에 배치하고, array index를 byte offset으로 바꾸고, loop 조건을 ‘끝나면 탈출’ branch로 뒤집습니다. 다른 함수를 부르면 ra와 오래 살아야 하는 값을 stack/s-register로 보호합니다.

공식 시험지와 공식 Musterlösung을 기준으로 작성했습니다. 그림 문제는 렌더된 원본 페이지도 함께 대조합니다.

BEGINNER CONCEPT LESSON

문제 풀이 전에 개념부터 배우기

용어를 모르는 상태에서 답을 외우지 않도록, 비유·그림·작은 예제·시험용 풀이 알고리즘을 별도 수업으로 만들었습니다.

Aufgabe 3 개념 수업 열기 →

원본 그림과 공식 해설 그림

diagram 문제는 text만으로 대체하지 말고 아래 원본을 확대해 선·stage·field를 직접 확인하세요.

MICRO WORK UNITS

6개 작업 단위로 학습

각 카드는 요구사항 → zero-base 개념 → 손풀이 단계 → 공식 결론 → 함정 → active recall 순서입니다.

3-1`swap`: 두 주소 계산

문제가 요구하는 것

`arr[i]`와 `arr[j]`의 주소를 만드세요.

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-1 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

`int` 하나는 4 Byte이므로 index×4가 byte offset입니다. `slli index,2`는 4배와 같습니다.

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. i를 2 bit left shift합니다.
  2. arr base를 더해 &arr[i]를 만듭니다.
  3. j도 같은 방식으로 &arr[j]를 만듭니다.
  4. 두 주소를 동시에 잃지 않도록 다른 temporary를 씁니다.

4. 정답을 닫고 스스로 설명하기

64-bit long array라면 index scaling은 어떻게 달라지나요?

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11

3-2`swap`: load 두 번, store 두 번

문제가 요구하는 것

두 원소를 실제로 바꾸세요.

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-2 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

교환은 첫 값을 temporary에 보존해야 합니다. 먼저 두 값을 모두 load하고, 반대 주소로 store합니다.

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. arr[i]를 t1에 load합니다.
  2. arr[j]를 t3에 load합니다.
  3. t3를 arr[i] 주소에 store합니다.
  4. t1을 arr[j] 주소에 store합니다.
  5. leaf function이므로 ret합니다.

4. 정답을 닫고 스스로 설명하기

두 index가 같아도 이 code가 안전한 이유는 무엇인가요?

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11

3-3`bubbleSort` Prolog

문제가 요구하는 것

swap을 부르기 전에 무엇을 stack에 저장해야 하나요?

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-3 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

`jal`은 ra를 덮고 caller-saved t/a register는 보존되지 않습니다. bubbleSort의 arr,n,i,j는 swap 뒤에도 필요하므로 s0–s3에 두고, callee인 bubbleSort가 원래 s-register 값을 저장합니다.

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. 16-byte alignment를 만족하는 frame 크기를 고릅니다.
  2. ra와 s0–s3를 stack에 저장합니다.
  3. a0→s0, a1→s1로 옮깁니다.
  4. i를 s2=0으로 초기화합니다.

4. 정답을 닫고 스스로 설명하기

왜 swap을 호출하지 않는 leaf function은 ra를 저장하지 않아도 될 수 있나요?

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11

3-4바깥 loop 조건

문제가 요구하는 것

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

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-4 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

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

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. n-1을 temporary에 계산합니다.
  2. i>=n-1이면 done으로 갑니다.
  3. 새 바깥 반복마다 j=0으로 초기화합니다.

4. 정답을 닫고 스스로 설명하기

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

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11

3-5안쪽 loop와 비교

문제가 요구하는 것

`j < n-i-1`과 `arr[j] > arr[j+1]`을 구현하세요.

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-5 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

매 반복에서 현재 upper bound를 계산하고, 이웃 두 word는 같은 base address에서 offset 0과 4로 읽을 수 있습니다.

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. n-i-1을 t0에 계산합니다.
  2. j>=bound이면 outer_inc로 갑니다.
  3. j×4와 arr base로 &arr[j]를 만듭니다.
  4. 0(t1), 4(t1)에서 이웃 값을 읽습니다.
  5. arr[j]<=arr[j+1]이면 swap을 건너뜁니다.

4. 정답을 닫고 스스로 설명하기

왜 bubble sort의 안쪽 upper bound는 반복마다 1씩 줄어드나요?

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11

3-6swap 호출과 Epilog

문제가 요구하는 것

argument를 놓고 swap을 호출한 뒤 loop와 function을 끝내세요.

이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.

📖 3-6 독립 개념·풀이 페이지 열기 →

0. 이 소문제에 필요한 핵심 개념

ABI에서 첫 세 argument는 a0,a1,a2입니다. s0–s3는 호출 뒤에도 유지되어 loop 상태를 계속 쓸 수 있습니다.

✎ 작은 예로 먼저 손풀기
index 0, 1, 2의 작은 array와 loop 두 번만 손으로 실행해 보세요.
✓ 무엇을 확인해야 하나
register 표, stack 전후 sp, branch의 참/거짓 target을 각각 대조하세요.

1. 이번 시험 문제에서 실제로 밟는 단계

  1. a0=arr, a1=j, a2=j+1을 만듭니다.
  2. `jal ra,swap`을 실행합니다.
  3. j를 증가하고 inner_loop로 돌아갑니다.
  4. inner loop 종료 후 i를 증가합니다.
  5. done에서 s-register와 ra를 복원하고 sp를 되돌립니다.

4. 정답을 닫고 스스로 설명하기

Epilog에서 sp를 먼저 복원한 뒤 load하면 왜 잘못되나요?

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11