== [wiki:Win32Assembly Win32 Assembly ±âº»¿¹Á¦] == * ÀÛ¼ºÀÚ Á¶ÀçÇõ([mailto:minzkn@minzkn.com]) * °íÄ£°úÁ¤ 2005³â 5¿ù 15ÀÏ : óÀ½¾¸ == ¼³¸í == ±×³É Çѹø ¾î¼Àºí¸®·Î Â¥º»°Ì´Ï´Ù. °ÅÀÇ Template ¼öÁØÀ̹ǷΠ´Ù¸¥ ¿¹Á¦µé°ú ´Ù¸¦¹Ù ¾ø½À´Ï´Ù. ´Ü, masm v8.0 ¿¡¼­ Å×½ºÆ®ÇßÀ¸´Ï ±×¿ÜÀÇ ¹öÁ¯Àº Àå´ã ¸øÇÕ´Ï´Ù. ±×¸®°í C:\masm32 ¿¡ ¼³Ä¡µÇ¾ú´Ù°í °¡Á¤ÇÏ°í ¸¸µç°ÍÀ̱⿡ ´Ù¸¥°÷¿¡ ¼³Ä¡Çϼ̴ٸé include, includelib ±¸¹®À» Àû´çÈ÷ ¼öÁ¤ÇϽñ⠹ٶø´Ï´Ù. == »ç¿ë¹æ¹ý == ÄÄÆÄÀÏÀº ¿ä·¸°Ô ÇϽðí {{{#!plain ml /c /coff mz.asm }}} ¸µÅ©´Â ¿ä·¸°Ô ÇÕ´Ï´Ù. {{{#!plain link /SUBSYSTEM:WINDOWS mz.obj }}} == ÄÚµå == {{{#!plain COMMENT # Copyright (C) JAEHYUK CHO All rights reserved. Code by JaeHyuk Cho # ; Process type -------------------------------- .386 ; 386 CPU »ç¿ë ¿¹°í .MODEL FLAT,STDCALL ; Ç¥ÁØ ±ÔÄ¢ OPTION CASEMAP:NONE ; ¹Ýµå½Ã ÇÊ¿äÇÔ ; Window project default ---------------------- INCLUDE C:\masm32\include\windows.inc INCLUDE C:\masm32\include\user32.inc INCLUDE C:\masm32\include\kernel32.inc ;INCLUDE E:\masm32\include\windows.inc ;INCLUDE E:\masm32\include\user32.inc ;INCLUDE E:\masm32\include\kernel32.inc ; Link library -------------------------------- INCLUDELIB C:\masm32\lib\user32.lib INCLUDELIB C:\masm32\lib\kernel32.lib ;INCLUDELIB E:\masm32\lib\user32.lib ;INCLUDELIB E:\masm32\lib\kernel32.lib ; Proto region -------------------------------- WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD WndProc PROTO :DWORD, :DWORD, :DWORD, :DWORD ; Data select --------------------------------- .DATA g_instance DD 0 g_command_line DD 0 g_class_name DB "minzknWin32Engine", 0 g_title_name DB "´ç½ÅÀº ´©±¸¿ä?", 0 g_confirm_exit DB "Á¾·áÇÏ·Á°í¿ä?", 0 g_confirm_exit_title DB "È®ÀÎÁ» ÇÏ°Ú½À´Ï´Ù.", 0 g_hello DB "¾î¶ó? À©µµ¿ì ³ª¿Ã¶ó±¸ ±×·¡.", 0 ; Code zone ----------------------------------- .CODE START: ; Win32 startup code INVOKE GetModuleHandle, NULL MOV g_instance, EAX INVOKE GetCommandLine MOV g_command_line, EAX INVOKE WinMain, g_instance, NULL, g_command_line, SW_SHOWDEFAULT INVOKE ExitProcess, eax JMP $ WinMain PROC s_instance:DWORD, ; ³ª´Â ´©±¸´Ù ! s_prev_instance:DWORD, ; ȣȯ¶§¹®¿¡ s_command_line:DWORD, ; ÀÌ°ÍÀ» µ¡ºÙ¿©¼­... s_command_show:DWORD ; ¾î¶»°Ô º¸¿©Áö¶ó±¸? LOCAL s_window_class_ex : WNDCLASSEX ; À©µµ¿ì ÇÐ±Þ È®Àå LOCAL s_message : MSG ; ¸Þ¼¼ÁöÀü´Þ ¸Å°³Ã¼ LOCAL s_window : DWORD ; ÁÖ À©µµ¿ì mov s_window_class_ex.cbSize, sizeof(WNDCLASSEX) mov s_window_class_ex.style, CS_HREDRAW OR CS_VREDRAW mov s_window_class_ex.lpfnWndProc, offset WndProc mov s_window_class_ex.cbClsExtra, NULL mov s_window_class_ex.cbWndExtra, NULL mov eax, s_instance mov s_window_class_ex.hInstance, eax mov s_window_class_ex.hbrBackground, COLOR_BTNFACE + 1 mov s_window_class_ex.lpszMenuName, NULL mov s_window_class_ex.lpszClassName, offset g_class_name mov s_window_class_ex.hIcon, NULL mov s_window_class_ex.hCursor, NULL mov s_window_class_ex.hIconSm, 0 INVOKE RegisterClassEx, ADDR s_window_class_ex ; Window µî·Ï INVOKE CreateWindowEx, 0, ADDR g_class_name, ADDR g_title_name, WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MAXIMIZEBOX OR WS_MINIMIZEBOX OR WS_BORDER OR WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, s_instance, NULL mov s_window, eax ; ºÁ¶ó INVOKE ShowWindow, s_window, SW_SHOWNORMAL ; Çѹø´õ ºÁ¾ßµÇ.. INVOKE UpdateWindow, s_window WinLoop: INVOKE GetMessage, ADDR s_message, NULL, 0, 0 ; ¹¹°¡ µµÂøÇßÀ»±î? or eax, eax jz WinExitLoop INVOKE TranslateMessage, ADDR s_message ; Å°º¸µå ´Ï°¡ ó¸®ÇØ INVOKE DispatchMessage, ADDR s_message ; WndProc ¿¡°Ô ³ªÀÇ Á×À½À» ¾Ë·Á¶ó~ jmp WinLoop WinExitLoop: ; ³»°¡ ¹«½¼ »óÅÂÀÎÁö »óºÎ¿¡ º¸°íÇÏÀÚ~ mov eax, s_message.wParam ret WinMain ENDP ; WinProc callback function ------------------- WndProc PROC s_window:DWORD, s_message:DWORD, s_wparam:DWORD, s_lparam:DWORD .if s_message == WM_CREATE ; À©µµ¿ì »ý¼ºÇߴµ¥ ¹¹ÇÒ±î? INVOKE MessageBox, s_window, ADDR g_hello, ADDR g_hello, MB_OK OR MB_ICONQUESTION xor eax, eax ret .elseif s_message == WM_CLOSE ; À©µµ¿ì Á¾·áÇϱâ Á÷ÀüÀε¥... INVOKE MessageBox, s_window, ADDR g_confirm_exit, ADDR g_confirm_exit_title, MB_YESNO OR MB_ICONQUESTION CMP EAX, IDYES JNE ExitCancel INVOKE DestroyWindow, s_window ; ³ª Á¾·áÇÒ·Á°í Çϴµ¥... ExitCancel: xor eax, eax ret .elseif s_message == WM_DESTROY INVOKE PostQuitMessage, NULL ; ÁøÂ¥ Á¾·áÇҰžß... xor eax, eax ret .endif INVOKE DefWindowProc, s_window, s_message, s_wparam, s_lparam ret WndProc ENDP END START ; End of source }}}