0

所以,这是我需要转换为 mips 程序集的 c++ 代码。

int sum( int arr[], int size ) { 
  if ( size == 0 )   return 0 ;  
  else      
  return sum( arr, size - 1 ) + arr[size-1];
} 

这是我的尝试:

.data
  arr: .word 5 1 2 3 4

sum:
  li $v0, 0
  beq $a1, $zero, out

  addi $sp, $sp, -12
  sw $ra, 8($sp)
  sw $s1, 4 ($sp)
  sw $s0, 0($sp)

  move $s0, $a0
  move $s1, $a1

  addi $a1, $a1, -1
  jal sum

  addi $s1, $s1, -1
  sll $s1, $s1, 2
  addu $s0, $s0, $s1

  lw $t0, 0($s0)
  add $v0,$v0, $t0


  lw $s0, 0($sp)
  lw $s1, 4($sp)
  lw $ra, 8($sp)
  addi $sp, $sp, 12
  jr $ra

out:
  jr $ra

main:
  la $a0, arr
  li $a1, 5

  jal sum

  move $a0, $v0
  li $v0, 1
  syscall

  li $v0, 10
  syscall

因此,我在递归调用中保留了 3 个变量:ra、a0 和 a1。但是当我尝试访问数组的内存时,可能出现了错误读取的异常。但我找不到问题。

4

1 回答 1

0

不确定您的代码有什么问题,这是我使用 QtSpim 测试 MIPS 的示例

.text

fillArray:
    li $t0, 0
loop:
    beq $t0, $a1, endFillArray
    mulo $t1, $t0, 4
    add $t1, $a0, $t1

    li $v0, 5
    syscall
    
    sw $v0, 0($t1)
    addi $t0, $t0, 1
    j loop


endFillArray:
    jr $ra

sumArrayRec:
    addi $sp, $sp,-16
    sw $ra, 0($sp)
    sw $a0, 4($sp)
    beqz $a1, zero
    addi $a1, $a1, -1
    sw $a1, 8($sp)

    jal sumArrayRec

    sw $v0, 12($sp)
    lw $t0, 4($sp)
    lw $t2, 8($sp)
    mulo $t2, $t2, 4
    add $t0, $t0, $t2
    lw $t1, 0($t0)
    lw $t3, 12($sp)
    add $v0, $t3, $t1
    j endSumArrRec


zero:
    li $v0, 0

endSumArrRec:
    move $a0, $v0
    lw $ra, 0($sp)
    addi $sp, $sp, 16
    jr $ra

main:

    la $a0, str1
    li $v0, 4
    syscall

    li $v0, 5
    syscall
    move $s0, $v0 #length arr

    la $a0, str2
    li $v0, 4
    syscall

    la $a0, arr
    move $a1, $s0
    jal fillArray #input arr elemetns

    la $a0, arr
    move $a1, $s0
    jal sumArrayRec

    move $s0, $v0

    la $a0, str3
    li $v0, 4
    syscall


    move $a0, $s0
    li $v0, 1
    syscall

    li $v0, 10
    syscall


.data
    arr: .space 200
    str1: .asciiz "Input length n = "
    str2: .asciiz "Insert array elements: \n"
    str3: .asciiz "Result: "
于 2021-05-06T09:06:41.163 回答