format ELF64 executable 3 include "lib/linux_syscall.inc" include "lib/itoa.inc" include "lib/print.inc" include "lib/file.inc" segment readable executable entry main main: mov rdi, input_filename call load_file call part_1 call part_2 call unload_file ;; Done! exit 0 part_1: ;; Setup the loop variables for counting ;; rbx starts at the first byte of input, and is incremented to read it all mov rbx, [input] ;; rcx tracks the current floor mov rcx, 0 ;; rdx counts down from the file's size to 0 mov rdx, [file_stat.st_size] .lp: ;; Is the current character the "go up" character? cmp byte [rbx], '(' ;; If so, jump to "up" je .up ;; Is the current character the "go down" character? cmp byte [rbx], ')' ;; If so, it's the "go down" character, so decrement the current floor je .down ;; Otherwise it's the EOF probably, skip it jmp .other .up: ;; We should "go up", so increment the current floor inc rcx jmp .other .down: ;; We should "go down", so decrement the current floor dec rcx .other: ;; Check the next character in the file inc rbx ;; Count down the file's length dec rdx ;; If we haven't reached the end of the file, loop jnz .lp ;; Put part 1's answer in rax mov rax, rcx ;; Convert rax to a c string in rbx mov rbx, part_1_answer call itoa ;; Print part 1's verbiage mov rdi, part_1_verbiage call print_c_string call print_newline ret part_2: ;; Setup the loop variables for counting ;; rbx starts at the first byte of input, and is incremented to read it all mov rbx, [input] ;; rcx tracks the current floor mov rcx, 0 ;; rdx tracks how many steps we've made so far mov rdx, 0 .lp: cmp byte [rbx], '(' je .up dec rcx jmp .moved .up: inc rcx .moved: inc rdx cmp rcx, 0 jl .done inc rbx jnz .lp .done: ;; Put part 2's answer in rax mov rax, rdx ;; Convert rax to a c string in rbx mov rbx, part_2_answer call itoa ;; Print part 2's verbiage mov rdi, part_2_verbiage call print_c_string call print_newline ret segment readable writable input_filename db '../data/2015/1/input.txt', 0 part_1_verbiage db 'Part 1: ' part_1_answer db ' ', 0 part_2_verbiage db 'Part 2: ' part_2_answer db ' ', 0