从这个循环中获得一个奇怪的结果。它正在执行的次数超过应有的次数。它应该在重新计算时继续显示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 :(得分:2)
问题似乎是你在开始循环之前没有将count
的值放在ecx中。您对ReadString
的来电显然会将值存储在fibCount
中。您从中减去2并将其存储在count
中,但您永远不会更改ecx
。 ecx
中设置的唯一值是32
。
我想你会用以下方法解决你的问题:
call CrLf
mov ecx, count ; <== add this line
L1:
mov count, ecx