---
schema_version: 1
exam_id: "sose26-probeklausur"
aufgabe: 4
unit_id: "4b"
source_group_id: "4"
official_exam: true
official_solution: true
language: "ko"
---

# 4b — 올바른 magicBox 재작성

> **학습 목표:** magicBox의 C 의미를 유지하면서 16 Byte aligned frame, register 보존, argument 전달, a0 반환을 만족하는 RISC-V 함수를 작성할 수 있다.
>
> **왜 따로 배우는가:** 오류를 찾는 것과 올바른 함수를 처음부터 구성하는 것은 다른 능력입니다. 이 소문제는 값의 lifetime을 register와 stack에 실제로 배치하는 설계 능력을 평가합니다.
>
> **범위:** Aufgabe 4 · 8점 Aufgabe의 최소 학습 단위 · 시험 p9 · 공식 해설 p21–22

## 1. 문제 원문 (Deutsch)

이 unit은 공식 Teilaufgabe 또는 표의 한 행·한 access를 학습 가능한 최소 단위로 다시 나눈 것입니다. 아래 전사는 source group `4`의 공식 독일어 문제 원문이며, 페이지 이미지를 바로 뒤에 함께 두어 코드·표·도식을 대조할 수 있게 했습니다.

~~~text
Aufgabe 4: Fehler identifizieren und korrigieren

Gegeben ist eine Funktion in C, sowie ihre Übersetzung in Assemblersprache.

int magicBox(int a, int b) {
    int c = a + 10;
    int d = helper(b, c);
    return d + a;
}

magicBox:
    addi sp, sp, -14
    sw ra, 0(sp)
    mv t0, a0
    addi s1, a0, 10
    mv a0, a1
    mv a1, s1
    jal ra, helper
    add a1, a0, t0
    lw ra, 0(sp)
    addi sp, sp, 14
    ret

Beantworten Sie die folgenden Fragen im Kontext der RISC-V Architektur:

a) Nennen Sie alle Konventionen, gegen die die Übersetzung des C-Codes verstößt.

b) Übersetzen Sie diese Funktion korrekt.

Gehen Sie davon aus, dass die Funktion helper bereits existiert und sich an die RISC-V-Aufrufkonventionen hält.

Lösung:
~~~

![공식 시험 원문 — exam-p09.png](../../assets/exam-p09.png)

*공식 시험 원문: `exam-p09.png` · Probeklausur.pdf · PDF p.9*

### 이 unit에서 풀 항목

공식 ABI를 지키는 code를 완성하세요.

## 2. 쉬운 한국어 해석

문제 4: 오류 식별 및 수정

C로 작성된 함수와 이 함수를 어셈블리 언어로 번역한 코드가 주어져 있다.

int magicBox(int a, int b) {
    int c = a + 10;
    int d = helper(b, c);
    return d + a;
}

magicBox:
    addi sp, sp, -14
    sw ra, 0(sp)
    mv t0, a0
    addi s1, a0, 10
    mv a0, a1
    mv a1, s1
    jal ra, helper
    add a1, a0, t0
    lw ra, 0(sp)
    addi sp, sp, 14
    ret

RISC-V 아키텍처의 맥락에서 다음 질문에 답하시오.

a) 이 C 코드의 번역이 위반하는 모든 규약을 쓰시오.

b) 이 함수를 올바르게 번역하시오.

함수 helper는 이미 존재하며 RISC-V 호출 규약을 준수한다고 가정한다.

답안:

### 이 unit에 해당하는 최소 작업

공식 ABI를 지키는 code를 완성하세요.

이 문제에서 최종 결과만 맞히는 것보다 중요한 것은 `4b`에 필요한 중간 판단을 답안지에 남기는 것입니다.

## 3. 무엇을 묻는 문제인가

### 공식 문제의 요구사항

- 주어진 잘못된 어셈블리에서 위반한 RISC-V 호출 규약을 모두 식별한다.
- 각 위반을 수정하여 magicBox의 C 의미와 RISC-V ABI를 모두 만족하는 완성 어셈블리 코드를 작성한다.

### 조건과 제약

- helper는 이미 구현되어 있고 RISC-V 호출 규약을 지킨다.
- 오류 분석과 수정은 RISC-V Architektur 및 Aufrufkonventionen을 기준으로 한다.
- 주어진 -14 stack 조정, t0와 s1 사용, helper 호출 뒤 값 보존, 반환 레지스터를 원문 그대로 검사해야 하며 문제 코드를 먼저 고쳐 적어서는 안 된다.

### 원문 오탈자·도식 관련 주의

- 시험지에서는 C 코드와 어셈블리 코드가 좌우 두 열로 배치되어 있다. original_de에서는 내용 손실 없이 두 코드 블록을 순서대로 직렬화했다.
- addi sp, sp, -14와 addi sp, sp, 14는 의도적으로 포함된 오류이므로 수정하지 않고 원문에 보존했다.
- PDF 텍스트 계층의 'identiﬁzieren' ligature는 시각적으로 확인한 표준 철자 'identifizieren'으로만 정규화했다.

### 도식 시각 확인 상태

- **도식 의존 여부:** 이 최소 unit의 핵심 판정은 텍스트·수식·코드로 재현할 수 있습니다.
- **공식 페이지 상태:** exam-p09.png, solution-p21.png, solution-p22.png가 원문 대조용으로 렌더되어 연결되어 있습니다.

### 이 unit의 학습 목표

- **관찰 가능한 목표:** magicBox의 C 의미를 유지하면서 16 Byte aligned frame, register 보존, argument 전달, a0 반환을 만족하는 RISC-V 함수를 작성할 수 있다.
- **출제 의도:** 오류를 찾는 것과 올바른 함수를 처음부터 구성하는 것은 다른 능력입니다. 이 소문제는 값의 lifetime을 register와 stack에 실제로 배치하는 설계 능력을 평가합니다.
- **공식 근거 범위:** Probeklausur.pdf 시험 p9 Teilaufgabe b와 Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p21의 수정 code, p22의 RISC-V convention 표.
- **Aufgabe 공통 선수지식:** 함수 호출 전후를 경계로 봅니다. 호출 뒤에도 필요한 a는 caller-saved t-register가 아니라 보존된 s-register/stack에 있어야 하며, callee가 s-register를 쓰면 원래 값을 돌려줘야 합니다.

## 4. 선수 개념과 핵심 용어

### stack frame

- **뜻:** 한 함수 호출 동안 저장 register와 지역 상태를 보관하도록 sp 아래에 확보한 영역입니다.
- **이 문제에서:** ra, s0, s1을 서로 겹치지 않는 offset에 저장하고 16 Byte 크기로 잡을 때 사용합니다.

### prolog

- **뜻:** 함수 시작에서 frame을 만들고 보존해야 할 register를 저장하는 부분입니다.
- **이 문제에서:** addi sp,sp,-16과 sw ra/s0/s1의 순서를 구성할 때 사용합니다.

### epilog

- **뜻:** 반환 전에 저장 register와 sp를 원상복구하는 부분입니다.
- **이 문제에서:** lw s1/s0/ra, addi sp,sp,16, ret의 역순 복원을 검산할 때 사용합니다.

### argument register

- **뜻:** 호출 직전 함수 인수를 배치하는 a0–a7 register입니다.
- **이 문제에서:** helper의 첫 인수 b를 a0, 둘째 인수 c를 a1에 놓을 때 사용합니다.

### 이 문제에 적용할 풀이 규칙

### 규칙 1. 오래 사는 값은 보존 register에 둔다

helper 호출 뒤에도 필요한 원래 a는 caller-saved t-register가 아니라 save/restore한 s0처럼 호출을 견디는 위치에 있어야 합니다.

- **시험지에 남길 것:** 변수 a, b, c, d의 lifetime을 그리고 호출선을 가로지르는 값에 s-register 또는 stack 위치를 배정합니다.

### 규칙 2. frame layout을 먼저 확정한다

save와 restore offset을 즉흥적으로 쓰면 겹치거나 누락되므로 code 전에 frame 표를 정해야 합니다.

- **시험지에 남길 것:** sp+4=s1, sp+8=s0, sp+12=ra처럼 offset 표를 먼저 작성합니다.

### 규칙 3. 호출 직전 argument, 반환 직전 a0

내부에서 어떤 register를 사용했든 helper 호출 직전에는 인수가 a0/a1에, magicBox 반환 직전에는 결과가 a0에 있어야 합니다.

- **시험지에 남길 것:** jal 바로 위와 ret 바로 위에 a0/a1의 의미를 주석으로 적습니다.

### 공식 문제 전에 푸는 작은 유사 예제

**문제:** 함수 wrap(int p, int q)가 r=p+4를 계산하고 g(q,r)를 호출한 뒤 g의 반환값에 p를 더해 반환한다. ABI를 지키는 register 계획을 세우세요.

**주어진 것**

- g의 인수는 a0=q, a1=r입니다.
- p는 g 호출 뒤에도 필요합니다.
- wrap은 ra와 사용하는 s-register를 보존해야 합니다.

### 예제 단계 1. p를 s0, r을 s1에 배정하고 16 Byte frame에 ra/s0/s1 위치를 정합니다.

- **왜:** 두 값 중 p는 확실히 호출선을 가로지르고 s-register 사용 자체도 원값 보존을 요구합니다.
- **종이에:** sp+4:s1, sp+8:s0, sp+12:ra

### 예제 단계 2. a0=q, a1=r을 만든 뒤 g를 호출합니다.

- **왜:** callee는 ABI가 정한 argument 위치에서만 값을 받습니다.
- **종이에:** jal 직전 a0=q, a1=p+4

### 예제 단계 3. g의 a0 반환값에 s0의 p를 더하고 frame을 역순 복원합니다.

- **왜:** 최종 결과가 a0에 남고 호출자의 s0/s1/ra/sp가 모두 원상태가 되어야 합니다.
- **종이에:** a0=g(q,r)+p; lw s1,s0,ra; sp+16

**예제 정답:** 16 Byte frame에 ra/s0/s1을 저장하고 p를 s0, r을 s1에 둔 뒤 a0=q, a1=r로 g를 호출합니다. 반환 a0에 s0를 더하고 register와 sp를 복원합니다.

**독립 검산:** 호출 전후 p가 같은지, ret 직전 a0가 C 식과 같은지, sp와 s-register가 진입 전 값인지 확인합니다.

## 5. 공식 정답 요약

**공식 결론:** `addi sp,sp,-16; sw ra,12(sp); sw s0,8(sp); sw s1,4(sp); mv s0,a0; addi s1,a0,10; mv a0,a1; mv a1,s1; jal ra,helper; add a0,a0,s0; lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret`.

### 시험지 문장별 정답 해설

아래는 시험지의 항목 순서를 그대로 유지합니다. 각 항목에서 원문 → 한국어 번역 → 정답 → 판단 근거 → 실제로 쓸 답을 바로 이어서 읽으세요.



### 현재 소문제의 요구·판단·답을 한 흐름으로 연결

### `4b`에서 정확히 답할 대상

- **시험지가 요구하는 답:** 공식 ABI를 지키는 code를 완성하세요.
- **이 소문제의 공식 답:** `addi sp,sp,-16; sw ra,12(sp); sw s0,8(sp); sw s1,4(sp); mv s0,a0; addi s1,a0,10; mv a0,a1; mv a1,s1; jal ra,helper; add a0,a0,s0; lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret`.

### 판단 1. sp를 -16 합니다.

- **왜:** ra, s0, s1 세 word를 저장하면서 호출 경계의 16 Byte alignment를 만족하는 최소 frame입니다.
- **이 판단에서 답안지에 남길 것:** frame 크기 16 Byte와 사용 offset 4,8,12를 그립니다.

### 판단 2. ra,s0,s1을 서로 겹치지 않는 offset에 저장합니다.

- **왜:** helper가 ra를 바꾸고 magicBox가 s0/s1을 사용하므로 세 기존 값을 모두 복원할 수 있어야 합니다.
- **이 판단에서 답안지에 남길 것:** sw ra,12(sp); sw s0,8(sp); sw s1,4(sp)와 frame 그림을 대응시킵니다.

### 판단 3. s0=a, s1=a+10을 만듭니다.

- **왜:** 원래 a는 helper 뒤 최종 덧셈에 필요하고 c=a+10은 helper의 둘째 argument로 필요합니다.
- **이 판단에서 답안지에 남길 것:** s0 옆에 a/live-after-call, s1 옆에 c=a+10을 적습니다.

### 판단 4. a0=b, a1=c로 helper를 부릅니다.

- **왜:** helper(int b,int c)의 첫 두 인수는 호출 직전 a0와 a1에 있어야 합니다.
- **이 판단에서 답안지에 남길 것:** mv a0,a1로 원래 b를 옮긴 뒤 mv a1,s1, jal ra,helper 순서를 적습니다.

### 판단 5. helper return a0에 s0를 더합니다.

- **왜:** helper의 결과 d는 a0에 돌아오고 C 함수의 최종 식은 d+a이므로 보존한 a를 더해야 합니다.
- **이 판단에서 답안지에 남길 것:** add a0,a0,s0 옆에 d+a라고 주석을 적습니다.

### 판단 6. s1,s0,ra를 복원하고 sp+16, ret합니다.

- **왜:** 저장한 callee state와 return address를 되돌린 뒤에만 호출자 환경으로 안전하게 복귀할 수 있습니다.
- **이 판단에서 답안지에 남길 것:** lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret를 적습니다.

### 위 판단이 최종 답으로 이어지는 이유

s0에 원래 a, s1에 c를 보관하고 두 register의 이전 값과 ra를 16-byte aligned frame에 저장합니다.

### 답안 작성 시 주의

return 값을 a0에서 다른 register로 옮겼다가 a1로 반환하지 마세요.

![공식 Musterlösung/Hinweise — solution-p21.png](../../assets/solution-p21.png)

*공식 Musterlösung/Hinweise: `solution-p21.png` · Probeklausur Musterlösung und Hinweise.pdf · PDF p.21*

![공식 Musterlösung/Hinweise — solution-p22.png](../../assets/solution-p22.png)

*공식 Musterlösung/Hinweise: `solution-p22.png` · Probeklausur Musterlösung und Hinweise.pdf · PDF p.22*

## 6. 풀이 전략

1. sp를 -16 합니다.
2. ra,s0,s1을 서로 겹치지 않는 offset에 저장합니다.
3. s0=a, s1=a+10을 만듭니다.
4. a0=b, a1=c로 helper를 부릅니다.
5. helper return a0에 s0를 더합니다.
6. s1,s0,ra를 복원하고 sp+16, ret합니다.

## 7. 단계별 상세 풀이

### 단계 1. sp를 -16 합니다.

- **이유:** ra, s0, s1 세 word를 저장하면서 호출 경계의 16 Byte alignment를 만족하는 최소 frame입니다.
- **종이에 남길 것:** frame 크기 16 Byte와 사용 offset 4,8,12를 그립니다.
- **완료 기준:** 세 저장 slot이 겹치지 않고 sp mod 16 invariant가 유지됩니다.
- **막힐 때 힌트:** 필요한 12 Byte를 그대로 빼지 말고 다음 16 Byte 경계로 올리세요.
- **가장 흔한 첫 오류:** -12를 사용해 저장 공간은 맞지만 호출 경계 정렬을 깨뜨립니다.

### 단계 2. ra,s0,s1을 서로 겹치지 않는 offset에 저장합니다.

- **이유:** helper가 ra를 바꾸고 magicBox가 s0/s1을 사용하므로 세 기존 값을 모두 복원할 수 있어야 합니다.
- **종이에 남길 것:** sw ra,12(sp); sw s0,8(sp); sw s1,4(sp)와 frame 그림을 대응시킵니다.
- **완료 기준:** 각 store에 정확히 하나의 대응 load 위치가 정해져 있습니다.
- **막힐 때 힌트:** 공식 해설 p21의 4,8,12 offset 배치를 기준으로 검산하세요.
- **가장 흔한 첫 오류:** ra만 저장하거나 두 register를 같은 offset에 저장합니다.

### 단계 3. s0=a, s1=a+10을 만듭니다.

- **이유:** 원래 a는 helper 뒤 최종 덧셈에 필요하고 c=a+10은 helper의 둘째 argument로 필요합니다.
- **종이에 남길 것:** s0 옆에 a/live-after-call, s1 옆에 c=a+10을 적습니다.
- **완료 기준:** helper 호출이 t/a register를 덮어써도 a와 c의 필요한 값이 설명됩니다.
- **막힐 때 힌트:** 호출 뒤에도 다시 읽는 C 변수부터 s-register에 배정하세요.
- **가장 흔한 첫 오류:** a를 t0에 두어 helper 뒤 값이 보장된다고 가정합니다.

### 단계 4. a0=b, a1=c로 helper를 부릅니다.

- **이유:** helper(int b,int c)의 첫 두 인수는 호출 직전 a0와 a1에 있어야 합니다.
- **종이에 남길 것:** mv a0,a1로 원래 b를 옮긴 뒤 mv a1,s1, jal ra,helper 순서를 적습니다.
- **완료 기준:** jal 직전 a0와 a1의 의미가 각각 b와 c입니다.
- **막힐 때 힌트:** 원래 magicBox의 a1에는 b가 들어오며, c는 이미 s1에 있습니다.
- **가장 흔한 첫 오류:** a0를 덮기 전에 b의 위치를 잊거나 helper 인수 순서를 뒤집습니다.

### 단계 5. helper return a0에 s0를 더합니다.

- **이유:** helper의 결과 d는 a0에 돌아오고 C 함수의 최종 식은 d+a이므로 보존한 a를 더해야 합니다.
- **종이에 남길 것:** add a0,a0,s0 옆에 d+a라고 주석을 적습니다.
- **완료 기준:** 최종 계산값과 ABI 반환 위치가 동시에 a0로 일치합니다.
- **막힐 때 힌트:** helper 직후 a0의 의미는 argument가 아니라 반환값입니다.
- **가장 흔한 첫 오류:** 결과를 a1에 써서 표준 반환 위치를 어깁니다.

### 단계 6. s1,s0,ra를 복원하고 sp+16, ret합니다.

- **이유:** 저장한 callee state와 return address를 되돌린 뒤에만 호출자 환경으로 안전하게 복귀할 수 있습니다.
- **종이에 남길 것:** lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret를 적습니다.
- **완료 기준:** 모든 store가 같은 offset의 load와 짝을 이루고 sp가 진입 전 값입니다.
- **막힐 때 힌트:** sp를 올리기 전에 현재 frame 주소로 load해야 합니다.
- **가장 흔한 첫 오류:** sp를 먼저 +16한 뒤 잘못된 주소에서 register를 load합니다.

## 8. 문제와 공식 해설의 비교·검증

- **문제가 요구하는 것:** 공식 ABI를 지키는 code를 완성하세요.
- **공식 해설이 제시하는 결론:** `addi sp,sp,-16; sw ra,12(sp); sw s0,8(sp); sw s1,4(sp); mv s0,a0; addi s1,a0,10; mv a0,a1; mv a1,s1; jal ra,helper; add a0,a0,s0; lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret`.
- **결론을 재현하는 핵심 논리:** s0에 원래 a, s1에 c를 보관하고 두 register의 이전 값과 ra를 16-byte aligned frame에 저장합니다.
- **검증 방법:** 위 micro-step의 `종이에 남길 것`을 순서대로 만들고 각 `완료 기준`을 확인합니다. 최종 산출물이 공식 결론과 같은지 대조합니다.
- **전제와 주의 범위:** return 값을 a0에서 다른 register로 옮겼다가 a1로 반환하지 마세요.
- **채택할 시험 답:** 이 가이드에서는 공식 Musterlösung의 결론을 시험 답으로 유지하며, 일반 ISA 또는 다른 구현과 달라질 수 있는 부분은 위 전제와 주의 범위에서 분리합니다.

## 9. 시험장에서 쓸 최종 답안

`addi sp,sp,-16; sw ra,12(sp); sw s0,8(sp); sw s1,4(sp); mv s0,a0; addi s1,a0,10; mv a0,a1; mv a1,s1; jal ra,helper; add a0,a0,s0; lw s1,4(sp); lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret`.

답안지에는 결과만 쓰지 말고, 7절의 중간 산출물 가운데 판정을 증명하는 식·bit field·register 상태·cycle·cache 상태를 함께 남기세요.

## 10. 자주 하는 실수와 검산 체크리스트

### 대표 실수

- return 값을 a0에서 다른 register로 옮겼다가 a1로 반환하지 마세요.
- -12를 사용해 저장 공간은 맞지만 호출 경계 정렬을 깨뜨립니다.
- ra만 저장하거나 두 register를 같은 offset에 저장합니다.
- a를 t0에 두어 helper 뒤 값이 보장된다고 가정합니다.
- a0를 덮기 전에 b의 위치를 잊거나 helper 인수 순서를 뒤집습니다.
- 결과를 a1에 써서 표준 반환 위치를 어깁니다.
- sp를 먼저 +16한 뒤 잘못된 주소에서 register를 load합니다.

### 빠른 self-check

- **회상 질문:** s1을 쓰지 않고 c를 곧바로 a1에 만든 더 짧은 해법도 가능한지 생각해 보세요.
- [ ] 공식 답을 보지 않고 magicBox의 frame layout과 15개 핵심 instruction을 의미 단위로 재작성할 수 있다.
- [ ] helper 호출 직전 a0/a1, 호출 직후 a0/s0, ret 직전 sp/ra/s0/s1 invariant를 설명할 수 있다.

## 11. 짧은 확인 문제와 전이 연습

### 개념 재구성

**문제:** 다른 함수를 호출하는 non-leaf 함수의 prolog부터 epilog까지 작성 순서를 여섯 동사로 재구성하세요.

**힌트:** frame, save, long-lived 값, args, call/result, restore 순서입니다.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** frame 확보 → ra/s-register 저장 → 호출 뒤 필요한 값 보존 → argument 배치 → jal과 a0 결과 계산 → register/sp 복원 후 ret.

**채점 기준**
  - frame|sp
  - ra/s-register 저장
  - argument|a0
  - jal|call
  - 복원|restore
  - ret

</details>

### 변형 문제

**문제:** h(int x,int y)가 k(y)를 호출한 뒤 k의 반환값+x를 반환합니다. x를 s0에 둔다면 필요한 최소 16 Byte frame의 한 가지 layout과 jal 전후 핵심 instruction을 쓰세요.

**힌트:** ra와 s0 두 word를 저장하고 y는 호출 직전 a0로 옮기세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** 예: addi sp,sp,-16; sw s0,8(sp); sw ra,12(sp); mv s0,a0; mv a0,a1; jal ra,k; add a0,a0,s0; lw s0,8(sp); lw ra,12(sp); addi sp,sp,16; ret.

**채점 기준**
  - -16
  - sw ra,12(sp)
  - sw s0,8(sp)
  - mv a0,a1
  - add a0,a0,s0
  - addi sp,sp,16

</details>

### 오답 진단

**문제:** 학생 code가 모든 register를 올바른 offset에 저장했지만 epilog에서 addi sp,sp,16을 먼저 실행한 뒤 lw를 수행합니다. 왜 틀렸고 어떻게 고칩니까?

**힌트:** load 주소의 기준 sp가 어느 frame을 가리키는지 보세요.

<details>
<summary>정답과 채점 기준 보기</summary>

**모범 답:** sp를 먼저 복원하면 lw가 현재 함수 frame이 아닌 호출자 쪽 주소를 읽습니다. 저장 register를 현재 sp 기준으로 먼저 load한 뒤 sp를 +16 해야 합니다.

**채점 기준**
  - 함수 frame
  - 먼저 load
  - sp를 +16

</details>

## 12. 근거 자료

- `[문제 출처] current:Probeklausur.pdf` — 시험 p9 · 공식 해설 p21–22
- `[공식 해설] current:Probeklausur Musterlösung und Hinweise.pdf` — 시험 p9 · 공식 해설 p21–22
- `[정확한 원문 group] 4` — 시험 p.9 · 공식 해설 p.21, p.22
- `[소문항 범위] Probeklausur.pdf 시험 p9 Teilaufgabe b와 Probeklausur Musterlösung und Hinweise.pdf 공식 해설 p21의 수정 code, p22의 RISC-V convention 표.`
- `[개념 근거 · file-level] current:Vorlesung/Rechnerorganisation - Teil 1.pdf` — RISC-V function call과 ABI
- `[개념 근거 · file-level] current:Uebung/Übung 3 Musterlösung.pdf` — callee/caller-saved register와 stack
- `[개념 근거 · file-level] current:Uebung/RISC-V Reference.pdf` — register convention과 pseudoinstruction

### 이 파일에서 직접 대조한 공식 이미지

- `exam-p09.png` — Probeklausur.pdf · PDF p.9
- `solution-p21.png` — Probeklausur Musterlösung und Hinweise.pdf · PDF p.21
- `solution-p22.png` — Probeklausur Musterlösung und Hinweise.pdf · PDF p.22

정확한 강의 슬라이드 한 페이지를 확정하지 못한 개념 자료는 `file-level`로 표시했습니다. 페이지 번호를 추측해서 만들지 않았습니다.
