因此,我在将C代码转换为mips时遇到了麻烦。任务是为递归函数编写一个mips代码,该代码将偶数加起来并返回整数。我相信我的C代码是正确的:

int sumRec(int arr[], int len){
    if(len==0){
        return 0;
    }
    else if(arr[len]%2==0){
        return arr[len]+sumRec(arr,len-1);
    }
    else{
        return 0+sumRec(arr,len-1);
    }
}


但是,将其转换为MIPS时,我遇到了很大的困难。我认为从逻辑上讲它写得很好,但是我无法弄清楚为什么我的输出有这么多错误(4和7类型的异常)。这是我的代码:

    .data
      test:             .word 1, 2, 3, 4, 5
      length:           .word 5
      x:                .word 0
      y:                .word 2
      summ:             .asciiz "summ: "
      nl:               .asciiz "\n"

    .text

    main:
      #prints "summ: "
      li $v0, 4
      la $a0, summ
      syscall


      #calling sumRec
      la $a0, test
      la $t0, length
      lw $a1, 0($t0)
      jal sumRec

      #print output
      move $a0, $v0
      li $v0, 1
      syscall

      #exit
      li $v0, 10
      syscall


    sumRec:
        addi    $sp,    $sp,    -12
        addi    $t1,    $t0,    -1        #compute len-1
        lw      $t6,    y
        sw      $t1,    0($sp)            #save len-1 in stack
        sw      $ra,    4($sp)            #save return address
        bne     $t1,    $zero,  else_01
        li      $v0,    0                 #set return to 0
        addi    $sp,    $sp,    12
        jr      $ra

    else_01:
        li      $t7,    4                 #t7 = 4
        mult    $t1,    $t7               #len-1 * 4
        mflo    $t2
        add     $t2,    $t2,    $a1
        lw      $t3,    0($t2)
        div     $t2,    $t6
        mfhi    $t4
        beq     $t4,    $zero,  else_02
        sw      $t3,    8($sp)
        move    $a1,    $t0
        jal     sumaRec
        lw      $t3,    8($sp)
        add     $v0,    $v0,    $t3
        lw      $ra,    4($sp)
        addi    $sp,    $sp,    12
        jr      $ra

    else_02:
        move    $a1,    $t1
        jal     sumaRec
        lw      $ra,    4($sp)
        addi    $sp,    $sp,    12
        jr      $ra


有人可以帮我弄清楚吗?我哪里做错了?

最佳答案

数组的最后一个元素是arr[len-1],而不是arr[len]

int sumRec(int arr[], int len){
    if(len==0){
        return 0;
    }
    else if(arr[len-1]%2==0){
        return arr[len-1]+sumRec(arr,len-1);
    }
    else{
        return 0+sumRec(arr,len-1);
    }
}

关于c - MIPS递归出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33292124/

10-11 21:57