Original German
Recalled German source, locator current:Gedächtnisprotokoll Rechnerorganisation SoSe25.md#aufgabe-3:
Aufgabe 3 - C in RISC-V übersetzen, ungefähr 8 Punkte. Es war eine C-Methode gegeben, welche ein Array aufsummiert und die Summe zurückgibt. Die Methode sollte in RISC-V umgesetzt werden. Dafür durften nur die Register
a0,a1, sowiet0-t6verwendet werden. Ina0lag die Adresse des Ararys, ina1lag die Länge. Die Summe sollte ins0zurückgegeben werden.
int length = a.length;
int sum = 0;
for (int i = 0; i < length; i++) {
int x = a[i];
if (x < 0) {
x = -x;
}
sum = sum + x;
}
Recalled proposed answer:
li s0, 0
li t0, 0
loop:
beq t0, a1, end
slli t1, t0, 2
add t1, t1, a0
lw t2, 0(t1)
bge t2, zero, else
sub s0, s0, t2
addi t0, t0, 1
j loop
else:
add s0, s0, t2
addi t0, t0, 1
j loop
end:
Normalization note: Ararys는 오타로 보이며 Arrays로 읽는다. 가장 큰 불확실성은 "sum should be returned in s0"이다. 같은 문장 안에서 허용 register가 a0, a1, t0-t6뿐이라고 했기 때문에 s0 사용은 조건 위반이다.
한국어 문제
정수 배열의 원소를 모두 읽어서 각 원소의 절댓값을 더하는 C 코드를 RISC-V로 옮겨라. 입력으로 a0에는 배열 a의 시작 주소가 있고, a1에는 배열 길이 length가 있다. 사용할 수 있는 register는 a0, a1, t0부터 t6까지라고 기억되어 있다. 기억 기록에는 합계를 s0에 돌려주라고 되어 있지만, 이 조건은 허용 register 목록과 충돌한다.
한 줄 핵심
C loop를 pointer, loop counter, loaded value, accumulator 상태로 나누고 매 iteration의 register 변화를 trace한다.