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로 검사합니다. 진입 sp가 16-byte aligned라면 -14 뒤 sp는 4의 배수조차 아니어서 `sw/lw ra,0(sp)`도 word-misaligned입니다. 공식 p21은 +14도 별도 오류로 세지만, 원본 -14/+14는 산술적으로 sp를 원상복구하므로 이는 frame을 -16으로 고친 뒤 epilog도 +16이어야 한다는 연동 수정입니다.
jal을 굵은 세로선으로 그리고 그 선을 넘어 필요한 값에 동그라미를 치세요.
prolog와 epilog의 sp 변화·저장 offset·복원 register가 거울처럼 대응해야 합니다.
1. 이번 시험 문제에서 실제로 밟는 단계
- sp 변화가 4/16의 배수 조건을 모두 만족하는지 봅니다.
- helper 뒤에도 쓰는 값이 t/a에만 남았는지 봅니다.
- 사용한 s-register를 save/restore했는지 봅니다.
- 원본 -14/+14의 원상복구와 교정안 -16/+16을 구분합니다.
- C return 값이 a0에 놓였는지 봅니다.
2. 단계가 도착해야 하는 공식 답지 기준 결론
공식 p21은 ① `addi sp,sp,-14`의 alignment 위반, ② a를 caller-saved t0에만 둠, ③ s1 미보존, ④ `addi sp,sp,14`, ⑤ 결과를 a1에 씀을 다섯 오류로 지적합니다. ①은 16-byte ABI alignment를 깨고 새 sp를 4-byte boundary에서도 벗어나게 해 `sw/lw ra,0(sp)`를 misaligned로 만듭니다. 독립 검산상 ①②③⑤는 실제 root 오류입니다. 원본의 -14와 +14는 서로 상쇄하므로 ④는 단독 복원 오류라기보다 ①을 -16으로 교정할 때 반드시 +16으로 함께 바꿔야 한다는 연동 수정입니다.
3. 초보자가 자주 빠지는 오답과 이유
공식 해설의 다섯 항목을 그대로 제시하되, +14는 원본에서 -14를 되돌리며 교정된 -16 frame과 짝지을 때만 +16으로 바뀐다는 점을 숨기지 마세요.
4. 정답을 닫고 스스로 설명하기
원본 -14/+14와 교정안 -16/+16에서 각각 sp가 원상복구되는지와 4/16-byte alignment가 맞는지를 구분해 설명하세요.
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


