接着上面的c++分析,我们来实现这个斐波那契函数,首先,我们要知道程序需要我们与之交互,也就是说我们要告诉程序n是多少,在c++里你可能很熟悉,就是cin或者cout可以交互,其实在mips汇编语言里面,情况也是差不多的,SPIM仿真一个I/O设备:一个内存映射的控制台(console),在这个控制台中可以读和写字符,而SPIM可以通过系统调用指令即syscall提供一小组类似操作系统的服务,为了请求一个服务,一个程序加载系统调用代码到寄存器$v0,将参数加载到寄存器$a0-$a3,系统调用将返回值放到$v0,那我们下面通过一个简单的例子说明:
.text
main: li $v0,5
syscall
move $a0,$v0
li $v0,1
syscall
jal $ra
.text说明下面是代码段,与之对应的是.data,表明是程序所需要的数据,下面会看到相应的应用,这里面进入到main函数,首先把5取到$v0,调用的是read_int服务,那么我们把这个整数读取并且放在$v0寄存器中了,再输出可以用1调用print int服务。
那么这简单的铺垫解决了一些基本的问题,我们继续分析!
手头上刚好有一份别人的递归代码,贴上来仅供参考:
.text
main:
subu $sp, $sp, 32 #set up main's stack frame:
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
##Get n from the user, put into $a0.
li $v0, 5 #load syscall read_int into $v0
syscall #make the syscall
move $a0, $v0 #move the number read into $t0
jal prone #call prone
move $a0, $v0
li $v0, 1 #load syscall print_int into $v0
syscall #make the syscall
la $a0, newline
li $v0, 4
syscall #make the syscall
li $v0, 10 #10 is the exit syscall.
syscall
##prone--(project one)
##Registers used:
## $a0, -initiallly n.
## $t0, -parameter n.
## $t1, -prone(n - 1).
## $t2, -prone(n - 2).
## $t3, -prone(n - 3).
.text
prone:
bgt $a0, 2, prone_recurse
subu $v0, $a0, $zero
jr $ra
prone_recurse: #the recursive case:
subu $sp, $sp, 32 #frame size = 32
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
move $t0, $a0 #get n from caller.
sw $t0, 20($sp) #preserve n.
sub $a0, $t0, 1 #compute prone(n -1)
jal prone
move $t1, $v0 #t1 = prone(n-1)
lw $t0, 20($sp) #restore $t0
sw $t1, 16($sp) #preserve $t1.
sub $a0, $t0, 2 #compute prone(n -2)
jal prone
move $t2, $v0 #t1 = prone(n-2)
lw $t1, 16($sp) #restore $t1.
lw $t0, 20($sp)
sw $t2, 12($sp) #preserve $t2
sub $a0, $t0, 3 #compute prone(n -3)
jal prone
move $t3, $v0 #t2 = prone(n - 3)
lw $t2, 12($sp) #restore $t2.
lw $t1, 16($sp)
mul $t4, $t3, 3
sll $t5, $t2, 1
add $t4, $t4, $t5
add $v0, $t4, $t1
lw $ra, 28($sp)
lw $fp, 24($sp)
addu $sp, $sp, 32
jr $ra
##data for prone.s:
.data
newline: .asciiz"\n"
##end of prone.s
jr $ra
转载于:https://blog.51cto.com/hereandthere/1337669