このループから奇妙な結果が得られます。本来よりも多くの回数を実行しています。再計算されると、 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
編集:コードの残りの部分に追加