開発環境 Microsoft Visual Studio Community 2017
実行環境 Microsoft Windows 10 Home (64bit)
プロジェクトの種類 Visual C++/空のプロジェクト
プロジェクト名 WinApp

参考

ソリューション エクスプローラーで追加するファイル
フォルダ 種類 名前 プロパティ/項目の種類
ソース ファイル Visual C++/C++ ファイル (.cpp) WinApp.asm Microsoft Macro Assembler
ヘッダー ファイル Visual C++/ヘッダー ファイル (.h) windows.inc ビルドに含めない

WinApp.asm
.386
.model	flat, stdcall
option	casemap:none
 
include	<windows.inc>
 
; 関数プロトタイプ宣言
WinMain		proto	:dword, :dword, :dword, :dword
 
.data
ClassName	db	"SampleWndClass", 0
AppName		db	"WinApp", 0
 
.data?
hInstance	HINSTANCE	?
CommandLine	LPSTR		?
 
.code
start:
	invoke	GetModuleHandleA, NULL
	mov	hInstance, eax
	invoke	GetCommandLineA
	mov	CommandLine, eax
	invoke	WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
	invoke	ExitProcess, eax
 
WinMain	proc	hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
	local	wc	:WNDCLASSEX
	local	msg	:MSG
	local	hwnd	:HWND
 
	mov	wc.cbSize, sizeof WNDCLASSEX
	mov	wc.style, CS_HREDRAW or CS_VREDRAW
	mov	wc.lpfnWndProc, offset WndProc
	mov	wc.cbClsExtra, 0
	mov	wc.cbWndExtra, 0
	push	hInstance
	pop	wc.hInstance
	mov	wc.hbrBackground, COLOR_WINDOW+1
	mov	wc.lpszMenuName, NULL
	mov	wc.lpszClassName, offset ClassName
	invoke	LoadIconA, NULL, IDI_APPLICATION
	mov	wc.hIcon, eax
	mov	wc.hIconSm, eax
	invoke	LoadCursorA, NULL, IDC_ARROW
	mov	wc.hCursor, eax
	invoke	RegisterClassExA, addr wc
 
	invoke	CreateWindowExA,
		0, addr ClassName, addr AppName, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		NULL, NULL, hInst, NULL
	mov	hwnd, eax
	invoke	ShowWindow, hwnd, CmdShow
	invoke	UpdateWindow, hwnd
 
	.while	TRUE
		invoke	GetMessageA, addr msg, NULL, 0, 0
		.break .if (!eax)
		invoke	TranslateMessage, addr msg
		invoke	DispatchMessageA, addr msg
	.endw
	mov	eax, msg.wParam
	ret
WinMain	endp
 
WndProc	proc	hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	.if	uMsg == WM_DESTROY
		invoke	PostQuitMessage, 0
	.else
		invoke	DefWindowProcA, hWnd, uMsg, wParam, lParam
		ret
	.endif
	xor	eax, eax
	ret
WndProc	endp
 
end	start
 

windows.inc
; 定数定義
NULL			equ	0
TRUE			equ	1
 
COLOR_WINDOW		equ	5
SW_SHOWDEFAULT		equ	10
WM_DESTROY		equ	0002h
IDC_ARROW		equ	7f00h
IDI_APPLICATION		equ	7f00h
CW_USEDEFAULT		equ	80000000h
 
CS_VREDRAW		equ	0001h
CS_HREDRAW		equ	0002h
 
WS_OVERLAPPED		equ	00000000h
WS_CAPTION		equ	00c00000h
WS_SYSMENU		equ	00080000h
WS_THICKFRAME		equ	00040000h
WS_MINIMIZEBOX		equ	00020000h
WS_MAXIMIZEBOX		equ	00010000h
WS_OVERLAPPEDWINDOW	equ	WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX
 
; 型定義
HBRUSH		equ	<dword>
HCURSOR		equ	<dword>
HICON		equ	<dword>
HINSTANCE	equ	<dword>
HWND		equ	<dword>
_int		equ	<dword>
LONG		equ	<dword>
LPARAM		equ	<dword>
LPCTSTR		equ	<dword>
LPSTR		equ	<dword>
UINT		equ	<dword>
WNDPROC		equ	<dword>
WPARAM		equ	<dword>
 
WNDCLASSEX struct
	cbSize		UINT		?
	style		UINT		?
	lpfnWndProc	WNDPROC		?
	cbClsExtra	_int		?
	cbWndExtra	_int		?
	hInstance	HINSTANCE	?
	hIcon		HICON		?
	hCursor		HCURSOR		?
	hbrBackground	HBRUSH		?
	lpszMenuName	LPCTSTR		?
	lpszClassName	LPCTSTR		?
	hIconSm		HICON		?
WNDCLASSEX ends
 
MSG struct
	hwnd		HWND		?
	message		UINT		?
	wParam		WPARAM		?
	lParam		LPARAM		?
	time		DWORD		?
	struct pt
		x		LONG		?
		y		LONG		?
	ends
MSG ends
 
; Windows API
CreateWindowExA		proto	:dword, :dword, :dword, :dword, :dword, :dword, :dword, :dword, :dword, :dword, :dword, :dword
DefWindowProcA		proto	:dword, :dword, :dword, :dword
DispatchMessageA	proto	:dword
ExitProcess		proto	:dword
GetCommandLineA		proto
GetLastError		proto
GetMessageA		proto	:dword, :dword, :dword, :dword
GetModuleHandleA	proto	:dword
LoadCursorA		proto	:dword, :dword
LoadIconA		proto	:dword, :dword
PostQuitMessage		proto	:dword
RegisterClassExA	proto	:dword
ShowWindow		proto	:dword, :dword
TranslateMessage	proto	:dword
UpdateWindow		proto	:dword
 
最終更新:2017年09月24日 16:43