test.asm 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. .386
  2. .model flat, stdcall
  3. include H:\TASM\INCLUDE\WINDOWS.INC
  4. extrn CreateWindowExA:PROC
  5. extrn DefWindowProcA:PROC
  6. extrn DispatchMessageA:PROC
  7. extrn ExitProcess:PROC
  8. extrn GetMessageA:PROC
  9. extrn GetModuleHandleA:PROC
  10. extrn LoadCursorA:PROC
  11. extrn LoadIconA:PROC
  12. extrn PostQuitMessage:PROC
  13. extrn RegisterClassA:PROC
  14. extrn ShowWindow:PROC
  15. extrn TranslateMessage:PROC
  16. extrn UpdateWindow:PROC
  17. .data
  18. newhwnd dd 0
  19. msg MSGSTRUCT <?>
  20. wc WNDCLASS <?>
  21. hInst dd 0
  22. szTitleName db 'Win32 Assembly Program',0
  23. szClassName db 'ASMCLASS32',0
  24. .code
  25. start:
  26. push 0
  27. call GetModuleHandleA
  28. mov [hInst], eax
  29. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
  30. mov [wc.clsLpfnWndProc], offset WndProc
  31. mov [wc.clsCbClsExtra], 0
  32. mov [wc.clsCbWndExtra], 0
  33. mov eax, [hInst]
  34. mov [wc.clsHInstance], eax
  35. push IDI_APPLICATION
  36. push 0
  37. call LoadIconA
  38. mov [wc.clsHIcon], eax
  39. push IDC_ARROW
  40. push 0
  41. call LoadCursorA
  42. mov [wc.clsHCursor], eax
  43. mov [wc.clsHbrBackground], COLOR_WINDOW + 1
  44. mov dword ptr [wc.clsLpszMenuName], 0
  45. mov dword ptr [wc.clsLpszClassName], offset szClassName
  46. push offset wc
  47. call RegisterClassA
  48. push 0
  49. push [hInst] ; дискриптор окна
  50. push 0
  51. push 0
  52. push CW_USEDEFAULT ; высота
  53. push CW_USEDEFAULT ; ширина
  54. push CW_USEDEFAULT ; y
  55. push CW_USEDEFAULT ; x
  56. push WS_OVERLAPPEDWINDOW ; стиль
  57. push offset szTitleName ; заголовок окна
  58. push offset szClassName ; имя класса
  59. push 0 ; дополнительный стиль
  60. call CreateWindowExA
  61. mov [newhwnd], eax
  62. push SW_SHOWNORMAL
  63. push [newhwnd]
  64. call ShowWindow
  65. push [newhwnd]
  66. call UpdateWindow
  67. msg_loop:
  68. push 0
  69. push 0
  70. push 0
  71. push offset msg
  72. call GetMessageA
  73. cmp ax, 0
  74. je end_loop
  75. push offset msg
  76. call TranslateMessage
  77. push offset msg
  78. call DispatchMessageA
  79. jmp msg_loop
  80. end_loop:
  81. push [msg.msWPARAM]
  82. call ExitProcess
  83. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
  84. wparam:DWORD, lparam:DWORD
  85. cmp [wmsg], WM_DESTROY
  86. je wmdestroy
  87. push [lparam]
  88. push [wparam]
  89. push [wmsg]
  90. push [hwnd]
  91. call DefWindowProcA
  92. jmp finish
  93. wmdestroy:
  94. push 0
  95. call PostQuitMessage
  96. mov eax, 0
  97. finish:
  98. ret
  99. WndProc endp
  100. ends
  101. end start