ASM语言:因子算法错误?

时间:2013-07-15 13:16:22

标签: assembly mips spim

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

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

1 个答案:

答案 0 :(得分:1)

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

  

li $v0, 5
  syscall
  jal factorial

syscall 5(read_int)将返回$v0中的值,因此当您第一次输入factorial时,您将在{{1}中输入参数}}。您可以通过在$v0之前将值移至$a0来解决此问题。


  

jal
    li $v0, 1
    syscall

这种印刷品在阶乘函数之外不会更有意义吗?由于jr $ra应该包含函数的返回值,因此请考虑从$v0返回到factorial(2)时会发生什么,并且您已使用值1覆盖factorial(3)。 / p>