首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写ARM汇编语言程序计算第n个斐波纳契数

编写ARM汇编语言程序计算第n个斐波纳契数
EN

Stack Overflow用户
提问于 2018-10-10 13:50:54
回答 1查看 7.3K关注 0票数 1

我刚开始学习编程和计算,得到了一个让我很困惑的任务。它有两个部分:1.用ARM汇编语言程序计算第n个Fibonacci数。第n个斐波那契数递归地定义为: Fn= Fn-1 + Fn-2,其中F0 =0,F1 = 1。对n使用R2,在R0中计算Fn。通过计算F16和F32来测试程序。2.以您对Q1的回答为起点,编写ARM汇编语言程序,使用(i) 32位无符号算法和(ii) 32位签名算法计算最大可能的斐波那契数。确保在项目提交中报告n和Fn (十六进制和十进制)的值。

如果(MAX - Fn-1 < Fn-2) // Fn-1 + Fn-2大于最大…//因此Fn-1是最大的斐波那契数。

到目前为止,我已经:

代码语言:javascript
复制
        AREA    RESET, CODE, READONLY
        ENTRY

start   MOV     R1, #16     ; n = 16
        MOV     R3, #0      ; fn1 = 0
        MOV     R0, #1      ; fn = 1
        MOV     R2, #1      ; curr = 1
whn     CMP     R2, R1      ; while (curr < 1)
        BHS     endwhn      ; {
        ADD     R2, R2, #1  ;   curr = curr + 1
        MOV     R4, R0      ;   tmp = fn
        ADD     R0, R0, R3  ;   fn = fn + fn1
        MOV     R3, R4      ;   fn1 = tmp
        B       whn         ; }
endwhn

STOP    B       STOP

        END
EN

回答 1

Stack Overflow用户

发布于 2018-10-10 14:02:01

因此,您希望在此指令之后测试这些标志。

代码语言:javascript
复制
    ADD      R0, R0, R3      ; fn = fn + fn1

但它没有设置旗子。所以添加S后缀。

代码语言:javascript
复制
    ADDS     R0, R0, R3      ; fn = fn + fn1

接下来,您希望避免在on溢出的情况下再次循环。

(编辑:,让我们把这个做对了。如果没有溢出,则为分支。)

对于32位无符号的情况,在溢出时设置进位标志(C),如果应该重复循环,则清除(CC)。

代码语言:javascript
复制
    BCC      whn              ; }

对于32位签名,溢出标志(V)被设置(VS)溢出,清除(VC),如果循环应该重复。

代码语言:javascript
复制
    BVC      whn              ; }

(我已经20年没有做过ARM编程了。(假设为AArch32.)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52741816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档