1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
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
|