.data
        a : .long 6
        r : .long 0
        out : .string "result %d\n"
.text
.global main
fib:
        movl 4(%esp), %eax # get arg
        cmpl $1, %eax # if x<=1 fib(x)=x
        jbe endf
        pushl %ebx # save ebx
        decl %eax # eax=n-1
        pushl %eax # set arg
        call fib # res in eax
        mov %eax, %ebx # ebx=fib(n-1)
        decl (%esp) # arg -= 1
        call fib # res in eax
        addl $4, %esp # free arg
        addl %ebx, %eax #fib(n)=fib(n-1)+fib(n-2)
        popl %ebx # restore ebx
endf:
        ret

main:
        pushl a  #stack [a]
        call fib #result in %eax
        pushl %eax
        pushl $out
        call printf
        addl $12, %esp # free all arguments
        xor %eax, %eax # return value
        ret
