Skip to content

Instantly share code, notes, and snippets.

@roxwize
Created February 9, 2025 02:00
Show Gist options
  • Select an option

  • Save roxwize/ad7bd6b3d3e0ae569baeeb1b812bd7f0 to your computer and use it in GitHub Desktop.

Select an option

Save roxwize/ad7bd6b3d3e0ae569baeeb1b812bd7f0 to your computer and use it in GitHub Desktop.
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