recursion - 在 mips 程序集中查找数组中元素的总和(使用递归)
问题描述
所以,这是我需要转换为 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。但是当我尝试访问数组的内存时,可能出现了错误读取的异常。但我找不到问题。
解决方案
不确定您的代码有什么问题,这是我使用 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: "
推荐阅读
- r - r 按 Id 重新排列行
- python - 仅使用 lambda、filter、map 和 reduce 删除值的第一个实例的函数
- apache-flink - 使用 Flink 进行大型时间窗口的流连接
- php - 创建自定义字段和元框
- graphql - 通过 Role 在 User 和 Role Type 之间创建 GraphQL 连接并查询它们
- python - 在 Python 中将所需的日期格式设置为文件名
- ruby-on-rails - 如何在 Rails 应用程序中使用surveyor gem 获取公共调查网址?
- drools - Drools 规则执行挂起
- exception - Flutter:应用程序崩溃并出现运行时异常 - 已提交回复
- c# - 使用 EF 和 Postgresql 的用户定义顺序