왜 이 소문제를 따로 배우는가
return은 새 return address를 만들지 않고 기존 ra를 PC로 옮기는 control transfer입니다. rd와 rs1의 방향을 정확히 이해하면 `jalr ra,ra,0`처럼 ra를 덮어쓰는 치명적 혼동을 피합니다.
이 페이지는 Aufgabe 2의 공통 템플릿이 아니라 2-2 `ret` ↔ `0x00008067`에 필요한 내용만 담습니다. 챕터 전체 배경이 필요하면 Aufgabe 2 개념 수업을 먼저 읽으세요.
이 소문제에서 실제로 쓰는 용어
정의뿐 아니라 이 문제의 어느 판단에 쓰이는지까지 연결합니다.
- ret
- caller가 ra에 남긴 return address로 돌아가는 pseudo instruction입니다.이 소문제에서: `jalr x0,ra,0`으로 확장해 실제 encoding을 찾습니다.
- jalr
- `rs1+immediate`에서 target을 만들고 현재 `PC+4`를 rd에 쓰는 indirect jump instruction입니다.이 소문제에서: rs1=ra가 target source이고 rd=x0가 link 폐기임을 확인합니다.
- ra
- ABI 이름으로 x1이며 함수 호출 뒤 돌아갈 주소를 보관합니다.이 소문제에서: `ret` encoding의 rs1 field를 `00001`로 정합니다.
- link address
- jump 이후 돌아오기 위해 rd에 기록하는 현재 `PC+4` 값입니다.이 소문제에서: return에서는 새 link가 필요 없어 rd=x0로 버리는 이유를 설명합니다.
이 소문제 전용 규칙과 종이 작업
target과 link 분리
jalr의 rs1은 jump target 계산에 쓰이고 rd는 새 link address를 받습니다. 두 field의 역할은 반대가 아닙니다.
종이에: `target=rs1+imm`, `rd←PC+4`를 두 줄로 적습니다.
return expansion 규칙
return target은 ra+0이고 새 link는 필요 없으므로 `rs1=ra`, `imm=0`, `rd=x0`입니다.
종이에: `ret ⇒ jalr x0,ra,0`을 쓰고 각 operand 아래 역할을 표시합니다.
Aufgabe 전체 흐름은 챕터 흐름도에서 확인할 수 있습니다. 여기서는 현재 판단에 직접 필요한 규칙만 적용합니다.
이 소문제 전용 작은 예제
`jalr x0,t0,0`을 encoding하세요. t0는 x5입니다.
주어진 것
- jalr opcode는 `1100111`, funct3는 `000`입니다.
- I-type field 순서는 imm|rs1|funct3|rd|opcode입니다.
- operand를 field 번호로 바꿉니다.
t0라는 ABI 이름을 5-bit rs1 값으로 변환해야 합니다.
종이 산출물: `imm=0, rs1=x5=00101, rd=x0=00000`
- I-type bit열을 조립합니다.
jalr의 target source와 link destination 위치를 정확히 반영합니다.
종이 산출물: `000000000000 00101 000 00000 1100111`
- hex로 변환합니다.
후보 encoding과 빠르게 비교할 수 있습니다.
종이 산출물: `0x00028067`
예제 답과 독립 검산 보기
`jalr x0,t0,0`의 encoding은 `0x00028067`입니다.
독립 검산: rs1 field `00101`가 bits[19:15]에 있어 값에 `5<<15`가 포함되는지 확인합니다.
이 instruction의 field를 실제로 채우기
아래 표는 이 소문제만의 값입니다. 일반 format 표와 섞지 말고 각 행을 bit열에서 직접 가리켜 보세요.
| format | I-type jalr |
|---|---|
| opcode | 1100111 |
| rd | x0 = 00000 |
| funct3 | 000 |
| rs1 | ra=x1 = 00001 |
| imm | 0 |
이제 실제 시험 문제를 micro-work로 풀기
공식 시험이 요구하는 것
`ret`의 실제 encoding을 찾으세요.
공식 답을 보기 전, 내 답 먼저 남기기
완성 문장이 아니어도 좋습니다. 중간값·register·cycle·cache state처럼 채점 가능한 흔적을 먼저 적으세요.
각 작업의 중간 산출물을 직접 적고 완료 조건을 만족한 뒤 체크하세요. 단계별 이유·산출물·오류가 현재 소문제에 맞게 따로 작성되어 있습니다.
`ret` pseudo를 `jalr x0,ra,0`으로 펼칩니다.
- 왜 하는가
- 실제 opcode와 field는 jalr base instruction에서만 결정할 수 있습니다.
- 종이 산출물
- `ret = jalr x0,ra,0`
- 완료 조건
- rd=x0, rs1=ra, imm=0이 명시되어 있습니다.
막혔을 때 단계 힌트·대표 오류
힌트: 기존 return address를 읽되 새 return address는 저장하지 않습니다.
이 단계의 대표 오류: `jalr ra,x0,0`처럼 source와 destination을 바꾸는 것입니다.
jalr opcode `1100111`과 funct3 `000`을 확인합니다.
- 왜 하는가
- 다른 I-type ALU나 load encoding과 indirect jump를 구분하는 고정 field입니다.
- 종이 산출물
- 오른쪽 7 bit에 `1100111`, 그 앞 funct3에 `000`을 표시합니다.
- 완료 조건
- 후보 bit열이 jalr family임을 opcode로 검증했습니다.
막혔을 때 단계 힌트·대표 오류
힌트: hex의 하위 byte가 `0x67`로 끝나는지 보세요.
이 단계의 대표 오류: `jal`의 opcode `1101111`과 `jalr`의 `1100111`을 섞는 것입니다.
rs1=ra(x1), rd=x0, imm=0을 확인해 전체 hex를 확정합니다.
- 왜 하는가
- jalr 후보 중에서도 return target source와 link 폐기 조건이 모두 맞아야 `ret`입니다.
- 종이 산출물
- `imm=0 | rs1=00001 | f3=000 | rd=00000 | op=1100111 → 0x00008067`
- 완료 조건
- 공식 encoding과 세 operand field가 모두 일치합니다.
막혔을 때 단계 힌트·대표 오류
힌트: x1은 bits[19:15]에 놓이므로 `1<<15 = 0x8000`입니다.
이 단계의 대표 오류: rd를 ra로 두어 jump 순간 ra를 새 PC+4로 덮어쓰는 것입니다.
공식 답을 열기 전 마지막 회상
`ret` 실행 시 PC는 어디에서 오나요?
내 풀이 후 공식 결론·이유·대표 함정 확인
공식 결론
`ret` ↔ `0x00008067`.
왜 이 답이 되는가
`ret`은 `jalr x0,ra,0`입니다. return address를 새 rd에 보관할 필요가 없어 rd=x0이고 target은 ra+0입니다.
대표 함정
`jalr ra,ra,0`은 ra를 덮어써 return 동작을 망칠 수 있습니다.
명령어와 식을 줄 단위로 읽기
본문 속 code를 한 줄씩 분리했습니다. 각 줄에서 source, operation, destination을 표시하세요.
ret
jalr x0,ra,0
0x00008067새 문제로 전이하기
세 문항은 앞 문장의 반복이 아닙니다. 직접 답을 입력하면 rubric의 필수 기준을 하나씩 검사하고, 첫 누락 기준을 알려 줍니다.
1. 개념 재구성
jalr의 두 결과 `target PC`와 `link address`를 식으로 복원한 뒤 왜 `ret`에서 rs1=ra, rd=x0인지 설명하세요.
읽는 register와 쓰는 register를 분리하세요.
제출 후 모델 답 보기
jalr는 `target PC=rs1+immediate`로 jump하고 `rd=PC+4`로 link address를 씁니다. `ret`은 ra에 든 target을 읽어야 하므로 rs1=ra이고 새 link가 필요 없으므로 rd=x0입니다.
2. 변형 문제
`jalr x0,sp,4`의 target 계산식과 encoding을 구하세요. sp는 x2입니다.
imm=4는 bits[31:20], x2는 bits[19:15]에 둡니다.
제출 후 모델 답 보기
target 계산식은 `PC ← sp+4`이고 link는 x0에 버립니다. encoding은 `0x00410067`입니다.
3. 오류 진단
학생이 `ret = jalr ra,ra,0`이라고 썼습니다. 첫 operand 오류와 함수 반환에 미치는 영향을 설명하세요.
jalr가 rd에 무엇을 쓰는지 확인하세요.
제출 후 모델 답 보기
첫 오류는 rd를 ra로 둔 것입니다. `jalr ra,ra,0`은 jump와 동시에 ra에 현재 `PC+4` link address를 써서 기존 return address를 덮습니다. 올바른 `ret`은 `jalr x0,ra,0`입니다.
이 소문제를 끝냈다고 말할 수 있는 기준
이 소문제의 정확한 공식 페이지와 대조하기
왼쪽은 문제를 읽을 때, 오른쪽은 자신의 풀이를 끝낸 뒤에 확인하세요. 해설 이미지를 먼저 보면 중간 과정을 스스로 만드는 연습이 사라집니다.
Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p6 · 공식 해설 p7 · SoSe26 Probeklausur 시험 p6 Aufgabe 2의 `ret` 후보와 공식 해설 p7의 `ret ↔ 0x00008067` pairing.

