factorial
This commit is contained in:
8 files changed
+116
-23
No files matched your search
+72
@@ -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
|
||||
Reference in new issue
Block a user