2013-07-14 13 views
0

이 루프에서 이상한 결과가 나오고 있습니다. 그것은 필요한 것보다 더 많은 시간을 실행하고 있습니다. 그것은 재 계산 된대로 그냥 fib_2 표시 계속합니다. 무슨 일 이니?루프를 여러 번 실행

INCLUDE Irvine32.inc 

UPPERBOUND = 47 
LOWERBOUND = 0 

.data 
userName  BYTE 33 DUP(0) ;string to be entered by user 
intro_1  BYTE "Fibonacci Numbers", 0 
intro_2  BYTE "Programmed by Marshall Todt", 0 
prompt_1  BYTE "What's your name? ", 0 
intro_3  BYTE "Hello, ", 0 
intro_4  BYTE "Enter the number of Fibonacci terms to be displayed", 0 
prompt_2  BYTE "How many Fibonacci terms do you want? ", 0 
intro_5  BYTE "Give the number as an integer in the range [1...46].", 0 
error_1  BYTE "Number of Fibonacci terms must be in the range [1-46].", 0 
fibCount  DWORD ? 
fib_1  DWORD 1 
fib_2  DWORD 1 
fib_3  DWORD ? 
goodBye_1  BYTE "Answers certified by Marshall Todt.", 0 
goodBye_2  BYTE "Good-bye, ", 0 
count  DWORD ? 

.code 
main PROC 

;Introduction 
mov  edx, OFFSET intro_1 
call WriteString 
call CrLf 
mov  edx, OFFSET intro_2 
call WriteString 
call CrLf 
call CrLf 

;getUserData 
mov  edx, OFFSET prompt_1 
call WriteString 
mov  edx, OFFSET userName 
mov  ecx, 32 
call ReadString 


;userInstructions 
mov  edx, OFFSET intro_3 
call WriteString 
mov  edx, OFFSET userName 
call WriteString 
call CrLf 
    mov  edx, OFFSET intro_4 
call WriteString 
call CrLf 
mov  edx, OFFSET intro_5 
call WriteString 
call CrLf 
reEnter: 
call CrLf 
mov  edx, OFFSET prompt_2 
call WriteString 
mov  edx, OFFSET fibCount 
mov  ecx, 32 
call ReadString 

;mov  eax, fibCount 
;cmp eax, LOWERBOUND 
;jg reEnter   ;jumps to reEnter if the number of fibonacci terms is not higher than the LOWERBOUND 
;mov  eax, fibCount 
;cmp eax, UPPERBOUND 
;jl reEnter   ;jumps to reEnter if the number of fibonacci terms is not lower than the UPPERBOUND 

mov eax, fibCount 
sub eax, 2 
mov count, eax 

;displayFibs 
mov eax, fib_1 
Call WriteDec 
Call CrLf 
L1: 
mov count, ecx 
mov eax, fib_2 
Call WriteDec 
Call CrLf 

;calculate Fibs 
mov eax, fib_1 
add eax, fib_2 
mov fib_3, eax 
mov eax, fib_2 
mov fib_1, eax 
mov eax, fib_3 
mov fib_2, eax 
mov ecx, count 
loop L1 

;farewell 
mov edx, OFFSET goodBye_1 
call WriteString 
call CrLf 
mov  edx, OFFSET goodBye_2 
call WriteString 
mov  edx, OFFSET userName 
call WriteString 
call CrLf 

exit ; exit to operating system 
main ENDP 

END main 

편집 : 코드

+0

루프가 몇 번 실행 않습니다

나는 당신이 당신의 문제를 해결할 것 같아요? 루프에 처음 들어가면'ecx'의 값은 무엇입니까? 'WriteDec'과'CrLf'가'ecx'를 수정하지 않았습니까? –

+0

나는 그들이 ECX을 수정할 생각하지 않는다 그것은이 두 번 –

+0

관계없이 항상 35 시간을 실행하는 것 같다 실행해야 하나 개의 테스트에서 35 번을 실행합니다 (그러나 확실하게, 내가 저장하고 루프 전에 카운트를 검색 할 수 카운트 변수를 추가) 입력 한 번호 –

답변

2

문제의 나머지 부분에 추가하면 루프를 시작하기 전에 ECX에 count의 가치를 두지 않는 것 같다. ReadString으로 전화하면 분명히 값이 fibCount에 저장됩니다. 당신은 그걸 2에서 빼고 count에 저장하지만 결코 변경하지 마십시오. ecx. ecx에 설정되는 유일한 값은 32입니다.

call CrLf 
    mov ecx, count ; <== add this line 
L1: 
    mov count, ecx 
+0

의 정수로 변환하는 방법을 확실하지가 있음을했고, 그것이 무한 루프 –

+0

당신은 정수로 사용하여 다음 문자열로'fibcount'을 작성 될 것 같습니다했다. Kip Irvine에'ReadInt'가 있습니까? –

+0

@MarshallTigerus : 명령을 추가하면 무한 루프가 발생하는 것은 거의 없습니다. 실행 중일 때 코드를 한 단계 씩 실행하는 데 사용할 수있는 디버거가 없습니까? –

관련 문제