Loop executing multiple times

Tag: assembly , masm Author: bingjing011983 Date: 2013-06-28

Getting a weird result out of this loop. It is executing more times than it should be. It should just keep displaying fib_2 as it gets recalculated. What is going on?

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

EDIT: added in the rest of the code

Best Answer

The problem seems to be that you don't put the value of count in ecx before you start the loop. Your call to ReadString apparently stores the value in fibCount. You subtract 2 from that and store it in count, but you never change ecx. The only value that gets set in ecx is 32.

I think you'll solve your problem with:

    call CrLf
    mov ecx, count ; <== add this line
L1:
    mov count, ecx

comments:

did that, and it made it an infinite loop
You seem to be filling fibcount with a string, and then using it as an integer. Does Kip Irvine have a ReadInt or so?
@MarshallTigerus: It's unlikely that the addition of that instruction would create an infinite loop. Don't you have a debugger you can use to single-step through your code as it's executing?
figured it out. When I did the readint, I didn't assign it to fibCount. Fixed it.