我正在使用 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 的正整数,结果是“算术溢出”。我该如何解决这个问题?