开发者

Mips Recursive Question

I have to create the Fibonacci sequence numbers and then check if a number that the user enters is a valid Fib. number. If it is I have to display n number of numbers up开发者_如何转开发 to their entered number. N is given by the user. So for example, if they select 3 as their Fib. number and 2 as the count it should display 13, 8

I have everything up until displaying the "13, 8" finished. Any guidance on how to step back through the stack and display the variables that were created, and subsequently overwritten, would be appreciated. Thanks!

    ##### The Data Segment #########
.data
strNumber:     .asciiz  "Enter a valid Fibonacci Number: "
strCount:       .asciiz "Enter the numbers of Fibonacci numbers to be displayed: "
strError:       .asciiz " is not a valid Fibonacci Number.\n"
strMore:         .asciiz "There are no more Fibonacci Numbers to be displayed."
newLine:         .asciiz "\n"
strBadEntry:     .asciiz "is not a valid entry."
strValid:       .asciiz "Valid Fib Number\n\n"

#### The Text Segment ##########

.text
.globl main

main:
li $t3, 39
li $t2, 0
li $t4, 1
li $t5, 1
#Get the User's Number          #Gets the number from the user
li $v0, 4
la $a0, strNumber   
syscall
li $v0, 5           #prepares to take in the user entered value
syscall             #retrives what the user entered in the console
move $s1, $v0
bltz $v0, in_error      #calls the error function if less than 0.
j DoneIf            #if those conditions aren't meant it jumps to the DoneIf

in_error: 
li $t4, 1
li $t5, 1
li $v0, 1               # print int
move $a0, $s1           # prints the user's number
syscall
li $v0, 4
la $a0, strError
syscall
li $v0, 4
la $a0, strNumber
syscall
li $v0, 5
syscall
move $s1, $v0
bltz $v0, in_error      #recall the inerror function if still less than 0 


DoneIf:                 
move $t0, $v0           #moves the value to a new location, for future use
li $v0, 4
la $a0, newLine 
syscall

#Second Number              #Gets the second number from the user
li $v0, 4
la $a0, strCount
syscall
li $v0, 5
syscall             #retrieves what the user entered in the console
bltz $v0, in_error2     #calls the second error function if less than 0
bgeu $v0, $t3, in_error2    #calls the second error function if greater than 63
j DoneIf2           #jumps to the DoneIf2 if those conditions aren't met            

in_error2:
li $v0, 4
la $a0, strBadEntry
syscall
li $v0, 4
la $a0, newLine 
syscall
li $v0, 4
la $a0, strCount
syscall
li $v0, 5
syscall
blez $v0, in_error2     #recalls the error2 function if number conditions stil aren't met
bgeu $v0, $t3, in_error2    #recalls the error2 function if number conditions still aren't meet

DoneIf2:
move $t1, $v0


jal RecursiveFunction       #Jump to Recursive Function

Exit:




RecursiveFunction:
sw $ra, 0($sp)
sw $t4, 4($sp)
sw $t5, 8($sp)


bge $t5, $t4, t5_Greater
bgt $t4, $t5, t4_Greater

Check:
bgt $t4, $t0, check_t5
check_t5:   
bgt $t5, $t0, in_error  
beq $t4, $t0, Valid
beq $t5, $t0, Valid
jal RecursiveFunction



t5_Greater:
add $t4, $t5, $t4
j Check

t4_Greater:
add $t5, $t5, $t4
j Check







Valid:  
li $v0, 4
la $a0, strValid    
syscall 
lw  $ra, 20($sp)  # Restore return address
    lw  $fp, 16($sp)  # Restore frame pointer
li $v0, 1
move $a0, $t5
syscall 


It is not the answer to your question in fact, but some guidance where to look for the mistake.

Do some research about "delay slots" and how it is related to branch instructions in MIPS processors.


Beside the fact that the code looks incomplete, there are a lot of weird things in it, example:

  • there is no instruction to increment or decrement the stack pointer
  • register saved when entering RecursiveFunction are never restored

My advice is to write most of your code in C, and start to play with MIPS only for the recursive function. When you got it, then finish your work with writing the rest.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜