summaryrefslogtreecommitdiff
path: root/2022/01
diff options
context:
space:
mode:
authorBond_009 <bond.009@outlook.com>2022-12-01 23:34:48 +0100
committerBond_009 <bond.009@outlook.com>2022-12-01 23:34:48 +0100
commitd499fb9e569e4eb1c7bafeba46e6d1e5dd33398f (patch)
treebb20d614048a0944542c29a9f3d6f33ec71f1d8a /2022/01
parentbaf4910870a6e8999802b9a4a22eabd4142a34e3 (diff)
Add 2022 day 1 part 1
Diffstat (limited to '2022/01')
-rw-r--r--2022/01/part1.asm70
1 files changed, 70 insertions, 0 deletions
diff --git a/2022/01/part1.asm b/2022/01/part1.asm
new file mode 100644
index 0000000..946a765
--- /dev/null
+++ b/2022/01/part1.asm
@@ -0,0 +1,70 @@
+%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 r12d, r12d ; current count for elf
+ xor r13d, r13d ; Max # cal for one elf
+ mov rdi, rax
+.loop:
+ cmp byte [rdi], 0
+ je .exit
+ call atoi
+ add r12d, eax
+ cmp byte [rdi], 0
+ inc rdi
+ je .exit
+ cmp byte [rdi], `\n`
+ je .next_elf
+ jmp .loop
+
+.next_elf:
+ cmp r13d, r12d
+ cmovl r13d, r12d
+ xor r12d, r12d
+ add rdi, 1
+ jmp .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