factorial

This commit is contained in:
SowinskiBraeden committed 2025-11-14 13:45:43 -08:00
1 parent efeb3cf114
commit 3d82656426
8 files changed
+116 -23

No files matched your search

+1
View File
@@ -0,0 +1 @@
*.o
-11
View File
@@ -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"]
+21
View File
@@ -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)
-12
View File
@@ -1,15 +1,3 @@
# Assembly Project Demonstration - Factorial with Recursion # Assembly Project Demonstration - Factorial with Recursion
Demonstrate how functoin calls work in assembly by using Demonstrate how functoin calls work in assembly by using
a factorial recursion example. a factorial recursion example.
## Build
```bash
docker build -t asm .
```
## Run
```bash
docker run asm
```
Executable
BIN
View File
Binary file not shown.
+22
View File
@@ -0,0 +1,22 @@
#include <stdio.h>
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;
}
+72
View File
@@ -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
View File
Whitespace-only changes.