2013-07-15 31 views
1

我似乎无法找到我的错在我的算法,我的具体问题是,我似乎打印相同的值,在控制台输入的所有整数:这里是我的代码ASM语言:因子算法错误?

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

我看到一对夫妇与您的代码的问题:

li $v0, 5
syscall
jal factorial

syscall 5(read_int)将在返回值$v0,所以当你第一次输入factorial时,你会在$v0。您可以通过在jal之前将值移至$a0来解决该问题。


li $v0, 1
syscall
jr $ra

这是不是打印使阶乘功能之外更有意义?由于$v0应该保持函数的返回值,可以考虑当你从factorial(2)返回factorial(3)会发生什么事,你已经覆盖$v0与值1

+0

我得到你的答案的第一部分,我的问题,但对第二个,我不太明白。但为了让我和你的事情变得更加容易,我只会问我如何在控制台中打印factorial的最终值?我不太确定如何去做 –

+0

_“第二个,我不太明白”_:我在说你用值1覆盖了返回值,这样当你按照你的方式工作时通过递归链返回“out”,无论“n”是什么,'factorial(n)'总是会从'factorial(n-1)'得到值1。我建议你在将_first_调用到'factorial'之后(即在'exit'' syscall'之前)移动print。 (我现在谈论你的第一个实现,我没有看第二个版本) – Michael

+0

哦,我明白了。该程序现在工作正常。感谢您的帮助! :d –