1

我似乎找不到我的算法错在哪里,我的具体问题是我似乎为控制台中输入的所有整数打印相同的值:这是我的代码

main:

li $v0, 5
syscall
jal factorial
li $v0, 10
syscall

factorial:
    ###preamble###
    subu $sp, $sp, 32
    sw $ra, 28($sp)
    sw $fp, 24($sp)
    addu $fp, $sp, 32
    sw $a0, 20($fp)
    ###preamble###

    lw $v0, 20($fp)
    bgtz $v0, multiply
    li $v0, 1
    j end

multiply:
    lw $v1, 20($fp)
    subu $v0, $v1, 1
    move $a0, $v0
    jal factorial

    lw $v1, 20($fp)
    li $t3, 0
    li $t2, 1
    b multi

    multi:
        beq $t2, $v0, endLOOP
        add $t3, $t3, $v1
        add $t2, $t2, 1
        b multi

    endLOOP:
        move $v0, $t3

end:
    lw $ra, 28($sp)
    lw $fp, 24($sp)
    addu $sp, $sp, 32
    move $a0, $v0
    li $v0, 1
    syscall
    jr $ra

在这段代码中,我似乎总是打印一个 10 的值,而在我的第二个代码中,我总是得到一个 11

main:

li $v0, 5
syscall 
jal factorial
li $v0, 10
syscall

factorial:
    ###preamble###
    subu $sp, $sp, 32
    sw $ra, 28($sp)
    sw $a0, 24($sp)
    li $v0, 1
    ble $a0, $zero, end
    b multiply
    ###preamble###

multiply:
    addi $a0, $a0, -1
    jal factorial
    lw $a0, 24($sp)
    b multi
    multi:
        beq $t2, $v0, endLOOP
        add $t3, $t3, $a0
        add $t2, $t2, 1
        b multi

    endLOOP:
        move $v0, $t3

end:
    lw $ra, 28($sp)
    addu $sp, $sp, 32
    move $a0, $v0
    li $v0, 1
    syscall
    jr $ra

另外,请注意,我们不允许使用 mult 功能,所以请不要问我为什么不使用它。谢谢你的帮助:D

4

1 回答 1

1

我发现您的代码存在一些问题:

li $v0, 5
syscall
jal factorial

syscall5( read_int) 将返回 in 的值$v0,因此当您factorial第一次输入时,您将拥有 in 的参数$v0。您可以通过将值移动$a0jal.


li $v0, 1
syscall
jr $ra

这个打印在阶乘函数之外不是更有意义吗?由于$v0应该保存函数的返回值,请考虑当您从factorial(2)to返回factorial(3)并且您已被$v0值 1 覆盖时会发生什么。

于 2013-07-15T13:54:51.593 回答