[MIPS阶乘程序输出错误答案

问题描述 投票:0回答:1

这里是MIPS的入门者。我编写了此程序,以从用户输入中获取一个整数,并使用一个函数来输出n!的值。由于某种原因,我得到的数字是不正确的(12代表4!)。我不确定为什么我的fac方法看起来有用吗?非常感谢您对我的代码进行调整的帮助!

    .text
    .globl main 

    main:
    li $v0, 5
    syscall
    ble $v0, 0, ZeroNeg
    move $a0, $v0

    jal fac

    move $a0, $v0
    li $v0, 1
    syscall
    li $v0, 10
    syscall 

    fac:    
    #spill registers
    addi $sp, $sp, -20
    sw $ra, 0($sp)
    sw $s0, 4($sp)
    sw $s1, 8($sp)
    sw $s2, 12($sp)
    sw $s3, 16($sp)

    loop:   
    move $s0, $a0 # s0 = n
    addi $s1, $zero, 1
    ble $a0, $s1, done
    addi $a0, $a0, -1

    addi $s2, $s0, -1 # s2 = n-1  
    beq $s3, $zero, sets3
    c:      
    mul $s3, $s3, $s2 
    addi $s0, $s0, -1
    jal fac

    done:      
    move $v0, $s3
    #unspill registers
    lw $ra, 0($sp)
    lw $s0, 4($sp)
    lw $s1, 8($sp)
    lw $s2, 12($sp)
    lw $s3, 16($sp)
    addi $sp, $sp, 20  
    jr $ra 

    sets3: 
    add $s3, $zero, $s0
    j c

    ZeroNeg: 
    move $v0, $zero
    li $v0, 1
    syscall
    li $v0, 10
    syscall         
recursion assembly mips factorial
1个回答
0
投票

您的函数应该是尾递归的,对吗?但是,您不必返回从递归jal fac获得的返回值,而是使用move $v0, $s3销毁它。

您嵌套最深的函数将返回正确的值,但随后您用保存/恢复的$s3继续使用它。

$v0尾递归后,您的返回值已经在jal fac中;或至少应该如此。

© www.soinside.com 2019 - 2024. All rights reserved.