我的代码有问题,需要帮助修复它

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

在此代码中,我使用 MIPS Assembly,并尝试使用递归求 3 的阶乘。但我的输出应该是 6,但输出却是 4。下面是我的代码。

    .data
result_str:     .asciiz "Factorial of 3 = "
newline:        .asciiz "\n"

    .text
    .globl main

main:
    # Calculates the factorial of 3
    li $a0, 3
    jal factorial

    # Prints the result
    li $v0, 4        
    la $a0, result_str  
    syscall

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

    # Prints a newline
    li $v0, 4
    la $a0, newline
    syscall

    # Exits program
    li $v0, 10
    syscall

factorial:
    # Save return address
    addi $sp, $sp, -8
    sw $ra, 4($sp)
    sw $s0, 0($sp)

    # if n <= 1 return 1
    li $t0, 1
    ble $a0, $t0, base_case

 
    addi $a0, $a0, -1   # save a0 to a new spot 
    jal factorial
    move $s0, $v0  

    # Multiply
    mul $v0, $a0, $s0  

    lw $ra, 4($sp)
    lw $s0, 0($sp)
    addi $sp, $sp, 8
    jr $ra

base_case:
    # If n <= 1 return 1
    li $v0, 1

    lw $ra, 4($sp)
    lw $s0, 0($sp)
    addi $sp, $sp, 8
    jr $ra

我不确定它出了什么问题,我认为代码的阶乘部分有错误。

mips
1个回答
0
投票

您不应该期望

$a0
在函数调用中幸存下来。

简单地保存递归调用返回值的副本并不是使用

$s0
的好方法。

使用

$s0
的方式可以在调用之前和之后使用,因为它在调用后仍然存在(通过遵守调用约定)。

在递归调用之前(但在函数序言之后)将

$s0
初始化为
$a0
的副本。

然后在递归调用后使用

$s0
乘以
$v0

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