【问题标题】:How do I print all even Fibonacci numbers in ARM assembly?如何在 ARM 汇编中打印所有偶数斐波那契数?
【发布时间】:2014-04-13 21:47:20
【问题描述】:

在 ARM 汇编中,我部分能够让以下代码工作。

它应该打印出从 1 到 10,946 的所有偶数斐波那契数。我能够打印出所有这些偶数的总和。但是,我无法让它打印出“2”作为斐波那契数之一——它从“8”开始。我试过改变周围的东西,但它只是把它搞砸了。

这是我的代码:

.equ SWI_PrStr, 0x69 
.equ SWI_PrInt,0x6b 
.equ Stdout, 1 
.equ SWI_Exit, 0x11 
.global _start
.text
_start:

MOV R2,#0 @Starting value of 0 to register 1
MOV R3,#1 @starting val of 1 to register 2
LDR R4,=10946 @register gets this value

LOOP: 

CMP R5,R4
BGE After
ADD R5,R3,R2 @adding to check if its odd
MOV R2,R3   @ answer is 0
MOV R3,R5   @result is in R5 adds to R2 is 0=1
MOV R7, R5
AND R8, R7, #1
CMP R8, #1
BGE LOOP
MOV R1, R5
SWI SWI_PrInt
LDR R1, =NL 
SWI SWI_PrStr 
ADD R6,R6,R5 @sum of the even numbers
MOV R0,#Stdout
LDR R1, =NL 
SWI SWI_PrStr

B LOOP

    After:
    MOV R1,R6
  SWI SWI_PrInt
    SWI SWI_Exit
.data
NL: .asciz"\n"

如何重写代码以便打印出“2”以及所有其他数字?

【问题讨论】:

  • 尝试将MOV R0,#Stdout 移至顶部?您在之前的打印中不会这样做,但可能会在第一次循环后工作。

标签: assembly arm fibonacci


【解决方案1】:

我怀疑这是麻烦的线:

MOV R0,#Stdout

因为它在哪里,它只会在打印偶数之后执行 - 如果R0 最初包含错误的值,则“2”可能被打印到错误的位置。当您到达下一个值(“8”)时,R0 已被设置(并且可能没有其他任何东西触及它,所以它保持这种状态)所以稍后的输出会正确地转到 Stdout

将此行移至LOOP: 上方的“设置”代码应该可以修复它。


当我这样做时,您可以通过使用 test 而不是 compare 来进行优化 - 而不是这个:

MOV R7, R5
AND R8, R7, #1
CMP R8, #1
BGE LOOP

你可以简单地拥有这个:

TST R5, #1      @ TST is a bitwise AND
BNE LOOP        @ Not equal? What?

这个明显误导的条件是因为我们正在测试结果是 1 还是 0 - 因为与 CMP 的整数比较是作为减法完成的,“等于”是“零结果”的同义词,“不等于”是“非零结果”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多