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