format PE64 console include 'win64a.inc' section '.text' code readable executable entry main main: invoke GetCommandLine argparse: .skipexe: cmp byte [rax], 0 je defaultargs cmp byte [rax], ' ' je .pastexe inc rax jmp .skipexe .pastexe: ;; load arg1 ;; FIXME: at least on my system, there's 2 more spaces (needs more testing if consistent) mov r8, [rax+2] and r8, 0xFF test r8, r8 jz fail sub r8, 48 ;; load arg2 mov r9, [rax+4] and r9, 0xFF test r9, r9 jz fail sub r9, 48 ;; load arg3 mov r10, [rax+6] and r10, 0xFF test r10, r10 jz fail sub r10, 48 jmp generate defaultargs: mov r8, qword 3 mov r9, qword 2 mov r10, qword 3 jmp generate ok: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, rax, out_buf, rsi, 0, 0 invoke ExitProcess, 0 fail: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, rax, usage, usage_len, 0, 0 invoke ExitProcess, 1 include 'pasmgen.inc' ;; win32 imports section '.idata' import data readable library kernel32,'kernel32.dll' include 'api/kernel32.inc' section '.data' data readable writeable include 'constants.inc' out_buf rb 64