
	format ELF executable
	entry start

	segment readable executable

start:
	mov eax, 4
	mov ebx, 1
	mov ecx, _msg
	mov edx, LEN_msg
	int 80h

	mov eax, 3
	mov ebx, 0
	mov ecx, _msg
	mov edx, LEN_msg
	int 80h

	mov eax, 0
	mov esi, ecx
.atoi:
	mov bl, [esi]
	cmp bl, '0'
	jb .atoi_done
	cmp bl, '9'
	ja .atoi_done
	sub bl, '0'
	imul eax, eax, 10
	add eax, ebx
	inc esi
	jmp .atoi
.atoi_done:
	mov [_nterms], eax
	cmp eax, 0
	jz .done
	mov eax, 4
	mov ebx, 1
	mov ecx, _one
	mov edx, 2
	int 80h
	dec [_nterms]
	jz .done
	mov eax, 4
	mov ecx, _one
	int 80h
	dec [_nterms]
	jz .done
	mov [_a], 1
	mov [_b], 1
.print_fibo:
	mov eax, [_a]
	mov ebx, [_b]
	mov [_a], ebx
	add [_b], eax
	jo .overflow
	mov eax, [_b]
	push 0
	mov ecx, 0
	mov ebx, 10
.pushing:
	mov edx, 0
	div ebx
	inc ecx
	or dl, '0'
	push edx
	cmp eax, 0
	jnz .pushing
	mov edi, _msg
.popping:
	pop eax
	stosb
	cmp eax, 0
	jnz .popping
	mov al, ' '
	stosb
	inc ecx
	inc ecx
	mov eax, 4
	mov ebx, 1
	mov edx, ecx
	mov ecx, _msg
	int 80h

	dec [_nterms]
	jnz .print_fibo

.done:
	mov eax, 4
	mov ebx, 1
	mov ecx, _endl
	mov edx, 1
	int 80h

	mov eax, 1
	mov ebx, 0
	int 80h

.overflow:
	mov eax, 4
	mov ebx, 1
	mov ecx, _overflow_msg
	mov edx, LEN_overflow_msg
	int 80h

	mov eax, 1
	mov ebx, 1
	int 80h

	segment readable writable
_nterms dd 0
_a dd 0
_b dd 0
_msg db 'How many terms of Fibonacci sequence to print: '
LEN_msg = $-_msg
_overflow_msg db 10,10,9,'*** Series overflown.',10,10
LEN_overflow_msg = $-_overflow_msg
_one db '1 '
_endl db 10


