Мне было интересно, может ли кто-нибудь взглянуть на мой перевод функции transform_lowercase из C кода в сборку RIS C -V и сказать, правильно ли я это сделал (или хотя бы должен работает правильно). Кстати, это из лекционных занятий, мы вообще ничего не собираем и не запускаем в этом классе. Это для моего класса компьютерной архитектуры. Это все сделано вручную. Мы только учимся переводить сборку C в ris c -v на бумаге. Спасибо
void transform_lowercase(char *s) {
char count = 0; // using like a short int
while (*s != '\0') {
if (*s >= 'a' && *s <= 'z') {
count++;
*s = someFunction(*s, 'a' + count);// takes two char as input. Returns one char
}
s++;
}
}
ADDI sp, sp -24 // increment the stack by 24 bytes
SD x1, 0(sp) // x1 return address
SD s0, 8(sp) // s0 = *s
SD s1, 16(sp) // s1 = count
ADDI s0, a0, 0 // parameter s0 = a0 aka s0 = s*
ADDI s1, 0, 0 // initialize count = 0
Loop:
LBU t0, 0(s0) // Dereference s (in s0) and put the char it points to in t0
BEQ t0, 0 CleanUp
ADDI t1, x0, 'a'
BLT t0, t1, Increment
ADDI t2, x0, 'z'
BGE t0, t2, Increment
ADDI s1, s1, 1 // count++
ADD a0, t0, x0 // put t0 (aka *s) into a0
ADD a1, s1, t1 // a1 = count + 'a'
jal x1, someFunction
SB a0, 0(s0)
Increment:
ADDI s0, s0, 1
BEQ x0, x0, Loop
CleanUp:
ld s1, 16(sp) // restore s1
ld s0, 8(sp) //restore s0
ld x1, 0(sp) // restore x1
ADDI sp, sp, 24 // pop 3 items off the stack
JALR x0, 0(x1)
//the end