---
schema_version: 1
exam_id: "sose26-probeklausur"
aufgabe: 3
unit_id: "3-3"
source_group_id: "3"
official_exam: true
official_solution: true
language: "ko"
---

# 3-3 — `bubbleSort` Prolog

> **학습 목표:** 다른 함수를 호출하는 `bubbleSort`에서 ra와 s0–s3를 16-Byte aligned stack frame에 저장하고 장기 생존 값을 callee-saved register로 옮긴다.
>
> **왜 따로 배우는가:** 함수 call 경계는 register 값의 생존 규칙이 바뀌는 지점입니다. loop state를 caller-saved a/t register에 그대로 두면 `swap` 호출 뒤 사라질 수 있고, s-register를 쓰면서 원래 값을 저장하지 않으면 caller의 상태를 깨뜨립니다.
>
> **범위:** Aufgabe 3 · 8점 Aufgabe의 최소 학습 단위 · 시험 p7–8 · 공식 해설 p8–11

## 1. 문제 원문 (Deutsch)

이 unit은 공식 Teilaufgabe 또는 표의 한 행·한 access를 학습 가능한 최소 단위로 다시 나눈 것입니다. 아래 전사는 source group `3`의 공식 독일어 문제 원문이며, 페이지 이미지를 바로 뒤에 함께 두어 코드·표·도식을 대조할 수 있게 했습니다.

~~~text
Aufgabe 3: C in RISC-V übersetzen

void swap(int *arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void bubbleSort(int *arr, int n)
{
    for (int i = 0; i < n - 1; i++){
        for (int j = 0; j < n - i - 1; j++){
            if (arr[j] > arr[j + 1])
                swap(arr, j, j + 1);
        }
    }
}

Implementieren Sie die vorgestellten Funktionen in Assembler. Der von Ihnen geschriebenen Code muss die gleiche Funktionalität haben und möglichst nah an der Implementierung von C sein.

Hinweise:

• Es ist garantiert, dass das Array arr mindestens ein Element enthält.
• Variable n speichert die Länge von arr.
• Verwenden Sie innerhalb der Funktionen folgende Registerbelegung zur Speicherung der Variablen: s0 = arr, s1 = n, s2 = i, s3 = j
• Jede Funktion muss man als Unterprogramm betrachten.

Lösung:
~~~

![공식 시험 원문 — exam-p07.png](../../assets/exam-p07.png)

*공식 시험 원문: `exam-p07.png` · Probeklausur.pdf · PDF p.7*

![공식 시험 원문 — exam-p08.png](../../assets/exam-p08.png)

*공식 시험 원문: `exam-p08.png` · Probeklausur.pdf · PDF p.8*

### 이 unit에서 풀 항목

swap을 부르기 전에 무엇을 stack에 저장해야 하나요?

## 2. 쉬운 한국어 해석

문제 3: C를 RISC-V로 번역하기

void swap(int *arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void bubbleSort(int *arr, int n)
{
    for (int i = 0; i < n - 1; i++){
        for (int j = 0; j < n - i - 1; j++){
            if (arr[j] > arr[j + 1])
                swap(arr, j, j + 1);
        }
    }
}

위에 제시된 함수들을 어셈블리로 구현하시오. 작성한 코드는 C 구현과 동일한 기능을 가져야 하며, 가능한 한 C 구현에 가깝게 작성해야 한다.

주의사항:

• 배열 arr에는 적어도 한 개의 원소가 있음이 보장된다.
• 변수 n에는 배열 arr의 길이가 저장되어 있다.
• 함수 안에서 변수를 저장할 때 다음 레지스터 배치를 사용하시오: s0 = arr, s1 = n, s2 = i, s3 = j.
• 각 함수는 하나의 서브루틴으로 간주해야 한다.

답안:

### 이 unit에 해당하는 최소 작업

swap을 부르기 전에 무엇을 stack에 저장해야 하나요?

이 문제에서 최종 결과만 맞히는 것보다 중요한 것은 `3-3`에 필요한 중간 판단을 답안지에 남기는 것입니다.

## 3. 무엇을 묻는 문제인가

### 공식 문제의 요구사항

- C 함수 swap을 동일한 동작의 RISC-V 어셈블리 서브루틴으로 구현한다.
- C 함수 bubbleSort를 중첩 반복문, 조건문, swap 호출까지 보존하여 RISC-V 어셈블리로 구현한다.
- 배열 원소 주소 계산, 함수 호출, 레지스터 보존, 반환 동작을 포함해 C 의미와 RISC-V 호출 규약을 함께 만족시킨다.

### 조건과 제약

- arr에는 최소 한 원소가 있다.
- n은 arr의 길이이다.
- 함수 내부 변수 배치는 s0=arr, s1=n, s2=i, s3=j로 지정되어 있다.
- swap과 bubbleSort를 각각 독립적인 Unterprogramm으로 취급한다.
- 작성한 어셈블리의 기능은 C와 같아야 하며 가능한 한 C 구조에 가깝게 작성해야 한다.

### 원문 오탈자·도식 관련 주의

- 시험 PDF p7에 문제와 코드가 있고 p8은 'Lösung:'만 있는 빈 답안 페이지이다.
- 원문의 'Jede Funktion muss man als Unterprogramm betrachten.'는 다소 어색한 독일어 표현이지만 의미를 수정하지 않고 보존했다.
- [문제–공식 해설 차이] 원문은 'innerhalb der Funktionen'에서 s0=arr, s1=n, s2=i, s3=j를 사용하라고 읽히지만, 공식 swap 해설은 a/t-register만 사용하고 이 지정 배치를 bubbleSort의 장기 상태에 적용한다. 공식 코드는 ABI상 유효하나 문구를 문자 그대로 적용한 답과는 차이가 있다.
- 코드 들여쓰기는 PDF 시각 확인 결과에 맞춰 정리했으며 식, 조건, 레지스터 이름과 상수는 변경하지 않았다.

### 도식 시각 확인 상태

- **도식 의존 여부:** 이 최소 unit의 핵심 판정은 텍스트·수식·코드로 재현할 수 있습니다.
- **공식 페이지 상태:** exam-p07.png, exam-p08.png, solution-p08.png, solution-p09.png가 원문 대조용으로 렌더되어 연결되어 있습니다.

### 이 unit의 학습 목표

- **관찰 가능한 목표:** 다른 함수를 호출하는 `bubbleSort`에서 ra와 s0–s3를 16-Byte aligned stack frame에 저장하고 장기 생존 값을 callee-saved register로 옮긴다.
- **출제 의도:** 함수 call 경계는 register 값의 생존 규칙이 바뀌는 지점입니다. loop state를 caller-saved a/t register에 그대로 두면 `swap` 호출 뒤 사라질 수 있고, s-register를 쓰면서 원래 값을 저장하지 않으면 caller의 상태를 깨뜨립니다.
- **공식 근거 범위:** SoSe26 Probeklausur 시험 p7 Aufgabe 3 `bubbleSort` Prolog 요구와 공식 해설 p9의 32-Byte frame·ra/s0–s3 저장·초기 register 배정 범위.
- **Aufgabe 공통 선수지식:** C variable을 register에 배치하고, array index를 byte offset으로 바꾸고, loop 조건을 ‘끝나면 탈출’ branch로 뒤집습니다. 다른 함수를 부르면 ra와 오래 살아야 하는 값을 stack/s-register로 보호합니다.

## 4. 선수 개념과 핵심 용어

### Prolog

- **뜻:** 함수 시작에서 stack frame을 만들고 보존할 register를 저장하는 instruction 묶음입니다.
- **이 문제에서:** `addi sp,sp,-32` 뒤 ra와 s0–s3를 저장합니다.

### callee-saved register

- **뜻:** 함수가 사용하면 반환 전에 원래 값을 복원해야 하는 s-register입니다.
- **이 문제에서:** arr, n, i, j를 swap 호출 뒤에도 유지하려고 s0–s3에 두고 기존 값을 stack에 보존합니다.

### ra

- **뜻:** jal이 `PC+4`를 기록하는 return address register x1입니다.
- **이 문제에서:** bubbleSort가 swap을 호출하면 자신의 caller로 돌아갈 ra가 덮이므로 stack에 저장합니다.

### stack alignment

- **뜻:** ABI call boundary에서 sp가 요구된 배수, 여기서는 16 Byte에 맞는 조건입니다.
- **이 문제에서:** 실사용 20 Byte를 그대로 -20 하지 않고 32-Byte frame을 선택합니다.

### 이 문제에 적용할 풀이 규칙

### 규칙 1. call 뒤 생존성 규칙

호출 뒤에도 필요한 값은 caller-saved a/t register에만 의존하지 말고 s-register 또는 stack에 보존합니다.

- **시험지에 남길 것:** 각 variable 옆에 `swap 뒤 필요?`를 표시하고 필요하면 s0–s3에 배정합니다.

### 규칙 2. callee-saved 대칭 규칙

bubbleSort가 s0–s3를 자신의 값에 사용하려면 incoming 원래 s0–s3를 Prolog에서 저장하고 Epilog에서 복원해야 합니다.

- **시험지에 남길 것:** 저장 목록과 복원 목록을 같은 순서의 표로 만듭니다.

### 규칙 3. frame round-up 규칙

저장 data가 20 Byte여도 sp alignment를 유지하도록 frame 크기를 다음 16의 배수인 32 Byte로 올립니다.

- **시험지에 남길 것:** `5 regs×4=20 → round up 32` 계산을 남깁니다.

### 공식 문제 전에 푸는 작은 유사 예제

**문제:** 함수 f가 다른 함수를 호출하며 ra, s0, s1을 사용한다. RV32에서 16-Byte alignment를 지키는 최소 Prolog를 작성하세요.

**주어진 것**

- register 하나는 4 Byte입니다.
- 기존 ra, s0, s1을 보존해야 합니다.

### 예제 단계 1. 필요 저장 공간을 계산하고 frame을 round up합니다.

- **왜:** 3×4=12 Byte지만 sp는 16의 배수만큼 이동해야 합니다.
- **종이에:** `12 Byte → frame 16 Byte`

### 예제 단계 2. sp를 먼저 감소시킵니다.

- **왜:** 새 frame 안의 유효한 주소를 만든 뒤 store해야 합니다.
- **종이에:** `addi sp,sp,-16`

### 예제 단계 3. 서로 겹치지 않는 offset에 세 register를 저장합니다.

- **왜:** 각 원본을 Epilog에서 독립적으로 복원할 수 있어야 합니다.
- **종이에:** `sw ra,0(sp); sw s0,4(sp); sw s1,8(sp)`

**예제 정답:** `addi sp,sp,-16; sw ra,0(sp); sw s0,4(sp); sw s1,8(sp)`입니다.

**독립 검산:** 사용 offset 0,4,8이 frame `0…15` 안에 있고 새 sp도 16-Byte aligned인지 확인합니다.

## 5. 공식 정답 요약

**공식 결론:** 공식안: `addi sp,sp,-32`, `sw ra,0(sp)`, `sw s0,4(sp)` … `sw s3,16(sp)`, 그 뒤 s0=arr, s1=n, s2=0.

### 시험지 문장별 정답 해설

아래는 시험지의 항목 순서를 그대로 유지합니다. 각 항목에서 원문 → 한국어 번역 → 정답 → 판단 근거 → 실제로 쓸 답을 바로 이어서 읽으세요.



### 현재 소문제의 요구·판단·답을 한 흐름으로 연결

### `3-3`에서 정확히 답할 대상

- **시험지가 요구하는 답:** swap을 부르기 전에 무엇을 stack에 저장해야 하나요?
- **이 소문제의 공식 답:** 공식안: `addi sp,sp,-32`, `sw ra,0(sp)`, `sw s0,4(sp)` … `sw s3,16(sp)`, 그 뒤 s0=arr, s1=n, s2=0.

### 판단 1. ra와 s0–s3 저장에 필요한 공간을 계산하고 32-Byte frame을 선택합니다.

- **왜:** 5개 register는 20 Byte지만 call boundary의 16-Byte sp alignment를 유지해야 합니다.
- **이 판단에서 답안지에 남길 것:** `5×4=20; align16 → frame=32; addi sp,sp,-32`

### 판단 2. ra와 기존 s0–s3를 새 stack frame에 저장합니다.

- **왜:** swap 호출은 ra를 덮고 bubbleSort가 사용하는 s-register는 caller에게 원래 값으로 돌려줘야 합니다.
- **이 판단에서 답안지에 남길 것:** `sw ra,0(sp); sw s0,4(sp); sw s1,8(sp); sw s2,12(sp); sw s3,16(sp)`

### 판단 3. 입력 arr와 n을 a0/a1에서 s0/s1으로 옮깁니다.

- **왜:** swap 호출 뒤에도 전체 sorting 동안 필요한 값은 caller-saved argument register에만 둘 수 없습니다.
- **이 판단에서 답안지에 남길 것:** `mv s0,a0  # arr; mv s1,a1  # n`

### 판단 4. 바깥 loop index i를 s2=0으로 초기화합니다.

- **왜:** i는 여러 swap 호출과 inner loop를 거쳐 살아야 하므로 callee-saved register에 둡니다.
- **이 판단에서 답안지에 남길 것:** `li s2,0  # i=0`

### 위 판단이 최종 답으로 이어지는 이유

`jal`은 ra를 덮고 caller-saved t/a register는 보존되지 않습니다. bubbleSort의 arr,n,i,j는 swap 뒤에도 필요하므로 s0–s3에 두고, callee인 bubbleSort가 원래 s-register 값을 저장합니다.

### 답안 작성 시 주의

저장할 값은 20 Byte지만 frame을 -20으로 만들면 16-byte alignment가 깨집니다.

![공식 Musterlösung/Hinweise — solution-p08.png](../../assets/solution-p08.png)

*공식 Musterlösung/Hinweise: `solution-p08.png` · Probeklausur Musterlösung und Hinweise.pdf · PDF p.8*

![공식 Musterlösung/Hinweise — solution-p09.png](../../assets/solution-p09.png)

*공식 Musterlösung/Hinweise: `solution-p09.png` · Probeklausur Musterlösung und Hinweise.pdf · PDF p.9*

## 6. 풀이 전략

1. 16-byte alignment를 만족하는 frame 크기를 고릅니다.
2. ra와 s0–s3를 stack에 저장합니다.
3. a0→s0, a1→s1로 옮깁니다.
4. i를 s2=0으로 초기화합니다.

## 7. 단계별 상세 풀이

### 단계 1. ra와 s0–s3 저장에 필요한 공간을 계산하고 32-Byte frame을 선택합니다.

- **이유:** 5개 register는 20 Byte지만 call boundary의 16-Byte sp alignment를 유지해야 합니다.
- **종이에 남길 것:** `5×4=20; align16 → frame=32; addi sp,sp,-32`
- **완료 기준:** frame 크기 32와 선택 근거가 모두 적혀 있습니다.
- **막힐 때 힌트:** 20 이상인 가장 작은 16의 배수를 찾으세요.
- **가장 흔한 첫 오류:** `addi sp,sp,-20`으로 필요한 Byte만 정확히 빼 alignment를 깨는 것입니다.

### 단계 2. ra와 기존 s0–s3를 새 stack frame에 저장합니다.

- **이유:** swap 호출은 ra를 덮고 bubbleSort가 사용하는 s-register는 caller에게 원래 값으로 돌려줘야 합니다.
- **종이에 남길 것:** `sw ra,0(sp); sw s0,4(sp); sw s1,8(sp); sw s2,12(sp); sw s3,16(sp)`
- **완료 기준:** 다섯 register가 겹치지 않는 4-Byte offset에 한 번씩 저장되어 있습니다.
- **막힐 때 힌트:** sp를 감소시킨 뒤의 새 sp를 기준으로 offset을 쓰세요.
- **가장 흔한 첫 오류:** 새 s0 값을 먼저 쓴 뒤 원래 s0를 저장해 caller 값이 사라지는 것입니다.

### 단계 3. 입력 arr와 n을 a0/a1에서 s0/s1으로 옮깁니다.

- **이유:** swap 호출 뒤에도 전체 sorting 동안 필요한 값은 caller-saved argument register에만 둘 수 없습니다.
- **종이에 남길 것:** `mv s0,a0  # arr; mv s1,a1  # n`
- **완료 기준:** variable map에 s0=arr, s1=n이 표시되어 있습니다.
- **막힐 때 힌트:** a0–a2는 swap argument를 놓을 때 덮일 예정입니다.
- **가장 흔한 첫 오류:** arr와 n을 계속 a0/a1에서 읽어 swap 호출 후에도 유지된다고 가정하는 것입니다.

### 단계 4. 바깥 loop index i를 s2=0으로 초기화합니다.

- **이유:** i는 여러 swap 호출과 inner loop를 거쳐 살아야 하므로 callee-saved register에 둡니다.
- **종이에 남길 것:** `li s2,0  # i=0`
- **완료 기준:** s2의 의미와 초기값 0이 register map에 있습니다.
- **막힐 때 힌트:** 공식 register 배정에서 s3는 inner index j에 사용됩니다.
- **가장 흔한 첫 오류:** i를 t-register에 두고 swap이 보존해 줄 것이라 믿는 것입니다.

## 8. 문제와 공식 해설의 비교·검증

- **문제가 요구하는 것:** swap을 부르기 전에 무엇을 stack에 저장해야 하나요?
- **공식 해설이 제시하는 결론:** 공식안: `addi sp,sp,-32`, `sw ra,0(sp)`, `sw s0,4(sp)` … `sw s3,16(sp)`, 그 뒤 s0=arr, s1=n, s2=0.
- **결론을 재현하는 핵심 논리:** `jal`은 ra를 덮고 caller-saved t/a register는 보존되지 않습니다. bubbleSort의 arr,n,i,j는 swap 뒤에도 필요하므로 s0–s3에 두고, callee인 bubbleSort가 원래 s-register 값을 저장합니다.
- **검증 방법:** 위 micro-step의 `종이에 남길 것`을 순서대로 만들고 각 `완료 기준`을 확인합니다. 최종 산출물이 공식 결론과 같은지 대조합니다.
- **전제와 주의 범위:** 저장할 값은 20 Byte지만 frame을 -20으로 만들면 16-byte alignment가 깨집니다.
- **채택할 시험 답:** 이 가이드에서는 공식 Musterlösung의 결론을 시험 답으로 유지하며, 일반 ISA 또는 다른 구현과 달라질 수 있는 부분은 위 전제와 주의 범위에서 분리합니다.

## 9. 시험장에서 쓸 최종 답안

공식안: `addi sp,sp,-32`, `sw ra,0(sp)`, `sw s0,4(sp)` … `sw s3,16(sp)`, 그 뒤 s0=arr, s1=n, s2=0.

아래는 이 unit의 register/label 전제를 모두 포함한 완성 답안입니다. 현재 unit에서 다룬 block을 위 micro-step과 대조하세요.

```asm
swap:
    slli t0, a1, 2
    add  t0, a0, t0
    lw   t1, 0(t0)
    slli t2, a2, 2
    add  t2, a0, t2
    lw   t3, 0(t2)
    sw   t3, 0(t0)
    sw   t1, 0(t2)
    ret

bubbleSort:
    addi sp, sp, -32
    sw   ra, 0(sp)
    sw   s0, 4(sp)
    sw   s1, 8(sp)
    sw   s2, 12(sp)
    sw   s3, 16(sp)
    mv   s0, a0
    mv   s1, a1
    addi s2, zero, 0

outer_loop:
    addi t0, s1, -1
    bge  s2, t0, done
    li   s3, 0

inner_loop:
    sub  t0, s1, s2
    addi t0, t0, -1
    bge  s3, t0, outer_inc
    slli t1, s3, 2
    add  t1, s0, t1
    lw   t2, 0(t1)
    lw   t3, 4(t1)
    ble  t2, t3, inner_inc
    mv   a0, s0
    mv   a1, s3
    addi a2, s3, 1
    jal  ra, swap

inner_inc:
    addi s3, s3, 1
    j    inner_loop

outer_inc:
    addi s2, s2, 1
    j    outer_loop

done:
    lw   ra, 0(sp)
    lw   s0, 4(sp)
    lw   s1, 8(sp)
    lw   s2, 12(sp)
    lw   s3, 16(sp)
    addi sp, sp, 32
    ret
```

답안지에는 결과만 쓰지 말고, 7절의 중간 산출물 가운데 판정을 증명하는 식·bit field·register 상태·cycle·cache 상태를 함께 남기세요.

## 10. 자주 하는 실수와 검산 체크리스트

### 대표 실수

- 저장할 값은 20 Byte지만 frame을 -20으로 만들면 16-byte alignment가 깨집니다.
- `addi sp,sp,-20`으로 필요한 Byte만 정확히 빼 alignment를 깨는 것입니다.
- 새 s0 값을 먼저 쓴 뒤 원래 s0를 저장해 caller 값이 사라지는 것입니다.
- arr와 n을 계속 a0/a1에서 읽어 swap 호출 후에도 유지된다고 가정하는 것입니다.
- i를 t-register에 두고 swap이 보존해 줄 것이라 믿는 것입니다.

### 빠른 self-check

- **회상 질문:** 왜 swap을 호출하지 않는 leaf function은 ra를 저장하지 않아도 될 수 있나요?
- [ ] call 뒤에도 살아야 하는 각 variable을 caller/callee-saved 규칙에 따라 배치할 수 있다.
- [ ] 저장 register 수로 필요한 Byte를 계산하고 16-Byte aligned frame으로 올릴 수 있다.

## 11. 짧은 확인 문제와 전이 연습

### 개념 재구성

**문제:** non-leaf 함수가 ra를 저장해야 하는 이유와 s-register의 저장/복원 책임을 caller-saved a/t와 비교해 설명하세요.

**힌트:** 누가 값을 덮을 수 있고 누가 원래 값을 돌려줘야 하는지 분리하세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** non-leaf 함수가 jal로 다른 함수를 호출하면 ra가 새 `PC+4`로 덮이므로 자신의 caller에게 돌아갈 ra를 저장해야 합니다. s-register는 callee-saved라 사용한 함수가 원래 값을 저장/복원합니다. a/t는 caller-saved라 호출 뒤 필요한 값은 caller가 미리 s-register나 stack으로 옮겨야 합니다.

**채점 기준**
  - non-leaf
  - jal
  - ra
  - pc+4
  - callee-saved
  - 저장/복원
  - caller-saved
  - a/t
  - stack

</details>

### 변형 문제

**문제:** 함수 g가 다른 함수를 호출하고 ra, s0, s1, s2를 보존해야 한다. RV32, 16-Byte alignment에서 최소 frame 크기와 Prolog store를 작성하세요.

**힌트:** 4개 register는 정확히 몇 Byte인지 계산하세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** 4개 register는 16 Byte이므로 frame은 16 Byte입니다. Prolog는 `addi sp,sp,-16; sw ra,0(sp); sw s0,4(sp); sw s1,8(sp); sw s2,12(sp)`입니다.

**채점 기준**
  - 16 byte
  - addi sp,sp,-16
  - sw ra,0(sp)
  - sw s0,4(sp)
  - sw s1,8(sp)
  - sw s2,12(sp)

</details>

### 오답 진단

**문제:** 학생 Prolog는 `addi sp,sp,-20` 뒤 ra와 s0–s3를 저장합니다. 모든 store가 frame 안인데도 ABI 관점에서 첫 오류가 무엇인지, 올바른 frame은 얼마인지 쓰세요.

**힌트:** 필요 공간과 alignment 조건은 서로 다른 검사입니다.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** 첫 오류는 frame이 충분한지만 보고 16-Byte stack alignment를 무시한 것입니다. -20은 새 sp를 16의 배수 경계에서 벗어나게 하므로 20 Byte를 다음 배수로 round up한 32-Byte frame, 즉 `addi sp,sp,-32`를 사용해야 합니다.

**채점 기준**
  - 16-byte stack alignment
  - -20
  - round up
  - 32-byte frame
  - addi sp,sp,-32

</details>

## 12. 근거 자료

- `[문제 출처] current:Probeklausur.pdf` — 시험 p7–8 · 공식 해설 p8–11
- `[공식 해설] current:Probeklausur Musterlösung und Hinweise.pdf` — 시험 p7–8 · 공식 해설 p8–11
- `[정확한 원문 group] 3` — 시험 p.7, p.8 · 공식 해설 p.8, p.9, p.10, p.11
- `[소문항 범위] SoSe26 Probeklausur 시험 p7 Aufgabe 3 `bubbleSort` Prolog 요구와 공식 해설 p9의 32-Byte frame·ra/s0–s3 저장·초기 register 배정 범위.`
- `[개념 근거 · file-level] current:Vorlesung/Rechnerorganisation - Teil 1.pdf` — RISC-V assembler와 C translation
- `[개념 근거 · file-level] current:Uebung/Übung 2 Musterlösung/Rechnerorganisation_Übung2_Lösung.pdf` — assembler programming과 array access
- `[개념 근거 · file-level] current:Uebung/Übung 3 Musterlösung.pdf` — calling convention과 stack frame
- `[개념 근거 · file-level] current:Uebung/RISC-V Reference.pdf` — instruction과 ABI register 이름

### 이 파일에서 직접 대조한 공식 이미지

- `exam-p07.png` — Probeklausur.pdf · PDF p.7
- `exam-p08.png` — Probeklausur.pdf · PDF p.8
- `solution-p08.png` — Probeklausur Musterlösung und Hinweise.pdf · PDF p.8
- `solution-p09.png` — Probeklausur Musterlösung und Hinweise.pdf · PDF p.9

정확한 강의 슬라이드 한 페이지를 확정하지 못한 개념 자료는 `file-level`로 표시했습니다. 페이지 번호를 추측해서 만들지 않았습니다.
