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

  • 编写一个RISC机器典型的汇编程序,用于计算
    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?