From 0785e7ccd0178c38f5320addaff9307937ec835d Mon Sep 17 00:00:00 2001 From: Lucia Ceionia Date: Mon, 18 Dec 2023 14:04:47 -0600 Subject: [PATCH] day 18 part 2 --- 18/Makefile | 5 +- 18/main.s | 172 +++++++++++++----------------------------------- 18/main_part1.s | 149 +++++++++++++++++++++++++++++++++++++++++ 18/utils64.s | 117 ++++++++++++++++++++++++++++++++ 4 files changed, 314 insertions(+), 129 deletions(-) create mode 100644 18/main_part1.s create mode 100644 18/utils64.s diff --git a/18/Makefile b/18/Makefile index 573eb71..ba9ca3c 100644 --- a/18/Makefile +++ b/18/Makefile @@ -1,3 +1,6 @@ all: - nasm -g -felf32 main.s && ld -melf_i386 -g main.o + nasm -g -felf64 main.s && ld -g main.o + +part_1: + nasm -g -felf32 main_part1.s && ld -melf_i386 -g main_part1.o diff --git a/18/main.s b/18/main.s index 1deb9f3..e36c415 100644 --- a/18/main.s +++ b/18/main.s @@ -1,149 +1,65 @@ -%include "utils.s" +%include "utils64.s" global _start -[bits 32] +[bits 64] [section .text] %define FILENAME "input" ;%define FILENAME "input_test" -;%define PRINT - _start: -mov esi, file -mov edi, array+1024*512+512 ; like, the middle idk -mov byte [edi], 1 ; filled! - +mov rsi, file +mov rbp, 11_000_000_000 ; vert +mov rdi, 1 ; area proc_line: -cmp esi, file.over +cmp rsi, file.over jae .done -lodsb ; RDLU -%ifdef PRINT -call print_char -call space -%endif -mov ebx, eax -inc esi ; space -call dec_parse ; count -%ifdef PRINT -call print_dec -call newline -%endif -; skip to next line -add esi, 10 -; put in array -cmp bl, 'R' -mov ecx, 1 -cmove edx, ecx -cmp bl, 'L' -mov ecx, -1 -cmove edx, ecx -cmp bl, 'D' -mov ecx, 1024 -cmove edx, ecx -cmp bl, 'U' -mov ecx, -1024 -cmove edx, ecx -mov ecx, eax -.draw: -add edi, edx -mov byte [edi], 1 -loop .draw +mov al, '#' +mov rcx, 32 +xchg rdi, rsi +repne scasb +xchg rdi, rsi +call hex_parse +mov rbx, rax +and bl, 3 +shr rax, 4 +inc rsi ; \n +; process shit +cmp bl, 0 +je .r +cmp bl, 1 +je .d +cmp bl, 2 +je .l +cmp bl, 3 +je .u +.r: +add rdi, rax +mul rbp +add rdi, rax +jmp proc_line +.l: +mul rbp +sub rdi, rax +jmp proc_line +.d: +add rdi, rax +sub rbp, rax +jmp proc_line +.u: +add rbp, rax jmp proc_line .done: -%ifdef PRINT -print_array: -call newline -mov esi, array -xor ecx, ecx -.inner: -mov bl, '.' -lodsb -test al, al -mov dl, '#' -cmovnz bx, dx -mov al, bl -call print_char -inc ecx -cmp ecx, 1024*1024 -jae .done -mov ebx, ecx -and ebx, 1023 -jnz .inner -call newline -jmp .inner -.done: -call newline -%endif - -xor ecx, ecx ; x = 0 -xor ebx, ebx ; y = 0 -mov ebp, 1024*1024 ; count -call flood_fill -jmp flood_done - -flood_fill: -mov eax, ebx -shl eax, 10 -cmp byte [array+eax+ecx], 0 -je .zero -ret -.zero: -dec ebp -mov byte [array+eax+ecx], 1 -sub esp, 8 -mov [esp+4], ecx -mov [esp+0], ebx -.t_right: -cmp ecx, 1023 -je .t_left -inc ecx -call flood_fill -mov ecx, [esp+4] -.t_left: -cmp ecx, 0 -je .t_down -dec ecx -call flood_fill -mov ecx, [esp+4] -.t_down: -cmp ebx, 1023 -je .t_up -inc ebx -call flood_fill -mov ebx, [esp+0] -.t_up: -cmp ebx, 0 -je .ret -dec ebx -call flood_fill -mov ebx, [esp+0] -.ret: -add esp, 8 -ret - -flood_done: -mov [final_value], ebp - -game_over: -mov eax, [final_value] -call print_dec -call newline -jmp exit - -PANIC: -p_string panic_str -jmp exit +hlt: +hlt ; go get a debugger, answer in rdi +jmp hlt [section .data] -final_value: dd 0 +final_value: dq 0 file: incbin FILENAME .over: [section .bss] -array: resb 1024*1024 [section .rodata] -panic_str: db 10, "AAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!11111111", 10 -.over: diff --git a/18/main_part1.s b/18/main_part1.s new file mode 100644 index 0000000..1deb9f3 --- /dev/null +++ b/18/main_part1.s @@ -0,0 +1,149 @@ +%include "utils.s" + +global _start +[bits 32] +[section .text] + +%define FILENAME "input" +;%define FILENAME "input_test" + +;%define PRINT + +_start: +mov esi, file +mov edi, array+1024*512+512 ; like, the middle idk +mov byte [edi], 1 ; filled! + +proc_line: +cmp esi, file.over +jae .done +lodsb ; RDLU +%ifdef PRINT +call print_char +call space +%endif +mov ebx, eax +inc esi ; space +call dec_parse ; count +%ifdef PRINT +call print_dec +call newline +%endif +; skip to next line +add esi, 10 +; put in array +cmp bl, 'R' +mov ecx, 1 +cmove edx, ecx +cmp bl, 'L' +mov ecx, -1 +cmove edx, ecx +cmp bl, 'D' +mov ecx, 1024 +cmove edx, ecx +cmp bl, 'U' +mov ecx, -1024 +cmove edx, ecx +mov ecx, eax +.draw: +add edi, edx +mov byte [edi], 1 +loop .draw +jmp proc_line +.done: + +%ifdef PRINT +print_array: +call newline +mov esi, array +xor ecx, ecx +.inner: +mov bl, '.' +lodsb +test al, al +mov dl, '#' +cmovnz bx, dx +mov al, bl +call print_char +inc ecx +cmp ecx, 1024*1024 +jae .done +mov ebx, ecx +and ebx, 1023 +jnz .inner +call newline +jmp .inner +.done: +call newline +%endif + +xor ecx, ecx ; x = 0 +xor ebx, ebx ; y = 0 +mov ebp, 1024*1024 ; count +call flood_fill +jmp flood_done + +flood_fill: +mov eax, ebx +shl eax, 10 +cmp byte [array+eax+ecx], 0 +je .zero +ret +.zero: +dec ebp +mov byte [array+eax+ecx], 1 +sub esp, 8 +mov [esp+4], ecx +mov [esp+0], ebx +.t_right: +cmp ecx, 1023 +je .t_left +inc ecx +call flood_fill +mov ecx, [esp+4] +.t_left: +cmp ecx, 0 +je .t_down +dec ecx +call flood_fill +mov ecx, [esp+4] +.t_down: +cmp ebx, 1023 +je .t_up +inc ebx +call flood_fill +mov ebx, [esp+0] +.t_up: +cmp ebx, 0 +je .ret +dec ebx +call flood_fill +mov ebx, [esp+0] +.ret: +add esp, 8 +ret + +flood_done: +mov [final_value], ebp + +game_over: +mov eax, [final_value] +call print_dec +call newline +jmp exit + +PANIC: +p_string panic_str +jmp exit + +[section .data] +final_value: dd 0 +file: incbin FILENAME +.over: + +[section .bss] +array: resb 1024*1024 + +[section .rodata] +panic_str: db 10, "AAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!11111111", 10 +.over: diff --git a/18/utils64.s b/18/utils64.s new file mode 100644 index 0000000..432cd7e --- /dev/null +++ b/18/utils64.s @@ -0,0 +1,117 @@ +[bits 64] +[section .text] +; string input in RSI +; value in RAX +; CF set if none, clear if some +; RSI set past checked area +dec_parse: +sub rsp, 24 +mov [rsp+16], rbx +mov [rsp+8], rdx +mov [rsp+0], rdi +xor rax, rax +xor rdi, rdi +mov rbx, 10 ; base +lodsb +sub al, '0' +js .no_input +cmp al, 9 +jle .got_char +.no_input: +stc ; set CF +jmp .done +.loop: +xor rax,rax +lodsb +sub al, '0' +js .dec_done +cmp al, 9 +jg .dec_done +.got_char: +xchg rdi,rax +mul rbx +add rdi,rax +jmp .loop +.dec_done: +clc ; clear CF +.done: +mov rax, rdi +mov rdi, [rsp+0] +mov rdx, [rsp+8] +mov rbx, [rsp+16] +add rsp, 24 +ret + +; string input in RSI +; value in RAX +; CF set if none, cear if some +; RSI set past checked area +hex_parse: +sub rsp, 24 +mov [rsp+16], rbx +mov [rsp+8], rdx +mov [rsp+0], rdi +xor rax, rax +xor rdi, rdi +lodsb +cmp al, '0' +jb .no_input +cmp al, '9' +jbe .got_dec_char +cmp al, 'A' +jb .no_input +cmp al, 'F' +jbe .got_ualpha_char +cmp al, 'a' +jb .no_input +cmp al, 'f' +jbe .got_ualpha_char +.no_input: +stc ; set CF +jmp .done +.loop: +xor rax,rax +lodsb +cmp al, '0' +jb .hex_done +cmp al, '9' +jbe .got_dec_char +cmp al, 'A' +jb .hex_done +cmp al, 'F' +jbe .got_ualpha_char +cmp al, 'a' +jb .hex_done +cmp al, 'f' +jbe .got_ualpha_char +jmp .hex_done +.got_dec_char: +sub al, '0' +xchg rdi,rax +shl rax, 4 +add rdi,rax +jmp .loop +.got_alpha_char: +sub al, 'A'-10 +xchg rdi,rax +shl rax, 4 +add rdi,rax +jmp .loop +.got_ualpha_char: +sub al, 'a'-10 +xchg rdi,rax +shl rax, 4 +add rdi,rax +jmp .loop +.hex_done: +clc ; clear CF +.done: +mov rax, rdi +mov rdi, [rsp+0] +mov rdx, [rsp+8] +mov rbx, [rsp+16] +add rsp, 24 +ret + +; --- MACROS --- +%define len(x) x %+ .over - x