add factorial assembler program
This commit is contained in:
BIN
gnu-asm/factorial1/factorial1
Executable file
BIN
gnu-asm/factorial1/factorial1
Executable file
Binary file not shown.
BIN
gnu-asm/factorial1/factorial1.o
Normal file
BIN
gnu-asm/factorial1/factorial1.o
Normal file
Binary file not shown.
85
gnu-asm/factorial1/factorial1.s
Normal file
85
gnu-asm/factorial1/factorial1.s
Normal file
@@ -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
|
||||
BIN
gnu-asm/factorial1/factorial1.stripped
Executable file
BIN
gnu-asm/factorial1/factorial1.stripped
Executable file
Binary file not shown.
7
gnu-asm/factorial1/run.sh
Executable file
7
gnu-asm/factorial1/run.sh
Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user