Предотвращение ошибки неверного адреса при реализации рекурсии в сборке - PullRequest
0 голосов
/ 23 апреля 2020

Я практикую рекурсию в сборке с набором команд MIPS, но я всегда получаю «ошибку неверного адреса»

fibonacci:
   # PROLOGUE
   subu    $sp, $sp, 8
   sw    $ra, 8($sp)
   sw    $fp, 4($sp)
   addu    $fp, $sp, 8

   # BODY
   bgt $a0, 1, rec
   move $v0, $a0
   j ret

rec:
   subu $a0, $a0, 1 #sets a0 = j-1
   subu $s0, $a0, 1 #saves s0 = j-2 for later
   jal  fibonacci         # call fibonacci
   # $v0 == f(j-1)
   move $t0, $v0 # t0 = f(j-1)
   move $a0, $s0 #sets a0 = j-2
   jal fibonacci
   add   $v0, $v0, $t0      # $v0 = f(j-2) + f(j-1) 
ret:
   # EPILOGUE
   move    $sp, $fp
   lw    $ra, ($fp)
   lw    $fp, -4($sp)
   jr     $ra

Этот код прекрасно работает на входах 1, 2, но когда я пытаюсь вычислив f (3), я получаю следующее:

Exception occurred at PC=0x0040004c
  Bad address in data/stack read: 0x00000004
  Exception 7  [Bad data address]  occurred and ignored

Я подозреваю, что проблема связана со вторым вызовом Фибоначчи. Но что может быть проблемой со вторым вызовом Фибоначчи? Ничто не выглядит подозрительно.

...