global _start
section .data
outbuffer db '0000000000', 10,10
section .text
_start:
push 13 ; PUSH WANTED FIBBONACCI MEMBER INDEX HERE
; REMEMBER, IT MUST BE (N - 1)
; SO IF YOU WANT 14th MEMBER (LIKE HERE), YOU PUSH 13
call fibo
call printint
jmp exit
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fibo:
push ebp ; Retrieve parameter and put it
push ebx ; Save previous parameter
mov ebp,esp ; into EBX register
add ebp,12 ;
mov ebx,[ebp] ; EBX = Param
cmp ebx,1 ; Check for base case
jle base ; It is base if (n <= 1)
lea ecx,[ebx-1]
push ecx ; push N-1
call fibo ; Calculate fibo for (EBX - 1)
pop ecx ; remove N-1 off the stack
push eax ; save the result of fibo(N-1)
lea ecx,[ebx-2]
push ecx ; push N-2
call fibo ; Calculate fibo for (EBX - 2)
pop ecx ; remove N-2 off the stack
pop ecx ; ecx = fibo(N-1)
add eax,ecx ; eax = fibo(N-2) + fibo(N-1)
jmp end
base: ; Base case
mov eax,1 ; The result would be 1
end:
pop ebx ; Restore previous parameter
pop ebp ; Release EBP
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
printint:
pushad
mov ecx, 10d
mov edi, 10d
mov ebx, outbuffer+9
innerprintloop:
mov edx, 0h
div edi
add edx, '0' ; '0' - 0x48h
mov [ebx], dl
dec ebx
loop innerprintloop
mov ecx, outbuffer
mov edx, 11
call write
popad
ret
read:
;move where to read to ecx
;move length to edx
mov eax, 03h ; 3 is recognized by the system as meaning "read"
mov ebx, 00h ; read from standard input
int 80h ; call the kernel
ret
write:
;move what to write to ecx
;move length to edx
mov eax, 04h ; the system interprets 4 as "write"
mov ebx, 01h ; standard output (print to terminal)
int 80h ; call the kernel
ret
Z2xvYmFsIF9zdGFydAoKc2VjdGlvbiAuZGF0YQoJb3V0YnVmZmVyCWRiCScwMDAwMDAwMDAwJywgMTAsMTAKCnNlY3Rpb24gLnRleHQKCl9zdGFydDoKCglwdXNoIDEzCQkJCTsgUFVTSCBXQU5URUQgRklCQk9OQUNDSSBNRU1CRVIgSU5ERVggSEVSRQoJCQkJCQk7IFJFTUVNQkVSLCBJVCBNVVNUIEJFIChOIC0gMSkKCQkJCQkJOyBTTyBJRiBZT1UgV0FOVCAxNHRoIE1FTUJFUiAoTElLRSBIRVJFKSwgWU9VIFBVU0ggMTMKCWNhbGwgZmlibwoJY2FsbCBwcmludGludAoKCWptcCBleGl0CgpleGl0OgoJbW92CQllYXgsIDAxaAkJOyBleGl0KCkKCXhvcgkJZWJ4LCBlYngJCTsgZXJybm8KCWludAkJODBoCgo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwoJCmZpYm86CglwdXNoICAgIGVicCAgICAgICAgIDsgUmV0cmlldmUgcGFyYW1ldGVyIGFuZCBwdXQgaXQKCXB1c2ggICAgZWJ4ICAgICAgICAgOyBTYXZlIHByZXZpb3VzIHBhcmFtZXRlcgoJbW92ICAgICBlYnAsZXNwICAgICA7IGludG8gRUJYIHJlZ2lzdGVyCglhZGQgICAgIGVicCwxMiAgICAgIDsKCW1vdiAgICAgZWJ4LFtlYnBdICAgOyBFQlggPSBQYXJhbQoJCgljbXAgICAgIGVieCwxICAgICAgIDsgQ2hlY2sgZm9yIGJhc2UgY2FzZQoJamxlICAgICBiYXNlICAgICAgICA7IEl0IGlzIGJhc2UgaWYgKG4gPD0gMSkKCQoJbGVhICBlY3gsW2VieC0xXQoJcHVzaCBlY3ggICAgICAgICAgICA7IHB1c2ggTi0xCgljYWxsIGZpYm8gICAJCTsgQ2FsY3VsYXRlIGZpYm8gZm9yIChFQlggLSAxKQoJcG9wICBlY3ggICAgICAgICAgICA7IHJlbW92ZSBOLTEgb2ZmIHRoZSBzdGFjawoJCglwdXNoIGVheCAgICAgICAgICAgIDsgc2F2ZSB0aGUgcmVzdWx0IG9mIGZpYm8oTi0xKQoJbGVhIGVjeCxbZWJ4LTJdCglwdXNoIGVjeCAgICAgICAgICAgIDsgcHVzaCBOLTIKCWNhbGwgZmlibyAgIAkJOyBDYWxjdWxhdGUgZmlibyBmb3IgKEVCWCAtIDIpCglwb3AgZWN4ICAgICAgICAgICAgIDsgcmVtb3ZlIE4tMiBvZmYgdGhlIHN0YWNrCglwb3AgZWN4ICAgICAgICAgICAgIDsgZWN4ID0gZmlibyhOLTEpCglhZGQgZWF4LGVjeCAgICAgICAgIDsgZWF4ID0gZmlibyhOLTIpICsgZmlibyhOLTEpCgkKCWptcCBlbmQKCQoJYmFzZTogICAgICAgICAgICAgICA7IEJhc2UgY2FzZQoJCW1vdiBlYXgsMSAgICAgICAgICAgOyBUaGUgcmVzdWx0IHdvdWxkIGJlIDEKCQoJZW5kOgoJCXBvcCAgICAgZWJ4ICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHBhcmFtZXRlcgoJCXBvcCAgICAgZWJwICAgICAgICAgOyBSZWxlYXNlIEVCUAoJCXJldAoKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CgpwcmludGludDoKCXB1c2hhZAoJbW92IGVjeCwgMTBkCgltb3YJZWRpLCAxMGQKCW1vdiBlYngsIG91dGJ1ZmZlcis5Cglpbm5lcnByaW50bG9vcDoKCQltb3YgZWR4LCAwaAoJCWRpdiBlZGkKCQlhZGQgZWR4LCAnMCcgOyAnMCcgLSAweDQ4aAoJCW1vdiBbZWJ4XSwgZGwKCQlkZWMgZWJ4CgkJbG9vcCBpbm5lcnByaW50bG9vcAoJbW92IGVjeCwgb3V0YnVmZmVyCgltb3YgZWR4LCAxMQoJY2FsbCB3cml0ZQoJcG9wYWQKCXJldAoKcmVhZDoKCTttb3ZlIHdoZXJlIHRvIHJlYWQgdG8gZWN4Cgk7bW92ZSBsZW5ndGggdG8gZWR4IAoJbW92CQllYXgsIDAzaAkJOyAzIGlzIHJlY29nbml6ZWQgYnkgdGhlIHN5c3RlbSBhcyBtZWFuaW5nICJyZWFkIgoJbW92CQllYngsIDAwaAkJOyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQKCWludAkJODBoCQkJCTsgY2FsbCB0aGUga2VybmVsCglyZXQKCQp3cml0ZToKCTttb3ZlIHdoYXQgdG8gd3JpdGUgdG8gZWN4Cgk7bW92ZSBsZW5ndGggdG8gZWR4Cgltb3YJCWVheCwgMDRoCQk7IHRoZSBzeXN0ZW0gaW50ZXJwcmV0cyA0IGFzICJ3cml0ZSIKCW1vdgkJZWJ4LCAwMWgJCTsgc3RhbmRhcmQgb3V0cHV0IChwcmludCB0byB0ZXJtaW5hbCkKCWludAkJODBoCQkJCTsgY2FsbCB0aGUga2VybmVsCglyZXQ=