如何在ARM组件中打印所有均匀的Fibonacci数字?

时间:2014-03-10 16:42:19

标签: assembly arm fibonacci

在ARM程序集中,我部分能够使以下代码正常工作。

应该打印出从1到10,946(包括1和10,946)的所有偶数Fibonacci数。我能够打印出所有偶数的总和。但是,我遇到一个问题就是将它打印出'2'作为Fibonacci数字之一 - 它从'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'以及所有其他数字?

1 个答案:

答案 0 :(得分:2)

我怀疑这是一个麻烦的界限:

MOV R0,#Stdout

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

将此行移至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的整数比较是作为减法进行的,“等于”与“零结果”同义,并且“不等于“有”非零结果“。