diff options
Diffstat (limited to '')
-rw-r--r-- | day01.asm | 111 |
1 files changed, 54 insertions, 57 deletions
diff --git a/day01.asm b/day01.asm index 725c9b2..8ad4c66 100644 --- a/day01.asm +++ b/day01.asm @@ -1,72 +1,69 @@ %include "sys.asm" -global _start - -section .bss -input: resb 1 -section .data -position: - .x: dd 0 - .y: dd 0 -direction: - .x: dd 0 - .y: dd -1 +%define rPosX r8 +%define rPosY r9 +%define rDirX r10 +%define rDirY r11 -section .text +global _start _start: - .loopTurn: - syscall SYS_READ, FD_STDIN, input, 1 - test rax, rax - jz .breakTurn + sub rsp, 4096 + syscall SYS_READ, FD_STDIN, rsp, 4096 + mov rdi, rax ;; Length. + xor rcx, rcx ;; Index. - cmp byte [input], 'R' - jne .elseLeft - .thenRight: - rol qword [direction], 32 - neg dword [direction.x] - jmp .endLeft - .elseLeft: - neg dword [direction.x] - rol qword [direction], 32 - .endLeft: + xor rPosX, rPosX + xor rPosY, rPosY + xor rDirX, rDirX + mov rDirY, -1 ;; North. - xor r12, r12 - .loopDigit: - syscall SYS_READ, FD_STDIN, input, 1 - test rax, rax - jz .breakDigit - movzx rax, byte [input] + .loopTurn: + cmp byte [rsp + rcx], 'L' + jne .right + .left: ;; L(dx, dy) = (dy, -dx) + neg rDirX + jmp .swap + .right: ;; R(dx, dy) = (-dy, dx) + neg rDirY + .swap: + xchg rDirX, rDirY - cmp al, ',' - je .breakDigit + xor rax, rax + .loopDigit: + inc rcx + movzx rdx, byte [rsp + rcx] + cmp dl, '0' + jb .breakDigit - shl r12, 1 - lea r12, [r12 + r12 * 4 - '0'] - add r12, rax + ;; rax = rax * 10 + rdx - '0' + shl rax, 1 + lea rax, [rax + rax * 4 - '0'] + add rax, rdx jmp .loopDigit .breakDigit: + add rcx, 2 ;; Discard comma and space. + + mov rdx, rax + imul rdx, rDirX + add rPosX, rdx - syscall SYS_READ, FD_STDIN, input, 1 + mov rdx, rax + imul rdx, rDirY + add rPosY, rdx - mov eax, r12d - imul eax, [direction.x] - add [position.x], eax - imul r12d, [direction.y] - add [position.y], r12d - jmp .loopTurn - .breakTurn: + cmp rcx, rdi + jb .loopTurn - mov eax, [position.x] - sar eax, 31 - mov ecx, eax - xor ecx, [position.x] - sub ecx, eax + ;; abs(x) = (x ^ (x >> 63)) - (x >> 63) + mov rax, rPosX + sar rax, 63 + xor rPosX, rax + sub rPosX, rax - mov eax, [position.y] - sar eax, 31 - mov edx, eax - xor edx, [position.y] - sub edx, eax + mov rax, rPosY + sar rax, 63 + xor rPosY, rax + sub rPosY, rax - add ecx, edx -syscall SYS_EXIT, rcx + lea rax, [rPosX + rPosY] +syscall SYS_EXIT, rax |