Рекурсивный продукт MIPS - PullRequest
0 голосов
/ 26 апреля 2019

Я внес некоторые изменения в код, но он все еще печатает 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 голосов
/ 26 апреля 2019

Вы печатаете адрес памяти, а не результат ваших расчетов.

Это связано с повторным использованием $a0, который все еще содержит адрес num1. Вы должны хранить только два операнда в $a0 и $a1, если это все, что нужно для multiply.

Кроме того, ваша инструкция добавления не использует результат предыдущего рекурсивного вызова. Вместо этого он использует два регистра аргументов.

Наконец, системный вызов 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)
...