【问题标题】:Write an ARM Assembly Language program to compute the nth Fibonacci number编写一个 ARM 汇编语言程序来计算第 n 个斐波那契数
【发布时间】:2019-03-15 11:01:09
【问题描述】:

我刚开始从事编程和计算工作,得到了一个让我非常困惑的任务。它有两个部分 1.编写一个ARM汇编语言程序来计算第n个斐波那契数。这 第 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 的值(在 十六进制和十进制)在您的项目提交中。

if (MAX - Fn-1

到目前为止我有:

        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

【问题讨论】:

  • 嗨,卡梅伦,欢迎来到 SO。您应该尝试花一些精力来格式化您的问题。代码 sn-ps 应该放在代码块中。您也可以使用项目符号和编号。
  • 请不要使用随机标签 - 这与 Java 有什么关系?
  • 另外,将代码复制并粘贴到问题中。
  • 您还没有在这里真正描述您的问题。您已经说明了您想要实现的目标,并且您已经提供了您当前的代码。但是,您当前的代码究竟做了什么不应该做的事情,或者不应该做的事情?尽可能具体。

标签: assembly arm fibonacci


【解决方案1】:

所以你想在这条指令之后测试标志。

    ADD      R0, R0, R3      ; fn = fn + fn1

但它没有设置标志。所以加上S后缀。

    ADDS     R0, R0, R3      ; fn = fn + fn1

接下来你要避免在溢出的情况下再次绕过循环。

编辑:让我们做对了。如果它没有溢出,则分支。)

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

    BCC      whn              ; }

对于 32 位有符号,溢出标志 (V) 在溢出时设置 (VS),如果应该重复循环,则清除 (VC)。

    BVC      whn              ; }

(我已经有 20 年没有做过任何 ARM 编程了。假设是 AArch32。)

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2019-07-11
    • 1970-01-01
    • 2014-04-26
    • 2015-12-16
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多