2017-03-24 1 views
0

フィボナッチシーケンスの最初の10個の数字を配列に格納しようとしていますが、入力のインデックスにあるシーケンスの値を出力するためにユーザー入力を受け取ります。私のフィボナッチループが間違っているかどうか、またはインデックスの検索/印刷方法がわからない場合は私はよく分かりません。フィボナッチアレイ

マイコード:

.data 
     .balign 4 
     output: .asciz "%d\n" 
     select: .asciz "Input an index to check:" 
     a:  .skip 40 
.text 
     .global main 
     .extern printf 
     .extern scanf 

main: 
     push {ip, lr} 

     ldr  r7, =a   @ Array a to r7 
     mov  r8, #3   @ count 
     mov  r9, #0   @ hard code first value 
     mov  r10,#1   @ hard code second value 

     str  r9, [r7, #1] @ store 0 in array 
     str  r10,[r7, #2] @ store 1 in array 

fib: 
     cmp  r8, #10   @ Is count equal to 10? 
     beq  end    @ if 10 elements exit writeloop 

     mov  r11, r10 
     add  r10, r9, r10 
     mov  r9, r11 

     str  r10, [r7, r8] 
     add  r8, r8, #1  @ increment count 

     b  writeloop  @ continue the loop 

end: 
     ldr  r0, =select  @ Ask for index to check 
     bl  printf   @ C printf 
     ldr  r0, =output 
     ldr  r1, =select 
     bl  scanf 
     ldr  r1, =select 
     ldr  r1, [r1] 
     ldr  r1, [r7, r1, lsl #2] 
     ldr  r0, =output 
     bl  printf 

     pop  {ip, pc} 

私はそれが私の入力2つの値まで計算しないであろういくつかの理由で、入力を取っています。たとえば、位置1を確認したい場合は、入力を要求し、値を入力してEnterキーを2回押すまで実行されません。

3 [Enter] 
3 [Enter] 

それから私に間違った答えが与えられます。私は何が間違っているのか分かりません。

+0

は、なぜあなたはアセンブリでこれをコーディングしていますか? –

+0

私はクラスで組立を学んでいます。これは私たちがしなければならない練習プログラムです。 – Absiel

+0

これは32ビットモードのARMだと仮定すると、r7からのストアオフセットは4の倍数でなければならないが、コードは1の倍数を使用している。scanfの場合、出力文字列の\ nに2つの入力が必要かキー。入力文字列に "%d"を使用することができます。コードでは、ユーザー入力を格納する変数のアドレスを指定する必要がありますが、私はそれを見ません。 – rcgldr

答えて

0

ポンプにプライミングを行うコードにコードが追加されました。 私はscanfとprintfの呼び出しを別々の関数に入れたいと思っています。 13要素のFibシーケンスを仮定します。 バイトサイズの要素を仮定します。 Fib値が大きい場合は、ワードサイズの要素が必要です。 デバッガは、近い将来および長期間にも役立ちます。

/* 
     David @InfinitelyManic & Absiel 
     http://stackoverflow.com/questions/42989732/fibonacci-array 
*/ 
.bss 
     array: .byte 13 
.data 
     fmt: .asciz "Input an index to check:\n" 
     fmt1: .asciz "The Fibonacci number at index %d is %d:\n" 
     _data: .string "%d" 
     .align 
.text 
     .global main 

main: 
     // generate Fibonacci array 
     ldr r7,=array   // pointer to array 

     mov r9, #0    // init first value 
     mov r10,#1    // init second value 
     strb r9, [r7, #0]  // store 0 in array 
     strb r10,[r7, #1]  // store 1 in array 

     mov r8, #2    // init counter at 3rd element position == 2 
fib: 
     mov r11, r10   // save 1 
     add r10, r9, r10  // 0 + 1... 
     mov r9, r11    // new 

     strb r10, [r7, r8]  // store in array 
     add r8, r8, #(1 * 1) // inc counter 
     cmp r8, #(13 * 1)  // max fib sequence count 
     ble fib 

_end: // end building array 


     bl _write    // ask question 
     bl _input    // get keyboard value 

     mov r1, r0    // save scanf input for printf 
     ldrb r2, [r7, r0]  // get val at index; save in r2 for printf 

     bl _write1    // output 

_exit: 
     mov r7, #1 
     svc 0 
_write: 
     push {lr} 
     ldr r0,=fmt 
     bl printf 
     pop {pc} 

_write1: 
     push {lr} 
     ldr r0,=fmt1 
     bl printf 
     pop {pc} 

_input: 
     push {lr} 
     sub sp, sp, #8 
     ldr r0,=_data 
     mov r1, sp 
     bl scanf 
     ldr r0, [sp] 
     add sp, sp, #8 
     pop {pc} 
.align 
.end 

出力:

[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
0 
The Fibonacci number at index 0 is 0: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
1 
The Fibonacci number at index 1 is 1: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
2 
The Fibonacci number at index 2 is 1: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
5 
The Fibonacci number at index 5 is 5: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
9 
The Fibonacci number at index 9 is 34: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
10 
The Fibonacci number at index 10 is 55: 
[email protected]:~/asm $ ./fibonacci 
Input an index to check: 
13 
The Fibonacci number at index 13 is 233: