Win32 Assembly 기본예제
- 작성자
- 고친과정
2005년 5월 15일 : 처음씀
2. 설명
그냥 한번 어셈블리로 짜본겁니다.
거의 Template 수준이므로 다른 예제들과 다를바 없습니다.
단, masm v8.0 에서 테스트했으니 그외의 버젼은 장담 못합니다.
그리고
단, masm v8.0 에서 테스트했으니 그외의 버젼은 장담 못합니다.
그리고
C:\masm32
에 설치되었다고 가정하고 만든것이기에
다른곳에 설치하셨다면 include, includelib 구문을 적당히 수정하시기 바랍니다.
3. 사용방법
컴파일은 요렇게 하시고
링크는 요렇게 합니다.
ml /c /coff mz.asm
link /SUBSYSTEM:WINDOWS mz.obj
4. 코드
- 예제소스 다운로드 : mzwin32_example.tar.gz (2.23 KB)
COMMENT # Copyright (C) JAEHYUK CHO All rights reserved. Code by JaeHyuk Cho <mailto:minzkn@minzkn.com> # ; 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