Created
February 9, 2025 02:00
-
-
Save roxwize/ad7bd6b3d3e0ae569baeeb1b812bd7f0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| format ELF64 executable 3 | |
| segment readable executable | |
| entry $ | |
| ; print instructions | |
| mov rsi, s_guide | |
| mov rdx, s_guide.len | |
| call .print | |
| ; set prng state to system time | |
| mov rax, 201 | |
| mov rdi, 0 | |
| syscall | |
| mov [rand_state], rax | |
| .main: | |
| ; print turn | |
| mov rsi, s_turn | |
| mov rdx, s_turn.len | |
| call .print | |
| mov al, [turn] | |
| add al, 0x31 | |
| movzx rax, al | |
| push rax | |
| lea rsi, [rsp] | |
| mov rdx, 1 | |
| call .print | |
| push 0xA | |
| lea rsi, [rsp] | |
| mov rdx, 1 | |
| call .print | |
| ; field print loop | |
| mov rbx, 9 | |
| mov rcx, 0 | |
| mov r9, 0 | |
| .field_loop: | |
| ; randomly place symbol | |
| movzx rax, [field + rcx] | |
| cmp [turn], 0 | |
| je .inc_branch_end | |
| cmp rax, 0 | |
| jne .inc_branch_end | |
| push rax | |
| ; get random move | |
| mov rax, [rand_state] | |
| mov rdi, rax | |
| shl rdi, 13 | |
| xor rax, rdi | |
| mov rdi, rax | |
| shr rdi, 7 | |
| xor rax, rdi | |
| mov rdi, rax | |
| shl rdi, 17 | |
| xor rax, rdi | |
| mov [rand_state], rax | |
| and rax, 0xF | |
| cmp rax, 7 | |
| jge .make_move_branch | |
| jmp .make_move_branch_end | |
| .make_move_branch: | |
| mov r9, rcx | |
| .make_move_branch_end: | |
| pop rax | |
| .inc_branch_end: | |
| ; print symbol | |
| movzx rdx, [symbols + rax] | |
| push rdx | |
| lea rsi, [rsp] | |
| mov rdx, 1 | |
| call .print | |
| ; print newline if rcx % 3 == 0 | |
| push rdx | |
| mov rax, rcx | |
| mov r8, 3 | |
| div r8 | |
| cmp rdx, 0 | |
| jne .nl_exit | |
| push 0xA | |
| lea rsi, [rsp] | |
| mov rdx, 1 | |
| call .print | |
| .nl_exit: | |
| pop rdx | |
| ; loop | |
| inc rcx | |
| cmp rcx, rbx | |
| jl .field_loop | |
| ; get move | |
| mov rsi, s_move | |
| mov rdx, s_move.len | |
| call .print | |
| ;! TODO: why doesnt this work | |
| mov rax, 0 | |
| mov rdi, 0 | |
| lea rsi, [rsp + 8] | |
| mov rdx, 2 | |
| syscall | |
| ; game end check | |
| inc [turn] | |
| cmp [turn], 9 | |
| jge .end | |
| push 0xA | |
| lea rsi, [rsp] | |
| mov rdx, 1 | |
| call .print | |
| call .print | |
| jmp .main | |
| .end: | |
| mov rax, 60 | |
| mov rdi, 0 | |
| syscall | |
| .print: | |
| mov rax, 1 | |
| mov rdi, 1 | |
| syscall | |
| ret | |
| segment readable writeable | |
| turn db 0 | |
| field rb 9 | |
| rand_state rq 1 | |
| input_buf rb 2 | |
| symbols db "#XO" | |
| s_guide db "TIC TAC FUCKING TOE!!!!!!!", 0xA, "How to play:", 0xA, 0x9, "enter column (l->r a/b/c)", 0xA, 0x9, "followed by row (t->b 1/2/3)", 0xA | |
| s_guide.len = $ - s_guide | |
| s_turn db "Turn " | |
| s_turn.len = $ - s_turn | |
| s_move db "Your move: " | |
| s_move.len = $ - s_move |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment