如何在ARM中制作斐波那契序列?

时间:2018-11-11 15:21:48

标签: assembly arm fibonacci

我需要制作一个ARM汇编程序,该程序将打印出斐波那契数列,但我不确定该如何处理。该程序将询问用户一个数字,当他们输入该数字时,该程序应打印出该数字的斐波那契数列,例如,如果用户输入10,该程序将通过打印

“斐波那契数1是1。”

“斐波那契数2是1。”

以此类推。

目前,我的代码如下:

B   main

maxF    DEFW    0
enterI  DEFB "Please enter the number of fibonacci numbers to print: ",0
newline DEFB "\n",0
fibbo   DEFB    "Fibonacci number ",0
is      DEFB    " is ",0
end     DEFB    ".\n",0
errorM  DEFB "Error, try again!\n",0

    ALIGN                          
main    ADR R0, enterI
    SWI 3
    MOV R1, #0
    MOV R2, #10                                         
    MOV R3, #0      ;lastNumber variable
    MOV R4, #1      ;numberbeforeLast variable
    MOV R5, #0      ;currentNumber variable

start   SWI 1           ;take user input

    CMP R0, #10     ;compare R0 with #10 (enter)
    BEQ _end        ;if equal, go to _end

    CMP R0, #48     ;compare R0 with #48 (0)
    BLT _error      ;if less than, go to _error

    CMP R0, #57     ;compare R0 with #57 (9)
    BGT _error      ;if greater than, go to _error

    SUB R0, R0, #48 ;R0 = R0 - #48
    SWI 4           ;print the above

    MUL R1, R1, R2  ;Multiply the R1 register by R2 and store in R1
    ADD R1, R1, R0  ;Add the R1 register to R0 and store in R1

    B while_cond
 while_loop
    ADD R5, R3, R4  ;currentnumber = lastnumber + numberbeforelast
    ADR R0, fibbo
    SWI 3
    STR R5, maxF
    LDR R0, value
    SWI 4
    ADR R0, is
    SWI 3
 while_cond
    CMP R0, #0
    BGT while_loop

_end    SWI 2

_error  ADR R0, errorM
    SWI 3
    B main

我一直在想办法,但是我有办法,但是我不确定该怎么做。我以为该程序希望用户输入该数字,然后对该数字进行计算,然后打印出当前寄存器中数字的行,然后返回到顶部,该寄存器将被覆盖下一个值,然后执行相同的操作,直到该寄存器的值等于用户指定的值(即停止时)为止。

1 个答案:

答案 0 :(得分:1)

现在,该代码无法正常工作,因为您永远不会更新r3r4(您之前的两个斐波那契数字)的值,并且您会覆盖r0(打算用作您的循环计数器)。可能还有其他问题。

目前还不清楚,您陷入困境的地方似乎是对汇编语言缺乏经验和对算法开发过程缺乏经验的结合。我的建议是将这两个过程分开。计算第一个n斐波纳契数的用C语言(或另一种语言,但是C语言是最接近汇编语言而不实际使用它的代码!)。一旦可行,就开始考虑如何用汇编语言实现相同的事情。