从此循环中获取一个奇怪的结果。它执行的次数比应该多。它应该继续显示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
编辑:在代码
多少次循环执行呢?第一次进入循环时'ecx'的价值是多少?你确定'WriteDec'和'CrLf'不会修改'ecx'吗? –
我不相信他们修改ecx(但可以肯定,我添加了count变量来存储和检索循环之前的计数)它在一次测试中执行35次,当它执行两次时 –
似乎始终执行35次输入号码为 –