Функция для создания последовательности Падована в мипс - PullRequest
0 голосов
/ 20 сентября 2019

Итак, я пытаюсь сделать эту последовательность, которая похожа на Фибоначчи, я сделал следующий код, но когда я выполняю, он просто отображает запятую и ноль, я довольно плохо знаком с MIPS, поэтому я не смогвыявить проблему.спасибо

.data
          prompt1: .asciiz "Enter an integer value\n"
          prompt2: .asciiz "The Padovan sequence numbers are:\n"
          prompt3: .asciiz "You have entered a value between 0 and 2, the sequence value is 1"
          prompt4: .asciiz "You have entered a negative value, the program will exit "
          comma:   .asciiz ","  #Comma to insert between numbers

.text
main:

          #Ask the user for an input
          la   $a0, prompt1
          li   $v0, 4
          #Get the number from the user and move it into another register
          #and branch if the input is less than zero
          li   $v0, 5
          syscall
          move $a0, $v0
          bltz $a0, main_exit
          #Jump and link to the tag and save the result
          move $t2, $v0
          jal padovan
          #Print the message prompt2
          la   $a0, prompt2
          li   $v0, 4
          syscall
          #Print the result
          li   $v0, 1
          move $a0, $t2
          syscall
          #Print the Comma
          la   $a0, comma
          li   $v0, 4
          syscall
          j main

less_than2input:

          la   $a0, prompt3
          li   $v0, 4
          syscall
          #Exit the program
          li   $v0, 10
          syscall

main_exit:
          la   $a0, prompt4
          li   $v0, 4
          syscall
          #Exit the program
          li   $v0, 10
          syscall

padovan:
          bgt  $a0, 2, pado_full   #If the input is greater than 2 jump to the full function
          move $v0, $a0
          jr   $ra

pado_full:
          sub  $sp, $sp, 16
          sw   $ra, 4($sp)
          sw   $a0, 8($sp)

          addi $a0, $a0, -2
          jal  padovan
          sw   $v0, 0($sp)

          addi $a0, $a0, -1
          jal padovan

          lw   $t0, 0($sp)
          add  $v0, $t0, $v0

          lw   $ra, 4($sp)
          lw   $a0, 8($sp)
          addi $sp, $sp, 16

          jr   $ra

1 Ответ

2 голосов
/ 20 сентября 2019

Вы вызываете функцию, которая возвращает возвращаемое значение в $v0, а затем почти сразу после вызова функции вы закрываете $v0 значением 4 (код системного вызова для строки печати) - этот акт уничтожаетсяединственная имеющаяся у вас копия значения вызова функции.Есть и другие проблемы.


Вам необходимо освоить базовые навыки отладки.

Один шаг с использованием небольшого контрольного примера по всей программе - лучший начальный подход - через некоторое время (скажем,когда у вас работает первая часть программы) вы можете установить и запустить ее до точки останова и одного шага оттуда;с подходом точки останова мы можем работать с большими контрольными случаями, когда пошаговое выполнение всей программы нецелесообразно.Но, чтобы повторить, вы должны приобрести навык и привычку к одному шагу хотя бы один раз для каждой строки кода, которую вы пишете.


При выполнении одного шага проверяйте следующее после выполнения каждой инструкции:

  • вычисление, убедитесь, что вычисленное значение имеет смысл, что обновленное значение соответствует ожидаемому
    • для арифметических инструкций и инструкций загрузки, проверьте регистр,
    • для загрузки исохранить инструкции, убедиться, что используемый адрес памяти имеет смысл
    • для хранения инструкций, убедиться, что память обновлена ​​должным образом, и на окружающую память не было оказано отрицательного воздействия, как это может случиться с sw приsb было правильным (не ваш случай здесь).
  • поток управления: убедитесь, что следующая инструкция является правильной для выполнения следующей
    • для условнойследуйте инструкциям ветвления, убедитесь, что принятые и не принятые совпадения ожидаются для условия
  • И последнее, но очень важное значениеособенно здесь, убедитесь, что другие важные значения не были перекрыты последней инструкцией, «случайно» удаляющей что-то.

Если вы будете следовать этому подходу, вы увидите проблемы после вызова padovan.

...