colorful rat Ratfactor.com > Dave's Repos

pftgu_nasm

NASM ports of exercises from "Programming from the Ground Up"
git clone http://ratfactor.com/repos/pftgu_nasm/pftgu_nasm.git

pftgu_nasm/ch04.2_factorial.asm

Download raw file: ch04.2_factorial.asm

1 ; Chapter 4 Factorial (recursive) 2 ; 3 ; Computes the factorial 4 ; Demonstrates recursive functions and the stack. 5 ; 6 ; $ ./go.sh ch04.2_factorial 7 ; Exited with code: 24 8 ; 9 section .data 10 11 section .text 12 13 ; Start - Call power twice, return result 14 ; --------------------------------------------------------- 15 global _start 16 _start: 17 push dword 4 ; push function arg on stack 18 19 call factorial ; call recursive function! 20 21 ; Move the stack pointer BACKWARD (by adding) to remove 22 ; the parameter that was pushed onto the stack. 23 add esp, 4 24 25 ; Move the answer in eax to ebx to use as exit code. 26 mov ebx, eax 27 mov eax, 1 ; syscall 'exit' 28 int 0x80 ; linux interrupt 29 30 ; factorial function 31 ; --------------------------------------------------------- 32 ; input: 33 ; arg1 -> eax is the base number 34 ; output: 35 ; answer in eax 36 ; 37 ; Note: This function calls itself recursively! 38 global factorial:function 39 factorial: 40 push ebp ; save base pointer 41 mov ebp, esp ; set it to stack pointer 42 43 ; Get first param into eax 44 ; ebp + 4 is the return address 45 ; ebp + 8 is the first param 46 mov eax, [ebp + 8] 47 48 ; If the param is 1, that's our base case, return it! 49 cmp eax, 1 50 je .end_factorial 51 52 ; Keep going: decrement the value and recurse! 53 dec eax 54 push eax ; push param 55 call factorial 56 57 ; Recursion done, stack is now full of values to be 58 ; multiplied. Register eax contains the previous result. 59 mov ebx, [ebp + 8] 60 imul eax, ebx 61 62 .end_factorial: 63 ; Restore stack stuff and return. Answer already in eax. 64 mov esp, ebp 65 pop ebp 66 ret