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的模拟器。