UNIT-SPECIFIC ACTIVE LESSON · 3-1

`swap`: 두 주소 계산

`arr[i]`와 `arr[j]`의 주소를 만드세요.

학습 목표: `int` array index를 4-Byte offset으로 scale하고 서로 다른 temporary를 사용해 `&arr[i]`와 `&arr[j]`를 동시에 만든다.
공식 근거 범위: SoSe26 Probeklausur 시험 p7 Aufgabe 3 `swap`의 주소 계산 부분과 공식 해설 p8의 `slli/add` 두 주소 생성 범위.

왜 이 소문제를 따로 배우는가

RISC-V address arithmetic은 element index가 아니라 Byte 주소를 다룹니다. scaling과 temporary lifetime을 분리해 추적해야 load/store 전에도 두 주소를 잃지 않고 이후 swap 단계를 안전하게 이어갈 수 있습니다.

이 페이지는 Aufgabe 3의 공통 템플릿이 아니라 3-1 `swap`: 두 주소 계산에 필요한 내용만 담습니다. 챕터 전체 배경이 필요하면 Aufgabe 3 개념 수업을 먼저 읽으세요.

이 소문제에서 실제로 쓰는 용어

정의뿐 아니라 이 문제의 어느 판단에 쓰이는지까지 연결합니다.

byte offset
array base에서 목표 element까지 떨어진 거리를 Byte 단위로 나타낸 값입니다.이 소문제에서: `int` index에 4를 곱해 address addition에 사용합니다.
slli
register 값을 immediate만큼 논리적으로 왼쪽 shift하는 instruction입니다.이 소문제에서: `slli index,2`로 index를 `2^2=4`배 합니다.
base address
array 첫 element `arr[0]`의 memory address입니다.이 소문제에서: a0에 든 arr base에 scaled offset을 더해 각 element 주소를 만듭니다.
temporary lifetime
중간값이 생성된 뒤 마지막으로 사용될 때까지 보존되어야 하는 구간입니다.이 소문제에서: 두 element 주소가 동시에 필요하므로 t0와 t2를 서로 덮지 않게 합니다.

이 소문제 전용 규칙과 종이 작업

element→Byte 변환 규칙

element 크기가 S Byte이면 `&arr[k]=base+k×S`입니다. `int`는 4 Byte이므로 k를 2 bit shift합니다.

종이에: `offset_i=i×4`, `offset_j=j×4`를 주소 계산 전에 씁니다.

base 불변 규칙

두 주소 계산 모두 같은 arr base에서 시작해야 하므로 a0를 덮지 않고 temporary에 결과를 둡니다.

종이에: register 표에 `a0=arr base (keep)`를 표시합니다.

동시 생존 규칙

나중에 두 값을 load/store하려면 `&arr[i]`와 `&arr[j]`가 모두 살아 있어야 합니다.

종이에: t0=`&arr[i]`, t2=`&arr[j]`라고 서로 다른 상자를 그립니다.

Aufgabe 전체 흐름은 챕터 흐름도에서 확인할 수 있습니다. 여기서는 현재 판단에 직접 필요한 규칙만 적용합니다.

이 소문제 전용 작은 예제

base `0x1000`의 `short v[]`에서 k=6인 `&v[k]`를 계산하고 RISC-V 두 instruction으로 만드세요. `short=2 Byte`입니다.

주어진 것

  • base는 a0, k는 a1에 있습니다.
  • 결과 주소는 t0에 둡니다.
  1. element 크기 2를 shift amount로 바꿉니다.

    `2 Byte = 2^1`이므로 index를 1 bit left shift하면 Byte offset입니다.

    종이 산출물: `offset=6×2=12`, `shift=1`

  2. scaled offset을 t0에 만듭니다.

    base a0와 original index a1을 보존하면서 address arithmetic을 준비합니다.

    종이 산출물: `slli t0,a1,1 # t0=12`

  3. base와 offset을 더합니다.

    array address 공식 `base+k×size`를 완성합니다.

    종이 산출물: `add t0,a0,t0 # 0x1000+12=0x100C`

예제 답과 독립 검산 보기

`slli t0,a1,1; add t0,a0,t0`이며 `&v[6]=0x100C`입니다.

독립 검산: k=0을 넣으면 offset 0이고 결과가 base `0x1000` 그대로인지 확인합니다.

이제 실제 시험 문제를 micro-work로 풀기

공식 시험이 요구하는 것

`arr[i]`와 `arr[j]`의 주소를 만드세요.

공식 답을 보기 전, 내 답 먼저 남기기

완성 문장이 아니어도 좋습니다. 중간값·register·cycle·cache state처럼 채점 가능한 흔적을 먼저 적으세요.

각 작업의 중간 산출물을 직접 적고 완료 조건을 만족한 뒤 체크하세요. 단계별 이유·산출물·오류가 현재 소문제에 맞게 따로 작성되어 있습니다.

i를 2 bit left shift해 `i×4` Byte offset을 만듭니다.

왜 하는가
`int` element 하나가 4 Byte이므로 element index를 그대로 주소에 더할 수 없습니다.
종이 산출물
`slli t0,a1,2 # t0=i*4`
완료 조건
t0의 단위가 element가 아니라 Byte로 표시되어 있습니다.
막혔을 때 단계 힌트·대표 오류

힌트: 4는 `2^2`입니다.

이 단계의 대표 오류: `slli` 없이 i를 base에 직접 더하거나 4 bit shift해 16배 하는 것입니다.

arr base a0를 더해 `&arr[i]`를 만듭니다.

왜 하는가
scaled offset은 상대 거리일 뿐이며 실제 memory address에는 base가 필요합니다.
종이 산출물
`add t0,a0,t0 # t0=&arr[i]`
완료 조건
t0가 offset에서 absolute element address로 바뀌었다고 표시되어 있습니다.
막혔을 때 단계 힌트·대표 오류

힌트: 주소 공식의 `base + offset` 두 항을 확인하세요.

이 단계의 대표 오류: shift 결과를 이미 완전한 address라고 보고 base addition을 생략하는 것입니다.

j도 같은 방식으로 scale하고 arr base를 더합니다.

왜 하는가
두 번째 index도 동일한 element 크기와 같은 base를 사용합니다.
종이 산출물
`slli t2,a2,2; add t2,a0,t2 # t2=&arr[j]`
완료 조건
t2가 j의 scaled offset이 아니라 `&arr[j]`로 표시되어 있습니다.
막혔을 때 단계 힌트·대표 오류

힌트: i 계산의 register만 복사하지 말고 source를 a2로 바꾸세요.

이 단계의 대표 오류: 두 번째 계산에서도 a1을 사용해 두 주소가 모두 `&arr[i]`가 되는 것입니다.

두 주소를 서로 다른 temporary에 유지합니다.

왜 하는가
다음 단계에서 두 값을 load한 뒤 반대 주소에 store하려면 t0와 t2가 동시에 필요합니다.
종이 산출물
register 표에 `t0=&arr[i] (live)`, `t2=&arr[j] (live)`를 적습니다.
완료 조건
어느 instruction도 t0나 t2를 다른 용도로 덮지 않고 다음 load 단계로 넘어갑니다.
막혔을 때 단계 힌트·대표 오류

힌트: 한 주소를 만든 뒤 같은 destination register로 두 번째 주소를 계산하지 마세요.

이 단계의 대표 오류: t0를 j 주소 계산에 재사용해 `&arr[i]`를 잃는 것입니다.

공식 답을 열기 전 마지막 회상

64-bit long array라면 index scaling은 어떻게 달라지나요?

내 풀이 후 공식 결론·이유·대표 함정 확인

공식 결론

`slli t0,a1,2; add t0,a0,t0`와 `slli t2,a2,2; add t2,a0,t2`.

왜 이 답이 되는가

`int` 하나는 4 Byte이므로 index×4가 byte offset입니다. `slli index,2`는 4배와 같습니다.

대표 함정

index를 그대로 base에 더하면 element가 아니라 byte 단위로 잘못 이동합니다.

명령어와 식을 줄 단위로 읽기

본문 속 code를 한 줄씩 분리했습니다. 각 줄에서 source, operation, destination을 표시하세요.

arr[i]
arr[j]
int
slli index,2
slli t0,a1,2;
add t0,a0,t0;
slli t2,a2,2;
add t2,a0,t2;

새 문제로 전이하기

세 문항은 앞 문장의 반복이 아닙니다. 직접 답을 입력하면 rubric의 필수 기준을 하나씩 검사하고, 첫 누락 기준을 알려 줍니다.

1. 개념 재구성

element 크기가 S Byte인 array에서 `&arr[k]` 공식을 복원하고 S가 2의 거듭제곱일 때 slli shift amount를 구하는 법을 설명하세요.

제출 후 모델 답 보기

`&arr[k] = base + k×S`입니다. S=`2^m`이면 `k×S = k<<m`이므로 `slli temp,k,m` 뒤 base를 더합니다. 예를 들어 S=8이면 m=3입니다.

2. 변형 문제

base=`0x4000`인 64-bit `long a[]`에서 p=3, q=7이다. 두 주소를 계산하고 a0=base, a1=p, a2=q일 때 RISC-V address code를 쓰세요.

제출 후 모델 답 보기

`&a[3]=0x4000+24=0x4018`, `&a[7]=0x4000+56=0x4038`입니다. code는 `slli t0,a1,3; add t0,a0,t0; slli t2,a2,3; add t2,a0,t2`입니다.

3. 오류 진단

학생 code는 `add t0,a0,a1; add t0,a0,a2`이고 마지막 t0를 두 주소 모두로 사용하려 합니다. 첫 산술 오류와 이어지는 lifetime 오류를 각각 고치세요.

제출 후 모델 답 보기

첫 산술 오류는 int index를 4 Byte로 scale하지 않은 것입니다. `slli t0,a1,2`와 `slli t2,a2,2`가 필요합니다. 이어지는 lifetime 오류는 두 번째 add가 t0의 첫 주소를 덮는 것이므로 `add t0,a0,t0`와 `add t2,a0,t2`로 두 주소를 분리해야 합니다.

이 소문제를 끝냈다고 말할 수 있는 기준

이 소문제의 정확한 공식 페이지와 대조하기

왼쪽은 문제를 읽을 때, 오른쪽은 자신의 풀이를 끝낸 뒤에 확인하세요. 해설 이미지를 먼저 보면 중간 과정을 스스로 만드는 연습이 사라집니다.

3-1 관련 공식 시험 또는 해설 페이지
exam-p07.png · 클릭해 원본 크기로 확인
3-1 관련 공식 시험 또는 해설 페이지
solution-p08.png · 클릭해 원본 크기로 확인

Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p7–8 · 공식 해설 p8–11 · SoSe26 Probeklausur 시험 p7 Aufgabe 3 `swap`의 주소 계산 부분과 공식 해설 p8의 `slli/add` 두 주소 생성 범위.