递归产品技巧

时间:2019-04-26 01:20:56

标签: recursion mips mips32

我对代码进行了一些更改,但它仍在打印9位数字。不知道这是怎么回事。当我输入2 * 3时,它输出268501017。我很难找出如何从寄存器中获取结果并将其打印出来。

    main:


            #prompt 1
            li $v0, 4        # Print the String at Label “Input”
            la $a0, num1
            syscall
            li $v0, 5                      
            syscall
            move $a2, $v0

            #prompt 2
            li $v0, 4     # Print the String at Label “Input”
            la $a0, num2
            syscall
            li $v0, 5      # Read integer from user
            syscall
            move $a1, $v0  # Pass integer to input argument register $a0

            jal multiply       

            add $a1, $v0, $zero
            li  $v0, 1
            syscall

        li $v0, 10
        syscall

    multiply:

            bne $a1, 0, recurse  
            move $v0, $a1
            jr $ra

    recurse:

        sub $sp, $sp, 12
            sw $ra, 0($sp)
            sw $a0, 4($sp)
            sw $a1, 8($sp)

        addiu $a1, $a1, -1 #product(x, y-1)
            jal multiply

            lw $a1, 4($sp)
            add $v0, $a2, $a1

            lw $ra, 0($sp)
            addi $sp, $sp, 12
            jr $ra

1 个答案:

答案 0 :(得分:0)

您正在打印内存地址,而不是计算结果。

这是由于重新使用$a0,而该地址仍保留着num1的地址。如果$a0仅需要这两个操作数,则应仅将它们存储在$a1multiply中。

此外,您的add指令不使用上一个递归调用的结果。而是使用两个参数寄存器。

最后,系统调用1在$a0中打印数字,而不是$a1

所以:

  1. move $a2, $v0应该是move $a1, $v0(第10行)
  2. move $a1, $v0应该为move $a0, $v0(第18行)
  3. add $a1, $v0, $zero应该为add $a0, $v0, $zero(第22行)
  4. add $v0, $a2, $a1应该为add $v0, $v0, $a1(第46行)