关于斐波那契函数的MIPS汇编代码

问题描述 投票:0回答:0

我正在使用 MIPS 汇编代码处理 Fibonacci 函数,它最初使 F(0) = F(1) = 1,并产生两个结果:$v0 用于指示 F(n) 的 n 是否为负数(负数时值为 0,0 或正数时值为 1),函数结果为 $v1。下面是我的代码:

.data

newline:
  .asciiz "\n"

str0:
  .asciiz "Enter a positive integer: "

str1:
  .asciiz "ERROR\n"

str2:
  .asciiz "Result: "

.text

fibonacci:
  addi $sp, $sp, -12
  sw $ra, 8($sp)
  sw $s0, 4($sp)
  sw $s1, 0($sp)
  move $s0, $a0
  li $s1, 1
  bgtz $s0, loop
  add $zero, $zero, $zero
  li $v0, 1
  j exit

loop:
  beq $s0, 1, exit
  add $zero, $zero, $zero
  add $t0, $s1, $zero
  add $s1, $s1, $s0
  move $s0, $t0
  addi $s0, $s0, -1
  j loop

exit: 
  move $v1, $s1
  lw $ra, 8($sp)
  lw $s0, 4($sp)
  lw $s1, 0($sp)
  addi $sp, $sp, 12
  bltz $a0, negative
  add $zero, $zero, $zero
  li $v0, 1
  j return

negative:
  li $v0, 0
  j return

return:
  jr $ra


.globl main
main:
  # print_string str0
  li $v0, 4
  la $a0, str0
  syscall

  # $t0 = read_int
  li $v0, 5
  syscall
  move $t0, $v0

  # $s0 = $ra; fibonacci($t0); $ra = $s0
  move $s0, $ra
  move $a0, $t0
  jal fibonacci
  move $ra, $s0

  # $t0 = $v0; $t1 = $v1
  move $t0, $v0
  move $t1, $v1

  # if ($t0 == 0) { goto main_failure }
  beq $t0, $zero, main_failure

main_success:
  # print_string str2
  li $v0, 4
  la $a0, str2
  syscall

  # print_int $t1
  li $v0, 1
  move $a0, $t1
  syscall

  # print_string newline
  li $v0, 4
  la $a0, newline
  syscall

  # goto main_return
  b main_return

main_failure: 
  # print_string str1
  li $v0, 4
  la $a0, str1
  syscall

main_return:
  # return
  jr $ra

当我使用 Spim 运行此代码时,对于输入 0、1 和负数,结果正确。但是,对于大于 1 的正整数,结果是“算术溢出”。我该如何解决这个问题?

mips fibonacci
© www.soinside.com 2019 - 2024. All rights reserved.