MIPS - 在输出旁边打印输入

MIPS - Prints the input next to output

我正在学习 MI,试图用 MIPS 汇编代码编写阶乘程序,

3! = 6 (my output shows it 36)(input next to output)
4! = 24(my output shows it as 424)

这是我的代码。我应该怎么做才能摆脱打印输入?

         .data
num:     .asciiz "\nPlease enter a number: "
num2:     .asciiz"\nPlease give your second number : "
respon:   .asciiz "\nThe factorial of the entered number is: "
nl:       .asciiz"\n"
        .text

fact:
        beqz $a0,return1

        li $v0, 1
        li $t0, 1

fact_loop:
        bgt $t0, $a0, end_fact_loop
        mul $v0, $v0, $t0
        addi $t0, $t0, 1

        j fact_loop

end_fact_loop:
        jr $ra

return1:
        li $v0, 1
        jr $ra

main:   
        li $v0, 4
        la $a0, num
        syscall

        li $v0, 5
        syscall
        move $t0, $v0

        li $v0, 4
        la $a0, respon
        syscall

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

        jal fact
        move $t0, $v0

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

        li $v0, 4
        la $a0, nl
        syscall
        
 ################################
        li $v0, 4
        la $a0, num2
        syscall

        li $v0, 5
        syscall
        move $t0, $v0

        li $v0, 4
        la $a0, respon
        syscall

        li $v0, 1
        move $a0, $t0
        syscall
        jal fact

        move $t0,$v0

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

        li $v0, 10
        syscall

几点建议:

  • 为每个功能代码块添加注释。
  • 使用单步调试,这样您就可以看到发生了什么。
  • 将代码简化为最小的失败示例。如果您有两段代码都表现出相同的问题,请删除其中一个并专注于第一个,而不会受到第二个的干扰和干扰。
  • 删除不必要的代码。例如,return1: 块和 beqz $a0,return1 是多余的,因为主阶乘循环会自动表现出相同的行为——您不需要专门处理 $a0 == 0

按照这些提示,我完成了以下程序:

    .data
num:     .asciiz "\nPlease enter a number: "
num2:    .asciiz "\nPlease give your second number : "
respon:  .asciiz "\nThe factorial of the entered number is: "
nl:      .asciiz "\n"
    .text

fact:
    li $v0, 1
    li $t0, 1

fact_loop:
    bgt $t0, $a0, end_fact_loop
    mul $v0, $v0, $t0
    addi $t0, $t0, 1
    j fact_loop

end_fact_loop:
    jr $ra

main:
    # print prompt "Please enter a number: "
    li $v0, 4
    la $a0, num
    syscall

    # get user input for first fact call
    li $v0, 5
    syscall
    move $t0, $v0

    # call fact(n)
    move $a0, $t0
    jal fact
    move $t0, $v0

    # print "factorial is..."
    li $v0, 4
    la $a0, respon
    syscall

    # print the result of fact(n)
    li $v0, 1
    move $a0, $t0
    syscall

    # print newline
    li $v0, 4
    la $a0, nl
    syscall
    
    # exit program
    li $v0, 10
    syscall

重复打印的问题是由这段代码引起的:

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

move $a0, $t0 是设置 fact 调用所必需的,但我们不需要 li $v0, 1syscall,它们在前面打印没有换行符的参数fact 的结果,导致您不需要的输出。

将来防止这种情况发生的一个好方法是确保为 fact 函数调用设置的参数恰好发生在 jal.

之前

我将把它留作练习以适应您的第二段代码,它具有相同的额外 syscall 服务 1(打印整数)。

要取消打印输入,您必须删除要打印它们的 syscall

也就是说,在 jal-ing fact(两次)之前,您发出这些指令:

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

只是,删除第一条和第三条指令并保留 move,因为您在 fact 例程中使用它:

    move $a0, $t0