Перевод C кода в RIS C -V (сборка) правильный? - PullRequest
0 голосов
/ 19 апреля 2020

Мне было интересно, может ли кто-нибудь взглянуть на мой перевод функции 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
...