let var N := 8 type intArray = array of int var row := intArray [ N ] of 0 var col := intArray [ N ] of 0 var diag1 := intArray [N+N-1] of 0 var diag2 := intArray [N+N-1] of 0 function printboard() = (for i := 0 to N-1 do (for j := 0 to N-1 do print(if col[i]=j then " O" else " ."); print("\n")); print("\n")) function try(c:int) = if c=N then printboard() else for r := 0 to N-1 do if row[r] = 0 & diag1[r+c] = 0 & diag2[r + 7 - c] = 0 then (row[r] := 1; diag1[r+c] := 1; diag2[r+7-c] := 1; col[c] := r; try(c+1); row[r] := 0; diag1[r+c] := 0; diag2[r+7-c] := 0) in try(0) end extern print extern flush extern getchar extern ord extern chr extern size extern substring extern concat extern not extern exit extern initArray section .text global main main: push rbp mov rbp, rsp sub rsp, 56 mov qword [rbp + 16], rdi mov qword [rbp - 8], 8 mov rdi, qword [rbp - 8] mov rsi, 0 call initArray mov qword [rbp - 16], rax mov rdi, qword [rbp - 8] mov rsi, 0 call initArray mov qword [rbp - 24], rax mov rax, qword [rbp - 8] mov rcx, qword [rbp - 8] lea rdi, [rcx + rax - 1] mov rsi, 0 call initArray mov qword [rbp - 32], rax mov rcx, qword [rbp - 8] mov rax, qword [rbp - 8] lea rdi, [rax + rcx - 1] mov rsi, 0 call initArray mov qword [rbp - 40], rax mov rdi, rbp mov rsi, 0 call L1 jmp L28 L28: leave ret section .text global L1 L1: push rbp mov rbp, rsp sub rsp, 48 mov qword [rbp - 8], rbx mov qword [rbp - 16], r12 mov qword [rbp - 24], r13 mov qword [rbp - 32], r14 mov r14, r15 mov qword [rbp + 16], rdi mov rbx, rsi mov rax, qword [rbp + 16] cmp rbx, qword [rax - 8] je L25 L26: mov r13, 0 mov rax, qword [rbp + 16] mov rax, qword [rax - 8] lea r12, [rax - 1] cmp r13, r12 jle L23 L15: mov rax, 0 L27: mov r15, r14 mov r14, qword [rbp - 32] mov r13, qword [rbp - 24] mov r12, qword [rbp - 16] mov rbx, qword [rbp - 8] jmp L29 L25: mov rdi, qword [rbp + 16] call L0 jmp L27 L24: lea r13, [r13 + 1] L23: mov rax, qword [rbp + 16] mov rax, qword [rax - 16] cmp qword [rax + 8 * r13], 0 je L16 L17: L19: L21: mov rax, 0 L22: cmp r13, r12 jl L24 L30: jmp L15 L16: mov rax, qword [rbp + 16] mov rax, qword [rax - 32] lea rax, [rax + 8 * r13] cmp qword [rax + 8 * rbx], 0 jne L19 L18: mov rax, rbx imul rax, -8 mov rcx, qword [rbp + 16] mov rcx, qword [rcx - 40] lea rcx, [rcx + 8 * r13] cmp qword [rcx + rax + 56], 0 jne L21 L20: mov rax, qword [rbp + 16] mov rax, qword [rax - 16] mov qword [rax + 8 * r13], 1 mov rax, qword [rbp + 16] mov rax, qword [rax - 32] lea rax, [rax + 8 * r13] mov qword [rax + 8 * rbx], 1 mov rax, rbx imul rax, -8 mov rcx, qword [rbp + 16] mov rcx, qword [rcx - 40] lea rcx, [rcx + 8 * r13] mov qword [rcx + rax + 56], 1 mov rax, qword [rbp + 16] mov rax, qword [rax - 24] mov qword [rax + 8 * rbx], r13 mov rdi, qword [rbp + 16] lea rsi, [rbx + 1] call L1 mov rax, qword [rbp + 16] mov rax, qword [rax - 16] mov qword [rax + 8 * r13], 0 mov rax, qword [rbp + 16] mov rax, qword [rax - 32] lea rax, [rax + 8 * r13] mov qword [rax + 8 * rbx], 0 mov rax, rbx imul rax, -8 mov rcx, qword [rbp + 16] mov rcx, qword [rcx - 40] lea rcx, [rcx + 8 * r13] mov qword [rcx + rax + 56], 0 mov rax, 0 jmp L22 L29: leave ret section .text global L0 L0: push rbp mov rbp, rsp sub rsp, 40 mov qword [rbp - 8], rbx mov qword [rbp - 16], r12 mov qword [rbp - 24], r13 mov qword [rbp - 32], r14 mov qword [rbp + 16], rdi mov rbx, 0 mov rax, qword [rbp + 16] mov rax, qword [rax - 8] lea r14, [rax - 1] cmp rbx, r14 jle L12 L2: mov rdi, L14 call print mov r14, qword [rbp - 32] mov r13, qword [rbp - 24] mov r12, qword [rbp - 16] mov rbx, qword [rbp - 8] jmp L31 L13: lea rbx, [rbx + 1] L12: mov r13, 0 mov rax, qword [rbp + 16] mov rax, qword [rax - 8] lea r12, [rax - 1] cmp r13, r12 jle L9 L3: mov rdi, L11 call print cmp rbx, r14 jl L13 L32: jmp L2 L10: lea r13, [r13 + 1] L9: mov rax, qword [rbp + 16] mov rax, qword [rax - 24] cmp qword [rax + 8 * rbx], r13 je L6 L7: mov rdi, L5 L8: call print cmp r13, r12 jl L10 L33: jmp L3 L6: mov rdi, L4 jmp L8 L31: leave ret section .rodata global L14 L14: dd 1 db 10, 0 section .rodata global L11 L11: dd 1 db 10, 0 section .rodata global L5 L5: dd 2 db 32, 46, 0 section .rodata global L4 L4: dd 2 db 32, 79, 0