LC3汇编——循环+递归 解决斐波那契问题

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC3汇编——循环+递归 解决斐波那契问题相关的知识,希望对你有一定的参考价值。

LC3汇编——循环+递归 解决斐波那契问题

递归

;FIB subroutine
; + FIB(0) = 0
; + FIB(1) = 1
; + FIB(n) = FIB(n-1) + FIB(n-1)
;
; Input is in R0
; Return answer in R1
;
FIB ADD R6, R6, #-1
STR R7, R6, #0 ; Push R7, the return linkage
ADD R6, R6, #-1
STR R0, R6, #0 ; Push R0, the value of n
ADD R6, R6, #-1
STR R2, R6, #0 ; Push R2, which is needed in the subroutine
; Check for base case
AND R2, R0, #-2
BRnp SKIP ; Z=0 if R0=0,1
ADD R1, R0, #0 ; R0 is the answer
BRnzp DONE
; Not a base case, do the recursion
SKIP ADD R0, R0, #-1
JSR FIB ; R1 = FIB(n-1)
ADD R2, R1, #0 ; Move result before calling FIB again
ADD R0, R0, #-1
JSR FIB ; R1 = FIB(n-2)
ADD R1, R2, R1 ; R1 = FIB(n-1) + FIB(n-2)
; Restore registers and return
DONE LDR R2, R6, #0
ADD R6, R6, #1
LDR R0, R6, #0
ADD R6, R6, #1
LDR R7, R6, #0
ADD R6, R6, #1
RET

循环:


FIB ST R1,SaveR1
ST R2,SaveR2
ST R3,SaveR3
ST R4,SaveR4
ST R5,SaveR5
;
NOT R0,R0
ADD R0,R0,#1 ; R0 contains -n
AND R1,R1,#0 ; Suppose n=0
ADD R5,R1,R0 ; R5 = 0 -n
BRz DONE ; if n=0, done almost
AND R3,R2,#0 ; if n>0, set up R3 = FIB(0) = 0
ADD R1,R3,#1 ; Suppose n=1
ADD R5,R1,R0 ; R5 = 1-n
BRz DONE ; if n=1, done almost
ADD R4,R1,#0 ; if n>1, set up R4 = FIB(1) = 1
;
AGAIN ADD R1,R1,#1 ; We begin the iteration of FIB(i)
ADD R2,R3,#0 ; R2= FIB(i-2)
ADD R3,R4,#0 ; R3= FIB(i-1)
ADD R4,R2,R3 ; R4 = FIB(i)
ADD R5,R1,R0 ; is R1=n ?
BRn AGAIN
;
ADD R0,R4,#0 ; if n>1, R0=FIB(n)
BRnzp RESTORE
DONE ADD R0,R1,#0 ; if n=0,1, FIB(n)=n
RESTORE LD R1,SaveR1
LD R2,SaveR2
LD R3,SaveR3
LD R4,SaveR4
LD R5,SaveR5
RET

以上是关于LC3汇编——循环+递归 解决斐波那契问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥python斐波那契序列循环比递归慢?

gcc -O2 对递归斐波那契函数做了啥?

C语言 用调用函数和数组求斐波那契数列的前10项。 f[i]=F(f,i); 能这样用吗

剑指offer-斐波那契数列-递归和循环-python

什么是递归?怎么用它来实现斐波那契数列?

禅与计算机程序设计艺术使用 16 门编程语言实现斐波那契数列:循环控制指令与函数递归思想