Answer:
.data
programmerName BYTE "PROGRAMMER NAME", 0
programTitle BYTE "PRINT FIBONACCI NUMBERS WITHIN RANGE", 0
prompt_1 BYTE "WHAT IS YOUR NAME? ", 0
prompt_2 BYTE "Enter the number of Fibonacci terms you want to display between [1 - 46]", 0
num_fibo DWORD ?
previous1 DWORD ?
previous2 DWORD ?
spaces BYTE " ",0
goodbye BYTE "Goodbye, ", 0
first2 BYTE "1 1 ", 0
first1 BYTE "1", 0
temp DWORD ?
moduloFive DWORD 5
UPPERLIMIT = 46
LOWERLIMIT = 1
;user's name
buffer BYTE 21 DUP(0)
byteCount DWORD ?
;greet the user
hi BYTE "Hi, ",0
;validate
highError BYTE "The number you entered is too high! Please enter number below 46", 0
lowError BYTE "The number you entered is too low! Please eneter number above 1", 0
;EC -> Setting Background Color and Text Color
val1 DWORD 11
val2 DWORD 16
.code
main PROC
; setting text color to teal
mov eax, val2
imul eax, 16
add eax, val1
call setTextColor
; introduction
mov edx, OFFSET programTitle
call WriteString
mov edx, OFFSET programmerName
call WriteString
call CrLf
; EC Prompt
mov edx, OFFSET ec_prompt
call WriteString
call CrLf
mov edx, OFFSET prompt_1
call WriteString
call CrLf
; get user's name
mov edx, OFFSET buffer ;point to the buffer
mov ecx, SIZEOF buffer ; specify max characters
call ReadString
mov byteCount, eax
; greet the user
mov edx, OFFSET hi
call WriteString
mov edx, OFFSET buffer
call WriteString
call CrLf
;userInstructions
topPrompt:
mov edx, OFFSET prompt_2
call WriteString
call CrLf
;getUserData
call ReadInt
mov num_fibo, eax
; Validate user data
cmp eax, UPPERLIMIT
jg TooHigh
cmp eax, LOWERLIMIT
jl TooLow
je JustOne
cmp eax, 2
je JustTwo
; displayFibs
mov ecx, num_fibo
sub ecx, 3 ; we start at iteration 3, the first two are taken care of by JustOne and JustTwo
mov eax, 1
call WriteDec
mov edx, OFFSET spaces
call WriteString
call WriteDec
mov edx, OFFSET spaces
call WriteString
mov previous2, eax
mov eax, 2
call WriteDec
mov edx, OFFSET spaces
call WriteString
mov previous1, eax
fib:
add eax, previous2
call WriteDec
mov edx, OFFSET spaces
call WriteString
mov temp, eax
mov eax, previous1
mov previous2, eax
mov eax, temp
mov previous1, eax
mov edx, ecx
cdq
div moduloFive
cmp edx, 0
jne skip
call CrLf
skip:
mov eax, temp
loop fib
jmp TheEnd
TooHigh:
mov edx, OFFSET highError
call WriteString
jmp TopPrompt
TooLow:
mov edx, OFFSET lowError
call WriteString
jmp TopPrompt
JustOne:
mov edx, OFFSET first1
call WriteString
jmp TheEnd
JustTwo:
mov edx, OFFSET first2
call WriteString
jmp TheEnd
;farewell
TheEnd:
call CrLf
mov edx, OFFSET goodbye
call WriteString
mov edx, OFFSET buffer
call WriteString
call CrLf
exit ; exit to operating system
main ENDP
END main