我必须创建斐波那契序列号,然后检查用户输入的数字是否是有效的Fib。数。如果是,我必须显示n个号码,直到他们输入的号码。 N由用户给出。例如,如果他们选择3作为他们的Fib。号和2作为计数它应该显示 13,8Mips递归问题
我所拥有的一切,直到显示“13 8”完成。任何有关如何退回堆栈并显示已创建的变量并随后被覆盖的指导,将不胜感激。谢谢!
##### 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
正常情况下,汇编程序为您处理延迟时隙。至少在GNU汇编程序中,除非你不要使用'.set noreorder'指令 – 2011-03-28 20:45:55
@Laurent来执行它,认真吗?那么,它的好呢。我已经在MIPS的最底层(动态地发布二进制代码本身),所以延迟插槽有很大的混乱。这就是为什么我不知道汇编程序如何解决这种情况。 – xappymah 2011-03-29 02:08:03
AFAIK,GNU汇编程序只尝试将具有延迟槽的指令与其前任交换,同时确保它不会中断依赖关系。大多数情况下,它会失败,只需插入一条NOP。说实话,对于在一个给定的项目中值得在程序集中编写的代码行,我个人更喜欢自己处理延迟插槽(因此'.set noreorder' directive)。当你的项目大部分是组装时,你肯定有自己处理它们所需的技能。再一次,它不值得让组装者完成这项工作。 – 2011-03-29 06:03:22