1
2;--- Win32/64 console application, uses WinInc v2+.
3;--- It can be used to generate both Win32 and Win64 binaries:
4;--- 32bit:
5;---  jwasm -coff -I\WinInc\Include WinXX_1.asm
6;---  link /subsystem:console /Libpath:\WinInc\Lib WinXX_1.obj
7;--- 64bit:
8;---  jwasm -win64 -Zp8 -I\WinInc\Include WinXX_1.asm
9;---  link /subsystem:console /Libpath:\WinInc\Lib64 WinXX_1.obj
10
11if (type near) eq 0ff02h    ;no -win64 switch?
12    .386
13    .model flat, stdcall
14FRAME equ <>
15rax equ <eax>
16rbx equ <ebx>
17rcx equ <ecx>
18rdx equ <edx>
19rsp equ <esp>
20rbp equ <ebp>
21rsi equ <esi>
22rdi equ <edi>
23else
24    option win64:1  ;enable autosaving of register params to shadow space
25    option frame:auto
26endif
27    option casemap:none
28
29    .nolist
30    .nocref
31WIN32_LEAN_AND_MEAN equ 1
32    include windows.inc
33    .list
34    .cref
35
36    includelib <kernel32.lib>
37
38;--- CStr(): macro function to simplify defining a string
39
40CStr macro Text:VARARG
41local szText
42    .const
43szText  db Text,0
44    .code
45    exitm <offset szText>
46endm
47
48    .CODE
49
50main proc FRAME uses rbx rsi rdi
51
52local dwWritten:DWORD
53
54    invoke GetStdHandle,STD_OUTPUT_HANDLE
55    mov rbx,rax
56    lea rsi, CStr("Hello, world",13,10)
57    invoke lstrlen, rsi
58    mov edi, eax
59    invoke WriteConsoleA, rbx, rsi, edi, addr dwWritten, 0
60    ret
61
62main endp
63
64mainCRTStartup proc FRAME
65    invoke main
66    invoke ExitProcess, eax
67mainCRTStartup endp
68
69    END mainCRTStartup
70