刚学汇编,记录一下
C语言版:
int fib(int n)
{
if(n == 1 || n == 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
mips汇编语言:
.text
.globl main
main:
addi $s0, $0, 16
addi $a0, $0, 8
jal fib
add $s6, $v0, $0
li $v0,10
syscall #退出
fib:
addi $sp, $sp, -12
sw $a0, 8($sp)
sw $ra, 4($sp)
sw $s0, 0($sp)
addi $t0, $0, 2
addi $t1, $0, 1
beq $a0, $t0, if #if(n == 1 || n == 2)
beq $a0, $t1, if
#else
addi $a0, $a0, -1 #func(n - 1)
addi $sp, $sp, -4
sw $a0, 0($sp) #存a0
jal fib
add $s0, $v0, $0
lw $a0, 0($sp) #取a0
sw $s0, 0($sp) # 存s0----func(n - 1)的返回值
addi $a0, $a0, -1 #func(n - 2)
jal fib
lw $s0, 0($sp) # 取s0
addi $sp, $sp, 4
add $v0, $v0, $s0 #func(n)的返回值
lw $s0, 0($sp)
lw $ra, 4($sp)
lw $a0, 8($sp)
addi $sp, $sp, 12
jr $ra
if:
addi $sp, $sp, 12 #回收栈空间
addi $v0, $0, 1 #return 1
jr $ra
程序计算fib(8)的值,并保存到s6里面,另外func里面使用了s0,因此需要保存到栈里面。下面是结果,s6中结果为0x15=21,并且s0里面保存的值并没有被fib修改