summaryrefslogtreecommitdiff
path: root/2021/asm/day01.asm
diff options
context:
space:
mode:
authorBond_009 <bond.009@outlook.com>2022-12-01 22:30:22 +0100
committerBond_009 <bond.009@outlook.com>2022-12-01 22:30:22 +0100
commitbaf4910870a6e8999802b9a4a22eabd4142a34e3 (patch)
tree2d11443dc21e53bd0d99d015cf789937d6d95862 /2021/asm/day01.asm
parent49d0c908f24b2c193c9deed1716fe36061ba26a1 (diff)
Move all Advent of Codes into one repo
Diffstat (limited to '2021/asm/day01.asm')
-rw-r--r--2021/asm/day01.asm65
1 files changed, 65 insertions, 0 deletions
diff --git a/2021/asm/day01.asm b/2021/asm/day01.asm
new file mode 100644
index 0000000..b4f73e7
--- /dev/null
+++ b/2021/asm/day01.asm
@@ -0,0 +1,65 @@
+%include "unistd.asm"
+%include "utils.asm"
+
+stdout equ 1
+
+global _start
+
+section .text
+_start:
+ mov rcx, [rsp] ; Get number of arguments
+ mov rdi, [rsp + rcx * 8] ; Get last argument
+
+ mov rax, SYS_access ; Check if file exists and is readable
+ mov esi, R_OK
+ syscall
+ test rax, rax
+ jnz .exit_err
+
+ mov rax, SYS_open
+ xor esi, esi
+ xor edx, edx
+ syscall
+
+ mov r8d, eax ; Move fd into r8
+ mov rax, SYS_mmap
+ xor edi, edi ; Let the kernel choose the address
+ mov rsi, 12288
+ mov rdx, PROT_READ
+ mov r10d, MAP_PRIVATE
+ xor r9d, r9d
+ syscall
+
+ cmp rax, -1 ; Exit on error
+ je .exit_err
+
+ xor r13d, r13d
+ mov r12d, ~0
+ mov rdi, rax
+.loop:
+ call atoi
+ cmp eax, r12d
+ jna .na
+ inc r13d
+.na:
+ mov r12d, eax
+
+ cmp byte [rdi], 0
+ je .exit
+ inc rdi
+ cmp byte [rdi], 0
+ jne .loop
+
+.exit:
+ mov edi, stdout
+ mov esi, r13d
+ call write_ulong
+
+ mov rax, SYS_exit
+ xor edi, edi
+ syscall
+
+.exit_err:
+ mov rax, SYS_exit
+ mov edi, 1
+ syscall