From 3d82656426a57e002905042ebbe94126a78ccfc8 Mon Sep 17 00:00:00 2001 From: SowinskiBraeden Date: Fri, 14 Nov 2025 13:45:43 -0800 Subject: [PATCH] factorial --- .gitignore | 1 + Dockerfile | 11 -------- Makefile | 21 +++++++++++++++ README.md | 12 --------- factorial | Bin 0 -> 13536 bytes factorial.c | 22 ++++++++++++++++ factorial.s | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.asm | 0 8 files changed, 116 insertions(+), 23 deletions(-) create mode 100644 .gitignore delete mode 100644 Dockerfile create mode 100644 Makefile create mode 100755 factorial create mode 100644 factorial.c create mode 100644 factorial.s delete mode 100644 main.asm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5761abc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index bb720ef..0000000 --- a/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM ubuntu:latest - -RUN apt-get update && apt-get install -y nasm gcc gdb vim - -COPY main.asm /app/main.asm - -WORKDIR /app -RUN nasm -f elf64 main.asm -o main.o -RUN ld main.o -o main - -CMD ["./main"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f6cffca --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +ASM = as # GNU Assembler +LD = gcc # GCC Linker +LD_FLAGS = -nostartfiles + +SRC = factorial.s +OBJ = factorial.o +OUT = factorial + +all: $(OUT) + +$(OBJ): $(SRC) + $(ASM) $(SRC) -o $(OBJ) + +$(OUT): $(OBJ) + $(LD) $(LD_FLAGS) $(OBJ) -o $(OUT) + +run: all + ./$(OUT) + +clean: + rm -f $(OBJ) $(OUT) diff --git a/README.md b/README.md index db018aa..756cee7 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,3 @@ # Assembly Project Demonstration - Factorial with Recursion Demonstrate how functoin calls work in assembly by using a factorial recursion example. - -## Build - -```bash -docker build -t asm . -``` - -## Run - -```bash -docker run asm -``` diff --git a/factorial b/factorial new file mode 100755 index 0000000000000000000000000000000000000000..384a46d31fd1f917bf071b7156894ebda93519ba GIT binary patch literal 13536 zcmeHOQA-q26uzr#W)^Kw6cw?O_~xh~iw{y;X-!lTqDetav(D%ath+KhOKT4m_@e)y zqW(ZH)juc|_8})vlbAN%eN+tj?U1 zFO@sXeW}h=uU0H*$AWq6g&6#e&kl{M{+sKWm-pMI-!3n`Sbgy5{i)KMLDZEmsEUaK zqJStM3Wx%tfG8jehytR3C?E>_V+BU_`DK09kKIa)>He#g55DhT)ptK$SZ&rT&+r9J zpI^JSsL!q?^vdE6^m|_G^Uw7!pYAMl&yBPHy(BLWUz$;eFiS{BS(TXNp7rE8_g)>Z2bWbXP#YUGqMA3fNEl!3f_*d|QO? zAig8QBfZtQDd1xu3GYh}(xDiDD*-#^`Md)2CjuTM>}Dp!^L6;)I=q@N$Gw8dZr7cZJC}4khhf5 ziZfH5nE~|N5VKr^u55Q&Y59U@Ym@nsmMJ-~&)%_A;APEXR%zBu9(oATbCu@VWlw2# z)|hb3DLdfJDQEoGoBspv5ai&qK#%vP^BR0UgS*Dqjdm2AX1F-N-nj(M;d2S>utFe2awpIQO%6Dp!VI`XX16UH#5C8xG literal 0 HcmV?d00001 diff --git a/factorial.c b/factorial.c new file mode 100644 index 0000000..013b30d --- /dev/null +++ b/factorial.c @@ -0,0 +1,22 @@ +#include + +int factorial(int n) +{ + if (n <= 1) + { + return n; + } + + return n * factorial(n - 1); +} + +int main(void) +{ + int f; + + f = factorial(5); + + printf("%d\n", f); + + return 0; +} diff --git a/factorial.s b/factorial.s new file mode 100644 index 0000000..0979c06 --- /dev/null +++ b/factorial.s @@ -0,0 +1,72 @@ +.intel_syntax noprefix # allow mov rax, 1 syntax in GAS (GNU Assembly) +.global _start + +# factorial +# - rdi as input number +# - rax as result +factorial: + push rbp + mov rbp, rsp + + cmp rdi, 1 + jle base_case # if n <= 1 return 1 + + push rdi # save n + dec rdi # rdi = n-1 + call factorial # rax = factorial(n-1) + + pop rdx # rdx = original n + imul rax, rdx # rax = factorial(n-1) * n + jmp done + +base_case: + mov rax, 1 + +done: + mov rsp, rbp + pop rbp + ret + +print_rax_digit: + sub rsp, 16 + + mov rbx, 10 + + # ones digit + xor rdx, rdx + mov rcx, rax + div rbx + add dl, '0' + mov [rsp+2], dl + + # tens digit + xor rdx, rdx + mov rcx, rax + div rbx + add dl, '0' + mov [rsp+1], dl + + # hundreds digit + add al, '0' + mov [rsp], al + + mov rax, 1 + mov rdi, 1 + mov rsi, rsp + mov rdx, 3 + syscall + + add rsp, 16 + ret + +_start: + mov rdi, 5 # Use 5 for our example input + mov rax, 1 # Set starting result to 1 + + call factorial + + call print_rax_digit + + mov rax, 60 # syscall exit - 64 bit + mov rdi, 0 # exit code + syscall diff --git a/main.asm b/main.asm deleted file mode 100644 index e69de29..0000000