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} 

내가 입력을 복용하고, 어떤 이유로 그 때까지 입력이 개 값을 계산하지 않습니다. 예를 들어 위치 1을 확인하려면 입력을 요청하고 값을 입력하고 입력을 두 번 올릴 때까지 실행되지 않습니다.

3 [Enter] 
3 [Enter] 

그리고 나에게 잘못된 대답을줍니다. 내가 뭘 잘못하고 있는지 알 수 없다.

+0

는 왜 어셈블리에이를 코딩? –

+0

나는 수업에서 의회를 배우고 있는데, 이것은 우리가해야만하는 연습 프로그램이다. – Absiel

+0

이것은 32 비트 모드에서 ARM이라고 가정하면 r7의 저장소 오프셋은 4의 배수가되어야하지만 코드는 1의 배수를 사용합니다. scanf의 경우 출력 문자열의 \ n에 두 개 입력해야하는지 궁금합니다 열쇠. 입력 문자열에 "% 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: