Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 在mips程序集中查找数组中元素的总和(使用递归) 所以,这是我需要翻译成MIPS程序集的C++代码。 int sum( int arr[], int size ) { if ( size == 0 ) return 0 ; else return sum( arr, size - 1 ) + arr[size-1]; }_Recursion_Assembly_Mips_Mips32_Smips - Fatal编程技术网

Recursion 在mips程序集中查找数组中元素的总和(使用递归) 所以,这是我需要翻译成MIPS程序集的C++代码。 int sum( int arr[], int size ) { if ( size == 0 ) return 0 ; else return sum( arr, size - 1 ) + arr[size-1]; }

Recursion 在mips程序集中查找数组中元素的总和(使用递归) 所以,这是我需要翻译成MIPS程序集的C++代码。 int sum( int arr[], int size ) { if ( size == 0 ) return 0 ; else return sum( arr, size - 1 ) + arr[size-1]; },recursion,assembly,mips,mips32,smips,Recursion,Assembly,Mips,Mips32,Smips,这是我的尝试: .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

这是我的尝试:

.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。但我得到了一个例外,即读取错误,这可能是在我试图访问数组内存时出现的。但是我找不到问题。

不确定您的代码有什么问题,下面是我使用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: "

“这可能是在我试图访问数组内存时出现的”模拟器告诉您异常发生的确切地址,您可以将其映射到特定的代码行。我使用了vim,因此它没有多大帮助。MIPS和debuggingVim也非常新,它有一个集成的MIPS模拟器吗?无论如何,如果您使用的工具不够好,请切换工具。使用类似QtSPIM或MARS的模拟器。