2017-03-24 3 views
0

J'essaie de stocker les 10 premiers nombres de la séquence de Fibonacci dans un tableau, puis de saisir l'entrée de l'utilisateur pour imprimer la valeur de la séquence dans l'index de l'entrée. Je ne suis pas sûr si ma boucle de Fibonacci est incorrecte, ou si je ne sais pas comment rechercher/imprimer l'index.Fibonacci Array

Mon code:

.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} 

Quand je prends l'entrée, pour une raison quelconque, il ne sera pas calculer jusqu'à ce que je saisis les deux valeurs. Par exemple, si je veux vérifier la position 1, elle demandera ma saisie, et elle ne s'exécutera que si je tape une valeur et que j'appuie deux fois sur Entrée.

3 [Enter] 
3 [Enter] 

et puis il me donne juste la mauvaise réponse. Je ne peux pas comprendre ce que je fais mal.

+0

Pourquoi vous coder cette compagnie? –

+0

J'apprends l'assemblage dans une classe, et c'est un programme d'entraînement que nous devons faire. – Absiel

+0

En supposant que ce soit ARM en mode 32 bits, les décalages de stockage de r7 doivent être des multiples de 4, mais le code utilise des multiples de 1. Pour le scanf, je me demande si le \ n dans la chaîne de sortie nécessite deux entrées clés. Vous pouvez utiliser "% d" pour la chaîne d'entrée. Le code doit spécifier l'adresse d'une variable pour stocker l'entrée de l'utilisateur dans et je ne vois pas cela. – rcgldr

Répondre

0

Un peu de code ajouté à votre code pour amorcer la pompe. Je préfère mettre mes appels scanf et printf dans des fonctions séparées. Suppose une séquence Fib de 13 éléments. Suppose les éléments de taille d'octet. Pour des valeurs Fib plus grandes, vous avez besoin d'éléments de taille de mot. Un débogueur pourrait également vous aider - à court et à long terme.

/* 
     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 

sortie:

[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: