조립의 비 재귀 적 피보나치 서열
-
09-12-2019 - |
문제
일부 숙제에서는 어셈블리에서 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
. 제휴하지 않습니다 StackOverflow