#keywords assembly,win32,masm,어셈블리,startup #title Win32 Assembly 기본예제 [wiki:Home 대문] / [wiki:CategoryBasic 기초지식], [wiki:CategoryProgramming 프로그래밍] / [wiki:Win32Assembly Win32 Assembly 기본예제] ---- == [wiki:Win32Assembly Win32 Assembly 기본예제] == * 작성자 조재혁([mailto:minzkn@minzkn.com]) * 고친과정 2005년 5월 15일 : 처음씀 [[TableOfContents]] == 설명 == 그냥 한번 어셈블리로 짜본겁니다. 거의 Template 수준이므로 다른 예제들과 다를바 없습니다. 단, masm v8.0 에서 테스트했으니 그외의 버젼은 장담 못합니다. 그리고 {{{C:\masm32}}} 에 설치되었다고 가정하고 만든것이기에 다른곳에 설치하셨다면 include, includelib 구문을 적당히 수정하시기 바랍니다. == 사용방법 == 컴파일은 요렇게 하시고 {{{#!plain ml /c /coff mz.asm }}} 링크는 요렇게 합니다. {{{#!plain link /SUBSYSTEM:WINDOWS mz.obj }}} == 코드 == * 예제소스 다운로드 : [attachment:mzwin32_example.tar.gz] {{{#!enscript asm 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 }}}