Assembly Fibonacci汇编程序
我刚刚问了一个关于斐波那契序列汇编程序的问题。问题如下: 斐波那契序列Assembly Fibonacci汇编程序,assembly,fibonacci,risc,Assembly,Fibonacci,Risc,我刚刚问了一个关于斐波那契序列汇编程序的问题。问题如下: 斐波那契序列F被定义为F(1)=F(2)=1和n≥ 2, F(n+1)=F(n)+F(n− 1) i、 例如,(n+1)th值由n值和(n)之和给出− 1) th值 编写一个RISC机器典型的汇编程序,用于计算kth值F(k),其中k是一个大于2的自然数,从内存位置M加载,并将结果存储在内存位置M 我得到的答复如下: LOAD r2, M LOAD r0, #1 LOAD r1, #1 4: SUB r2, r2,
F
被定义为F(1)=F(2)=1
和n≥ 2
,
F(n+1)=F(n)+F(n− 1)
i、 例如,(n+1)th
值由n
值和(n)之和给出− 1) th
值
kth
值F(k)
,其中k
是一个大于2
的自然数,从内存位置M
加载,并将结果存储在内存位置M
LOAD r2, M
LOAD r0, #1
LOAD r1, #1
4: SUB r2, r2, #1
ADD r3, r0, r1
LOAD r0, r1
LOAD r1, r3
BNE 4, r2, #2 // jump to instruction 4 if r2 is not equal to 2
STOR M, r1
其中#表示立即寻址,BNE表示“不相等的分支”
我不明白为什么。。。谁能给我解释一下吗?代码完全正确。这里有一个评论版本,可以回答您的问题
LOAD r2, M ; R2 -> k (as F(K) has to be computed)
LOAD r0, #1 ; F(1)=1 -> r0
LOAD r1, #1 ; F(2)=1 -> r1
; As F(1) and F(2) are already computed, we start at i=2
; During al the computation of F(i) r1==F(i-1) and r0== F(i-2)
4: SUB r2, r2, #1 ; k--
ADD r3, r0, r1 ; F(i)=F(i-2)+F(i-1)
; F(i) computed, prepare next iteration (implicitely i++)
LOAD r0, r1 ; F(i-2)=r1 (previously F(i-1))
LOAD r1, r3 ; F(i-1)=r3 (just computed F(i))
BNE 4, r2, #2 // jump to instruction 4 if r2 (k) is not equal to 2
; because we have started at i==2 we must perform
; k-2 iterations.
STOR M, r1
请注意,我从未出现过,但更简单的想法是,它不是递减的k。在我看来完全正常:将最后2个Fib(i)值保留在寄存器中,以计算下一个Fib(i)值。如果他们展开了循环,您可以
x+=y
/y+=x
,但是随着循环的展开,您需要两条寄存器复制指令。e、 g.就像这个C版本:。通过3个更改,codr可以处理M>=0:|加载r0,#-1 |加载r1,#1 |…|BNE 4,r2,#-1 |。这是基于Fib(-2)=-1,Fib(-1)=1,Fib(0)=0。非常感谢Alain!你能解释一下为什么它把r2加载到M吗?我们能不能先从r0开始加载到M?我也不太明白r2 r2#1的意思。你介意解释一下吗?谢谢!第一行只是一个平均值,用于将我们想要的k值存储在寄存器中。称它为k或M,这无关紧要,但我们需要得到这个参数<代码>子r2,r2,#1是r2中的子(stract)1,并将其存储在r2中,与r2相对应。这是否意味着如果我将r0存储到M就可以了?不一定是r2到M?例如,我们可以做LOAD r0,M LOAD r1,#1 LOAD r2,#1?如果你愿意,你可以做LOAD r9,M LOAD r3,#1 LOAD r7,#1注册表名并不重要,但你必须连贯一致。在C代码中将regs视为变量。你可以使用任何名称,但在整个程序中保持相同。我想我的另一个问题是为什么从r2中减去1?