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

w8ntj3qf  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(197)

我刚刚开始编程和计算,得到了一个任务,这真的让我困惑。它有两个部分1.编写ARM汇编语言程序来计算第n个斐波那契数。第n个斐波那契数递归定义为:Fn= Fn-1 + Fn-2,其中F0 = 0且F1 = 1。使用R2表示n并计算Fn在R 0中的值。通过计算F16和F32测试程序。2.以问题1的答案为起点,编写一个ARM汇编语言程序来计算最大可能的斐波那契数(i)32位无符号算术和(ii)32位有符号算术。确保在提交的项目中报告了n和Fn的值(十六进制和十进制)。
如果(最大值- Fn-1〈Fn-2)// Fn-1 + Fn-2将大于最大值......中断;//因此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
0sgqnhkj

0sgqnhkj1#

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

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

但是它没有设置标志,所以添加S后缀。

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

接下来,您希望避免在on溢出的情况下再次循环。
编辑:让我们正确地处理这个问题。如果它没有溢出,则进行分支。)
对于32位无符号,进位标志(C)在溢出时置位(CS),如果循环应该重复则清除(CC)。

BCC      whn              ; }

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

BVC      whn              ; }

(It我已经二十年没有做过ARM编程了,假设是AArch32。)

相关问题