【问题标题】:How would I approach making the Fibonacci Sequence in ARM?我将如何在 ARM 中制作斐波那契数列?
【发布时间】:2018-11-11 15:21:47
【问题描述】:

我需要制作一个 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

我一直在考虑解决这个问题的方法,我有一些东西,但我不确定如何去做。我在想该程序需要用户输入数字,然后它对该数字进行计算,然后打印出当前在寄存器中的数字行,分支回到寄存器被覆盖的顶部下一个值,然后做同样的事情,直到该寄存器的值等于用户指定的值,也就是它停止的时候。

【问题讨论】:

  • 您希望从何处加载到主指令的分支?请向我们展示您为这个问题编写代码的最佳尝试。这是一道标准的家庭作业题,所以我们希望看到你付出一些努力。
  • 如果您想删除您的问题,请将其删除。但是不要把它编辑成废话,把所有的代码都删掉。

标签: assembly arm fibonacci


【解决方案1】:

现在代码没有机会工作,因为您永远不会更新 r3r4(您之前的两个斐波那契数)的值,并且您覆盖了 r0(打算成为您的循环计数器) 在许多地方。可能还有其他问题。

目前还不是很清楚你在哪里卡住了——这似乎是对汇编语言缺乏经验和对算法开发过程缺乏经验的结合。我的建议是将这两个过程分开。用 C(或其他语言,但 C 是最接近汇编语言而不实际使用它的语言!)编写一些代码,计算第一个 n 斐波那契数。一旦成功,就开始考虑如何用汇编语言实现同样的东西。

【讨论】:

  • 抱歉,还是不够清楚。如果你有一个你理解的 C 算法,那么我在回答中提到的第一个错误没有理由:你没有更新 r3r4 所以你的代码不可能在逻辑上工作。这不是汇编语言问题,这是算法问题。
猜你喜欢
  • 2015-06-05
  • 2017-09-10
  • 1970-01-01
  • 2011-05-06
  • 2013-08-03
  • 2014-05-19
  • 2015-08-30
相关资源
最近更新 更多