2013-07-14 104 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(但可以肯定,我添加了count变量来存储和检索循环之前的计数)它在一次测试中执行35次,当它执行两次时 –

+0

似乎始终执行35次输入号码为 –

回答

2

问题的其余部分加入似乎是你不把的count值在ECX启动循环之前。您拨打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:添加该指令不太可能会造成无限循环。你有没有一个调试器可以用来单步执行你的代码? –