Aufgabe 4 · 8 Punkte · ABI audit
Fehler identifizieren und korrigieren
함수 호출 전후를 경계로 봅니다. 호출 뒤에도 필요한 a는 caller-saved t-register가 아니라 보존된 s-register/stack에 있어야 하며, callee가 s-register를 쓰면 원래 값을 돌려줘야 합니다.
공식 시험지와 공식 Musterlösung을 기준으로 작성했습니다. 그림 문제는 렌더된 원본 페이지도 함께 대조합니다.
BEGINNER CONCEPT LESSON
문제 풀이 전에 개념부터 배우기
용어를 모르는 상태에서 답을 외우지 않도록, 비유·그림·작은 예제·시험용 풀이 알고리즘을 별도 수업으로 만들었습니다.
원본 그림과 공식 해설 그림
diagram 문제는 text만으로 대체하지 말고 아래 원본을 확대해 선·stage·field를 직접 확인하세요.
MICRO WORK UNITS
2개 작업 단위로 학습
각 카드는 요구사항 → zero-base 개념 → 손풀이 단계 → 공식 결론 → 함정 → active recall 순서입니다.
4a다섯 ABI 위반 찾기
문제가 요구하는 것
잘못된 magicBox에서 모든 convention 위반을 찾으세요.
이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.
0. 이 소문제에 필요한 핵심 개념
Stack frame, caller-saved 생존성, callee-saved 복원, return register를 각각 독립 checklist로 검사합니다.
jal을 굵은 세로선으로 그리고 그 선을 넘어 필요한 값에 동그라미를 치세요.
prolog와 epilog의 sp 변화·저장 offset·복원 register가 거울처럼 대응해야 합니다.
1. 이번 시험 문제에서 실제로 밟는 단계
- sp 변화가 16의 배수인지 봅니다.
- helper 뒤에도 쓰는 값이 t/a에만 남았는지 봅니다.
- 사용한 s-register를 save/restore했는지 봅니다.
- prolog와 epilog의 sp 변화가 정확히 반대인지 봅니다.
- C return 값이 a0에 놓였는지 봅니다.
2. 단계가 도착해야 하는 공식 답지 기준 결론
오류: -14 alignment, a를 t0에만 보존, s1 미보존, +14 복원, 결과를 a1에 씀. 공식 해설은 5개를 지적합니다.
3. 초보자가 자주 빠지는 오답과 이유
ra만 저장했다고 호출 규약이 끝난 것이 아닙니다. 값의 lifetime과 register class를 함께 봅니다.
4. 정답을 닫고 스스로 설명하기
helper가 t0를 자유롭게 덮어써도 되는 이유는 무엇인가요?
Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p9 · 공식 해설 p21–22
4b올바른 magicBox 재작성
문제가 요구하는 것
공식 ABI를 지키는 code를 완성하세요.
이 카드는 빠른 복습용입니다. 처음 학습한다면 아래 독립 페이지에서 용어·비유·수식·작은 예제부터 읽으세요.
0. 이 소문제에 필요한 핵심 개념
s0에 원래 a, s1에 c를 보관하고 두 register의 이전 값과 ra를 16-byte aligned frame에 저장합니다.
jal을 굵은 세로선으로 그리고 그 선을 넘어 필요한 값에 동그라미를 치세요.
prolog와 epilog의 sp 변화·저장 offset·복원 register가 거울처럼 대응해야 합니다.
1. 이번 시험 문제에서 실제로 밟는 단계
- sp를 -16 합니다.
- ra,s0,s1을 서로 겹치지 않는 offset에 저장합니다.
- s0=a, s1=a+10을 만듭니다.
- a0=b, a1=c로 helper를 부릅니다.
- helper return a0에 s0를 더합니다.
- s1,s0,ra를 복원하고 sp+16, ret합니다.
2. 단계가 도착해야 하는 공식 답지 기준 결론
`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`.
3. 초보자가 자주 빠지는 오답과 이유
return 값을 a0에서 다른 register로 옮겼다가 a1로 반환하지 마세요.
4. 정답을 닫고 스스로 설명하기
s1을 쓰지 않고 c를 곧바로 a1에 만든 더 짧은 해법도 가능한지 생각해 보세요.
Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p9 · 공식 해설 p21–22


