Code
assembly
; fact(n) -> n! rdi = n, result in rax
section .text
global fact
fact:
; prologue
push rbp
mov rbp, rsp
push rbx ; save callee-saved rbx (we use it for n)
mov rbx, rdi ; rbx = n
cmp rbx, 1
jle .base ; if n <= 1, return 1
; recursive case: n * fact(n-1)
lea rdi, [rbx - 1] ; arg = n-1
call fact ; rax = fact(n-1)
imul rax, rbx ; rax = n * fact(n-1)
jmp .epi
.base:
mov rax, 1
.epi:
pop rbx ; restore rbx
pop rbp ; restore rbp (epilogue)
ret
; Tail-recursive form compiled to a loop (no stack growth)
global fact_iter
fact_iter:
mov rax, 1 ; accumulator
.loop:
test rdi, rdi
jle .done
imul rax, rdi
dec rdi
jmp .loop
.done:
ret