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.
精彩评论