summaryrefslogtreecommitdiff
path: root/pasmgen-win.asm
blob: 927f9b75008549fb95e50e74f3e9c76d0df184eb (plain) (blame)
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