c++ - mips装配中的递归斐波那契函数

标签 c++ mips

我是新手
这是家庭作业的一部分,所以我想不是给出直接答案,而是指出哪里出了问题可能对我来说最有效

目标是将此C++代码转换为mips汇编语言

#fib(int n)
#{
#   if(n == 0)
#       return 0
#   else if ( n == 1)
#       return 1
#   else
#       return fib(n-1) +fib(n-2)
#n will be stored in a0 since it is the argument
#there will be two results, fib(n-1) and fib(n-2), store in the s0 and s1, so in the stack
#return the final value in $v0





addi $s2, $zero, 10
move $a0, $s2       #move the value of n to a0 to pass the argument
jal fib
beq $zero, $zero, END


fib: #fib code

addi $sp, $sp, -12  #reserve stack space for three variable needed to store in the stack
sw $ra, 0($sp)  #for return address store in stack
sw $s0, 4($sp)  #for results store in stack
sw $a0, 8($sp)  #for first result of fib(n-1) store in the stack

beq $a0, $zero, if0
beq $a0, 1, if1

#else if case
addi $a0, $a0, -1
jal fib
move $s0, $v0

lw $a0, 8($sp)
addi $a0, $a0, -2
jal fib
add $v0, $v0, $s0

lw $s0, 8($sp)
lw $ra, 0($sp)
addiu $sp, $sp, 12
jr $ra


if0:
lw $s0, 4($sp)
lw $ra, 0($sp)
addiu $sp, $sp, 12
li $v0, 0
jr $ra


if1:
lw $s0, 4($sp)
lw $ra, 0($sp)
addiu $sp, $sp, 12
li $v0, 1
jr $ra




END:
    nop

但是,当n = 10时,结果不会给我55
v0中存储的当前结果为我提供了21的值
有人可以帮助我,我到底在哪里做错了?
提前致谢。

最佳答案

这是我之前使用过的代码。
您可以使用此代码作为基础并将您的代码与此

.text
.align 2
.globl main

# Computes Fibonacci Sequence
# i =  0  1  2  3  4  5  6  7  8  9  10 ...
# x =  0  1  1  2  3  5  8 13 21 34  55 ...


main:
 la $a0, prompt
 li $v0, 4
 syscall    #Prompt for Int

 li $v0, 5
 syscall    #Response

 move $a0, $v0  #Move i to the $a0 register

 jal vfib

 add  $a0, $v0, $zero  #display Result
 li $v0, 1
 syscall

 li $v0, 10   #Exit Program
 syscall


vfib: 
 #Test Values
 addi $t0, $zero, 1  #Set $t0 to 1
 beq $a0, $zero, fib0 #Go to return 0 if i = 0
 beq $a0, $t0, fib1  #Go to return 1 if i = 1
 jr fib

fib0:
 li $v0, 0   #Return 0
 jr $ra

fib1:
 li $v0, 1   #Return 1
 jr $ra

fib:
 #Free Stack Space
 addi $sp, $sp, -16  #Make room for 4 elements in stack
     #$ra and i stored now, sums later
 sw $ra, 0($sp)  #Save return address
 sw $a0, 4($sp)  #Save i

 #Calculate (fib(n-1))
 addi $a0, $a0, -1  #Decrement i
 jal vfib   #recurse for (fib(n-1))
 sw $v0, 8($sp)  #Save value of (fib(n-1))

 #Calculate (fib(n-2))
 lw $a0, 4($sp)  #restore value of i from stack
 addi $a0, $a0, -2  #Decrement i twice
 jal vfib   #recurse for (fib(n-2))
 sw $v0, 12($sp)  #save result of (fib(n-2))

 #Restore from stack and sum
 lw $ra, 0($sp)  #Load return address
 lw $t0, 8($sp)  #load (fib(n-1))
 lw $t1, 12($sp)  #load (fib(n-2))
 addi $sp, $sp, 16  #free up 4 elements on stack
 add $v0, $t0, $t1  #Sum (fib(n-1) + fib(n-2))

 jr $ra

.data
prompt:  .ascii "Enter a non-negative integer: "

关于c++ - mips装配中的递归斐波那契函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61471983/

相关文章:

c++ - CHUNKSTATE 和 STAT_CHUNK 未定义

c++ - 如何找到文件/文件夹的所有硬链接(hard link)和符号链接(symbolic link)(Windows 和 UNIX)?

c - 使用 或 掩码进行位操作

compiler-construction - MIPS 编译器中的寄存器——使用哪个?

c++ - 在基类c++中使用带有变量的类中的构造函数

c++ - 总是使用指针而不是引用是否可以接受,以便在需要时轻松转换为智能指针?

c++ - CComboBox::GetLBText 返回垃圾

c - MIPS:将 C 代码转换为 MIPS 函数调用和返回中的问题

arrays - MIPS 钻石分选

mips - MIPS 中整数的表示