diff --git a/gnu-asm/factorial1/factorial1 b/gnu-asm/factorial1/factorial1 new file mode 100755 index 0000000..5d1bdfa Binary files /dev/null and b/gnu-asm/factorial1/factorial1 differ diff --git a/gnu-asm/factorial1/factorial1.o b/gnu-asm/factorial1/factorial1.o new file mode 100644 index 0000000..1114fe5 Binary files /dev/null and b/gnu-asm/factorial1/factorial1.o differ diff --git a/gnu-asm/factorial1/factorial1.s b/gnu-asm/factorial1/factorial1.s new file mode 100644 index 0000000..9d6be99 --- /dev/null +++ b/gnu-asm/factorial1/factorial1.s @@ -0,0 +1,85 @@ +.intel_syntax noprefix + +.section .data +INum: .quad 12 +DNum: .quad 0 +DBy: .quad 1 +Erg: .quad 0 +One: .quad 1 +Zero: .quad 0 + +.section .bss +.lcomm output_buffer, 32 + +.section .text +.global _start + +_start: + mov rax, [rip + One] # LDA One + call print_number # OUT + +NEX: + mov rax, [rip + INum] # LDA INum + mov [rip + DNum], rax # STA DNum + + mov rax, [rip + DBy] # LDA DBy + add rax, [rip + One] # ADD One + mov [rip + DBy], rax # STA DBy + + mov rax, [rip + INum] # LDA INum + sub rax, [rip + DBy] # SUB DBy + + jns mod_loop # BRP mod_loop + jmp halt # HLT + +mod_loop: + mov rax, [rip + DNum] # LDA DNum + sub rax, [rip + DBy] # SUB DBy + mov [rip + DNum], rax # STA DNum + + jz PRT # BRZ PRT + jns mod_loop # BRP mod_loop + jmp NEX # BRA NEX + +PRT: + mov rax, [rip + DBy] # LDA DBy + call print_number # OUT + jmp NEX # BRA NEX + +halt: + mov rax, 60 # Linux exit syscall + xor rdi, rdi # Exit status 0 + syscall + + +# ------------------------------------------------------------ +# print_number +# +# Input: +# RAX = unsigned integer to print +# +# Output: +# Number followed by a newline +# ------------------------------------------------------------ +print_number: + lea rsi, [rip + output_buffer + 31] + mov byte ptr [rsi], 10 # Newline + mov rcx, 1 # Output length + mov rbx, 10 + +.convert: + xor rdx, rdx + div rbx # RAX / 10; remainder in RDX + add dl, '0' + dec rsi + mov [rsi], dl + inc rcx + + test rax, rax + jne .convert + + mov rax, 1 # Linux write syscall + mov rdi, 1 # stdout + mov rdx, rcx # Number of bytes + syscall + ret diff --git a/gnu-asm/factorial1/factorial1.stripped b/gnu-asm/factorial1/factorial1.stripped new file mode 100755 index 0000000..66db5a5 Binary files /dev/null and b/gnu-asm/factorial1/factorial1.stripped differ diff --git a/gnu-asm/factorial1/run.sh b/gnu-asm/factorial1/run.sh new file mode 100755 index 0000000..6837d8c --- /dev/null +++ b/gnu-asm/factorial1/run.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +as --64 -o factorial1.o factorial1.s +ld -o factorial1 factorial1.o +cp factorial1 factorial1.stripped +strip --strip-all factorial1.stripped +./factorial1.stripped +