assembly - 斐波那契汇编程序
问题描述
我刚收到一个关于斐波那契数列汇编程序的问题。问题如下: 斐波那契数列F
定义为F(1) = F(2) = 1
和 对于n ≥ 2
,
F(n + 1) = F(n) + F(n − 1)
即(n + 1)th
值由nth
值和(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
请注意, i 从未出现,但考虑它更简单,而不是减少 k。
推荐阅读
- java - 如何在 Eclipse 上打印 Java 表情符号
- firebase - Firebase 函数日志记录不适用于不可调用函数
- c# - 动态 ImageButton ImageClickEventHandler 未触发
- java - 如何在 Java 中使用 Regex 提取 SQL FROM 子句中的表名?
- c - C中的函数泛化
- reactjs - React Hooks - 动态添加或删除输入字段时输入失去焦点
- javascript - 当他们选中复选框时尝试提取用户电子邮件
- pycuda - 推送/弹出 pycuda 上下文时出现 CuPy 错误
- python - 为什么 Python3.6 允许这个 float('20200407_2') ?
- swift - SwiftUI 和带有 coreData 的列表,意外行为,为什么它删除另一行,而不是我选择