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

編集:コードの残りの部分に追加

4

1 に答える 1