문제

일부 숙제에서는 어셈블리에서 Fibonacci 시퀀스 프로그램을 만들어야합니다.이 코드를 만들었지 만 올바르게 작동하지 않는 것처럼 보이지 않으며 이유는 확실하지 않습니다.나는 이것을 올바르게하고 있다고 믿지만 EAX는 모든 루프 "2"로 남아 있습니다.

    INCLUDE Irvine32.inc
    .data
        prev DWORD ?
        next DWORD ?
        val DWORD ?
        count DWORD ?
        total DWORD ?

        myMsg BYTE "Fibonacci Sequence ",0dh,0ah,0

   .code
    main PROC
       mov ecx,15
       mov val,1
       mov prev,-1
       mov eax,1
       mov edx,OFFSET myMsg
       call WriteString

    L1:
       mov count,ecx
       mov ebx,val
       add ebx,prev
       mov total,ebx
       mov ebx,val
       mov prev,ebx
       mov eax,total
       mov val, ebx
       call WriteInt
       call Crlf
       loop L1

    exit
    main ENDP
    END main
.

도움이 되었습니까?

해결책

이 (테스트되지 않은)처럼 보일 수 있습니다 :

    mov  ecx, 15
    mov  eax, 0    ;a = 0
    mov  ebx, 1    ;b = 1
_fib:
    mov  edx, eax 
    add  edx, ebx  ;sum = a + b
    mov  eax, ebx  ;a = b
    mov  ebx, edx  ;b = sum
    loop _fib
.

다른 팁

루프가 이중화로이를 간소화합니다.

L1:
   count = ecx; // count === 15
   eax = total = val + prev; // prev = -1 => eax = 0. prev = 1 => eax = 2
   prev = val; // sets prev = 1, val doesn't change so prev = 1 after the first iteration
.

보시다시피 eax= val + prev는 1로 평가되면 1로 설정됩니다.

문제의 사양에 대해 자세히 설명해야합니다.얼마나 많은 정수를 인쇄하고 싶습니까?이게 count= 15가 무엇인지?이 경우 모든 반복으로 수를 줄이고 0이 아닌 것을 확인해야합니다.

Fibonacci 시퀀스는 루프에서 다음과 같이 작업해야합니다.

// lets say that eax is the current integer in the sequence and prev is the previous integer
// then the next integer = eax + prev
ebx = eax + prev
prev = eax
eax = ebx
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top