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

时间:2018-10-10 13:50:55

标签: assembly arm fibonacci

我刚刚开始编程和计算,得到的任务确实让我感到困惑。它分为两个部分 1.编写一个ARM汇编语言程序以计算第n个斐波纳契数。的 第n个斐波那契数递归定义为: Fn = Fn-1 + Fn-2 其中F0 = 0和F1 = 1。 对n使用R2并在R0中计算Fn。通过计算F16和F32来测试您的程序。 2.以对第一季度的答案作为起点,编写一个ARM汇编语言程序 使用(i)32位无符号算术来计算最大可能的斐波那契数 (ii)32位带符号算术。确保报告n和Fn的值(在 十六进制和十进制)。

如果(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

1 个答案:

答案 0 :(得分:0)

因此,您想在执行此指令后测试这些标志。

    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              ; }

(自从我完成任何ARM编程已经二十年了。假设是AArch32。)