%include "CONSTANTS.h" section .data outputFMT: db `Fib(%d) = %ld\n`,0 section .bss section .text global main main: mov r12, 0 .loopTop: cmp r12, 20 je .done mov rdi, r12 call FIB mov rdi, outputFMT mov rsi, r12 mov rdx, rax call CallPrintf inc r12 jmp .loopTop .done: jmp Exit ; rdi holds n ; assume n is a positive non-negative integer FIB: push rbp mov rbp, rsp cmp rdi, 0 je .base cmp rdi, 1 je .base sub rdi, 1 push rdi call FIB pop rdi sub rdi, 1 push rax call FIB pop r8 ; reload the old value of rax, or Fib(n-1) add rax, r8 jmp .done .base: mov rax, 1 .done: pop rbp ret