Вопросы по 3-ему уроку Iczelion'a

Тема в разделе "WASM.BEGINNERS", создана пользователем kos, 23 ноя 2006.

Метки:
  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    Речь шла о WinMain, а в 3м уроке Iczelion'а EP != WinMain, как ты сам заметил.

    _SaNitAr
    Структуры DX должны быть выровнены на границу параграфа, о чём упоминается в msdn. Поэтому не надо путать вольность с грубым нарушением правил :)
     
  2. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    2 Quantum

    имелось ввиду заполнение D3DPRESENT_PARAMETERS ручками, без GetAdapterDisplayMode, и проверок на количество памяти, D3DCAPS9 на предмет шейдеров и тд итп.

    что то я не догоняю причем здесь выравнивание? невыравненные данные медленно -это да, но что б от этого не запускаться? 8[ ]

    что то мы не в тему уже:)))))
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _SaNitAr
    И такое происходит не только в DX. Ещё при использовании DMA всегда нужно учитывать выравнивание, а нето работать не будет.
     
  4. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    2 Quantum

    честно говоря про DX такого не слышал, покопаю SDK, хотя DX наверняка использует DMA?
    так что мэйби.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    А вот так покороче будет, у меня получилось 832 байта на ml + Polink
    Код (Text):
    1. .686P
    2. .model flat
    3. includelib user32.lib
    4. include windows.inc
    5. extern _imp__CreateWindowExA@48:dword
    6. extern _imp__DefWindowProcA@16:dword
    7. extern _imp__DispatchMessageA@4:dword
    8. extern _imp__GetMessageA@16:dword
    9. extern _imp__PostQuitMessage@4:dword
    10. extern _imp__RegisterClassA@4:dword
    11. .code
    12. start:  xchg ebx,eax
    13.     lea edi,style
    14.     assume edi:ptr WNDCLASSA
    15.     push edi
    16.     call _imp__RegisterClassA@4
    17.     mov ecx,CW_USEDEFAULT
    18.     push ebx       
    19.     push [edi].hInstance
    20.     push ebx   
    21.     push ebx   
    22.     push ecx   
    23.     push ecx   
    24.     push ecx   
    25.     push ecx   
    26.     push WS_OVERLAPPEDWINDOW + WS_VISIBLE
    27.     push offset szWinTitle         
    28.     push [edi].lpszClassName
    29.     push ebx
    30.     call _imp__CreateWindowExA@48   ;создать окно
    31.         add edi,sizeof WNDCLASSA;lea edi,msg
    32. message_loop: push ebx  ;цикл обработки сообщений
    33.     push ebx
    34.     push ebx
    35.     push edi
    36.     call _imp__GetMessageA@16  
    37.     xchg eax,ecx
    38.     jecxz short exit_msg_loop
    39.     push edi
    40.     call _imp__DispatchMessageA@4     ;вернуть управление Windows        
    41.     jmp short message_loop
    42. exit_msg_loop: ret
    43. WndProc proc ;hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD
    44.         cmp dword ptr [esp+8],WM_DESTROY;cmp Msg,WM_DESTROY
    45.     je short @@WM_DESTROY
    46.         jmp _imp__DefWindowProcA@16   ;все сообщения, не обрабатываемые в функции WndProc, направляются на обработку по умолчанию
    47. @@WM_DESTROY: push 0    ;завершение программы
    48.     call _imp__PostQuitMessage@4   
    49.     retn 10h
    50. WndProc endp
    51. ;WNDCLASSA -----------------------------------------------
    52.     style           dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна
    53.     lpfnWndProc     dd WndProc;Адрес процедуры обработки событий
    54.     cbClsExtra      dd 0        ;Эта хрень нам не нужна
    55.     cbWndExtra      dd 0        ;и эта тоже
    56.     hInstance       dd 400000h  ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу)
    57.     hIcon           dd 10003h   ;Иконка окна по умолчанию
    58.     hCursor         dd 10011h   ;Курсор окна по умолчанию (здесь указан ID обычной стрелки)
    59.     hbrBackground   dd COLOR_WINDOW+1   ;Фон нашего окна
    60.     lpszMenuName    dd 0        ;Меню у нас отсутствует
    61.     lpszClassName   dd szWinClass; Указатель на имя нашего класса
    62. ;----------------------------------------------------------
    63.     msg     MSG <>
    64.     szWinTitle  db  'Our First Window',0
    65.     szWinClass  db  'SimpleWinClass',0  
    66. end start
    тег [ code ] для кого придумали?
     
  6. Hmm

    Hmm New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2006
    Сообщения:
    162
    Кстати , по поводу Зубкова с :
    http://openlib.org.ua/ru/books/category/
    Совсем не 18Мб.После реги там дают ссылку на Рапидшару . И с неё качается 1.2 Мб файлик . Hlp + asm примеры .
    "Ассемблер для dos , windows и unix " называется.
     
  7. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Люди помогите пожалуйста. Вот мой код:
    Код (Text):
    1. .386
    2.  .model flat, stdcall
    3.  option casemap: none
    4.  
    5.  ;===== ??????? =====
    6.  
    7.  include masm32\include\windows.inc;
    8.  include masm32\include\user32.inc;
    9.  include masm32\include\kernel32.inc;
    10.  include masm32\include\gdi32.inc;
    11.  include masm32\include\comdlg32.inc;
    12.  include masm32\include\shell32.inc;
    13.  
    14.  includelib masm32\lib\user32.lib;
    15.  includelib masm32\lib\kernel32.lib;
    16.  includelib masm32\lib\gdi32.lib;
    17.  includelib masm32\lib\comdlg32.lib;
    18.  includelib masm32\lib\shell32.lib;
    19.  
    20.  ;===== ?????? =====
    21.  
    22.  .data?
    23.  
    24.  $hInstance dword ? ; ????? ??????
    25.  $hIcon dword ? ; ????? ??????
    26.  $hCursor dword ? ; ????? ???????
    27.  $hbrBackground dword ? ; ????? ????
    28.  h_wnd dword ? ; ????? ????
    29.  
    30.  $message dword ?
    31.  $wparam dword ?
    32.  $lparam dword ?
    33.  $time dword ?
    34.  
    35.  .data
    36.  
    37.  $ClassName db "MyFirstClass",0
    38.  $MenuName db "Hz",0
    39.  $WindowName db "My window!",0
    40.  
    41.  ;===== ?????? ???? =====
    42.  
    43.  .code
    44.  start:
    45.  
    46.  ;===== ??? ??? ????????? =====
    47.  
    48.  ;===== ????? ?????? ??????, ??????, ???????, ???? =====
    49.  
    50.  push 0
    51.  call GetModuleHandle
    52.  mov $hInstance, eax
    53.  
    54.  push 0
    55.  push 0
    56.  call LoadIcon
    57.  mov $hIcon, eax
    58.  
    59.  push 0
    60.  push 0
    61.  call LoadCursor
    62.  mov $hCursor, eax
    63.  
    64.  push 333333h
    65.  call CreateSolidBrush
    66.  mov $hbrBackground, eax
    67.  
    68.  ;===== ???????????? ????? =====
    69.  
    70.  push offset $ClassName
    71.  push offset $MenuName
    72.  push $hbrBackground
    73.  push $hCursor
    74.  push $hIcon
    75.  push $hInstance
    76.  push 0
    77.  push 0
    78.  push WindowProc
    79.  push CS_HREDRAW or CS_VREDRAW
    80.  call RegisterClass
    81.  
    82.  ;===== ??????? ???? =====
    83.  
    84.  push 0
    85.  push $hInstance
    86.  push 0
    87.  push 0
    88.  push CW_USEDEFAULT
    89.  push CW_USEDEFAULT
    90.  push CW_USEDEFAULT
    91.  push CW_USEDEFAULT
    92.  push WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU
    93.  push offset $WindowName
    94.  push $ClassName
    95.  push 0
    96.  call CreateWindowEx
    97.  mov h_wnd, eax
    98.  
    99.  ;===== ?????????? ???? ? ????????? =====
    100.  
    101.  push SW_SHOWNORMAL
    102.  push $hwnd
    103.  call ShowWindow
    104.  
    105.  push $hwnd
    106.  call UpdateWindow
    107.  
    108.  ;===== ???? ????????? =====
    109.  
    110.  @GetM:
    111.  
    112.  push 0
    113.  push 0
    114.  push 0
    115.  push $time
    116.  push $lparam
    117.  push $wparam
    118.  push $message
    119.  push $hwnd
    120.  call GetMessage
    121.  
    122.  cmp eax, 0
    123.  je @Exit
    124.  
    125.  push $time
    126.  push $lparam
    127.  push $wparam
    128.  push $message
    129.  push $hwnd
    130.  call TranslateMessage
    131.  
    132.  push $time
    133.  push $lparam
    134.  push $wparam
    135.  push $message
    136.  push $hwnd
    137.  call DispatchMessage
    138.  
    139.  jmp @GetM
    140.  
    141.  @Exit:
    142.  push $wparam
    143.  call ExitProcess
    144.  
    145.  ;===== ??????? ????????? ????????? =====
    146.  
    147.  WindowProc proc $wnd:dword, $message:dword, $wparam:dword, $lparam:dword
    148.  
    149.  cmp $message, WM_CREATE
    150.  je @wm_create
    151.  cmp $message, WM_DESTROY
    152.  je @wm_destroy
    153.  
    154.  push $lparam
    155.  push $wparam
    156.  push $message
    157.  push $wnd
    158.  call DefWindowProc
    159.  ret
    160.  
    161.  @wm_create:
    162.  xor eax, eax
    163.  ret
    164.  
    165.  @wm_destroy:
    166.  push 0
    167.  call PostQuitMessage
    168.  ret
    169.  
    170.  WindowProc endp
    171.  
    172.  ;===== ????? ????????? =====
    173.  
    174. end start
    Помогите пожалуйста найти ошибки, а то не компилится
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Loginanton
    А что это за ассемблер со знаками $ перед переменными? И какие ошибки (какие сообщения) при компиляции выдает? И каким батничком ты компилируешь и линкуешь? А из ошибок в твоем сорце - функция GetMessage должна получить 4 параметра (три нуля и указатель на message ), а функции TranslateMessage и DispatchMessage должны получить по 1 параметру - указатель на message (т.е offset $message) функция CreateWindowEx должна поучить указатель на $ClassName, а не содержимое переменной и т.д. тут туева куча ошибок, набирай внимательней, и посмотри на мой ответ #25 в этом топике:)
     
  9. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Mikl__ это масм :) я просто ставлю перед переменными знак $, чтоб лучше их видеть - это удобно :) Насчёт входящих параметров - по количеству всё вроде правильно, просто я пушаю без использования структур, тоесть в стек не структуру MSG кладу, а каждый ею часть :)
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mikl__
    из ошибок в твоем сорце ...
    Эти ошибки полезут на этапе выполнения, а тут пока еще "не компилится".

    Loginanton
    найти ошибки
    Разве компилятор их не нашел?
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Loginanton
    $ - предопределенная метка, поддерживаемая большинством ассемблеров. Она всегда соответствует текущему адресу. Т.е., команда jmp $ выполняет безусловный переход на саму себя, так что создается вечный цикл из одной команды. Поэтому лучше не использовать его в именах переменных.
    Из перечисленных у тебя библиотек: user32.lib, kernel32.lib, gdi32.lib, comdlg32.lib, shell32.lib реально в твоей программе используются kernel32 (функции GetModuleHandle, ExitProcess) gdi32 (CreateSolidBrush) и user32 (все остальные). На твой ответ - "я написал их в расчете на будущее", могу ответить, "тогда почему ты не перечислил все библиотеки в каталоге masm32/lib там их 222?". Реально можно было обойтись только user32. Как это сделать и другие полезные советы читай здесь
    Ты конешно можешь делать всё, что захочешь, но вот Windows требуется адрес структуры MSG, чтобы она поместила туда свои значения для твоей программы. Если тебе охота извращаться, тогда
    Код (Text):
    1. ; твой код                                   |; должно быть
    2. push offset $ClassName                       | push offset ClassName        
    3.  push offset $MenuName                       | push offset  MenuName
    4.  push $hbrBackground                         | push hbrBackground
    5.  push $hCursor                               | push hCursor  
    6.  push $hIcon                                 | push hIcon
    7.  push $hInstance                             | push hInstance
    8.  push 0                                      | push 0
    9.  push 0                                      | push 0
    10.  push WindowProc                             | push offset WindowProc <- должно быть так
    11.  push CS_HREDRAW or CS_VREDRAW               | push CS_HREDRAW or CS_VREDRAW
    12.  call RegisterClass                         |push esp<-а это указатель на структуру WNDCLASS
    13.                                             | call RegisterClass
    если охота расписывать структуру MSG (хотя IMHO запись message MSG <?> намного короче) тогда
    Код (Text):
    1. ; твой код                    |должен быть заменен на
    2.  $message dword ?             |hwnd      DWORD      ?
    3.  $wparam dword ?              |message   DWORD      ?
    4.  $lparam dword ?              |wParam    DWORD      ?
    5.  $time dword ?                |lParam    DWORD      ?  
    6.                               |time      DWORD      ?
    7.                               |x  DWORD ?
    8.                               |y  DWORD ?
    9. и компилятор, кстати, жалуется на отсутствие в твоем листинге переменной hwnd
    10. а когда требуется указатель на структуру MSG, ты должен передать offset hwnd, а не
    11. заниматься самостоятельным проталкиванием в стек
    12.  push $time
    13.  push $lparam
    14.  push $wparam
    15.  push $message
     
  12. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Люди вот код:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. ;===== инклуды =====
    6.  
    7. includelib masm32\lib\user32.lib
    8. includelib masm32\lib\kernel32.lib
    9. includelib masm32\lib\gdi32.lib
    10.  
    11. include masm32\include\windows.inc
    12. include masm32\include\user32.inc
    13. include masm32\include\kernel32.inc
    14. include masm32\include\gdi32.inc
    15.  
    16. ;===== данные =====
    17.  
    18. ;===== значком @ я обозначаю переменные и метки =====
    19.  
    20. .data?
    21.  
    22. @hInstance dword ? ; хендл модуля
    23. @hIcon dword ? ; хендл иконки
    24. @hCursor dword ? ; хендл курсора
    25. @hbrBackground dword ? ; что то типа хендла цвета фона
    26. @hwnd dword ? ; хендл создаваемого окна
    27. @lParam dword ? ; параметр какой то
    28. @wParam dword ? ; параметр какой то
    29. @message dword ? ; тут будут содержатся всякие вм_крит и т.п.
    30.  
    31. .data
    32.  
    33. @lpszClassName db "MyClass",0
    34. @WindowName db "My window :D",0
    35.  
    36. .code
    37. start:
    38.  
    39. ;===== код программы =====
    40.  
    41. ;===== берём хендлы всего что нам пригодится =====
    42.  
    43. push 0
    44. call GetModuleHandle
    45. mov @hInstance, eax
    46.  
    47. push 0
    48. push 0
    49. call LoadIcon
    50. mov @hIcon, eax
    51.  
    52. push 0
    53. push 0
    54. call LoadCursor
    55. mov @hCursor, eax
    56.  
    57. push 0ff6600h
    58. call CreateSolidBrush
    59. mov @hbrBackground, eax
    60.  
    61. ;===== регистрируем класс =====
    62.  
    63. push offset @lpszClassName
    64. push 0
    65. push offset @hbrBackground
    66. push offset @hCursor
    67. push offset @hIcon
    68. push offset @hInstance
    69. push 0
    70. push 0
    71. push WndProc ; адрес процесса обработки
    72. push CS_HREDRAW or CS_VREDRAW
    73. call RegisterClass
    74.  
    75. ;===== создаём окно =====
    76.  
    77. push 0
    78. push offset @hInstance
    79. push 0
    80. push 0
    81. push CW_USEDEFAULT
    82. push CW_USEDEFAULT
    83. push CW_USEDEFAULT
    84. push CW_USEDEFAULT
    85. push WS_VISIBLE or WS_SYSMENU
    86. push offset @WindowName
    87. push offset @lpszClassName
    88. push 0
    89. call CreateWindowEx
    90. mov @hwnd, eax
    91.  
    92. ;===== показываем окно =====
    93.  
    94. push SW_SHOWNORMAL
    95. push offset @hwnd
    96. call ShowWindow
    97.  
    98. ;===== обновляем содержимое окна =====
    99.  
    100. push offset @hwnd
    101. call UpdateWindow
    102.  
    103. ;===== запускаем вечный цикл приёмопередачи сообщений =====
    104.  
    105. @LOL:
    106.  
    107. push 0
    108. push 0
    109. push 0
    110. push offset @hwnd
    111. push offset @message
    112. push offset @wParam
    113. push offset @lParam
    114. call GetMessage
    115. cmp eax, 0
    116. je @Exit
    117.  
    118. push offset @hwnd
    119. push offset @message
    120. push offset @wParam
    121. push offset @lParam
    122. call TranslateMessage
    123.  
    124. push offset @hwnd
    125. push offset @message
    126. push offset @wParam
    127. push offset @lParam
    128. call DispatchMessage
    129.  
    130. jmp @LOL
    131.  
    132. @Exit:
    133. push offset @wParam
    134. call ExitProcess
    135.  
    136. ;===== процесс обработки сообщений =====
    137.  
    138. WndProc proc hwnd: dword, message: dword, wParam: dword, lParam: dword
    139.  
    140. cmp message, WM_CREATE
    141. je @wm_create
    142. cmp message, WM_DESTROY
    143. je @wm_destroy
    144.  
    145. push lParam
    146. push wParam
    147. push message
    148. push hwnd
    149. call DefWindowProc
    150. ret
    151.  
    152. @wm_create:
    153. xor eax, eax
    154. ret
    155.  
    156. @wm_destroy:
    157. push 0
    158. call PostQuitMessage
    159. ret
    160.  
    161. WndProc endp
    162.  
    163. end start
    Никаких ошибок при компиляции нету, но программа ничего не делает :) Тоесть она не выводит никакого окна, хотя должна :) помогите пожалуйста разобраться и скажите что где надо дописать, чтоб всё было норм
     
  13. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    эта программа не должна :)
    Loginanton
    структура и указатель на структуру - две большие разницы. Если GetMessage и RegisterClass ждут указатель на структуру, то они используют первый параметр как указатель, а так как он указывает на черт знает что, возникает исключение, и RegisterClass завершается с ошибкой, и класс окна незарегистрирован, и CreateWindowEx о нем не знает, вот и окна нету.
    Вот если делаете структуру в стэке, то, как советовал Mikl__, push esp тогда даст её указатель.. но тогда память в стэке кто освобождать будет? До enter/leave или add esp, sizeof WNDCLASS навряд ли дойдет... Да и в случае GetMessage простой push esp не спасет...
    Пока что не гонитесь за экономией, создайте структуры в секции данных, а функциям передавайте указатели на них

    P.S. Вот, свободу почувствовали.. нету проверки типов... С бы ругался на ваше RegisterClass(wc.style, wc.lpfnWndProc, wc.cbClsExtra, ...) вместо RegisterClass(&wc)
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Loginanton зря ты отредактировал предыдущее сообщение ведь там ты клятвенно обещал, что будешь во всем разбираться. В первую очередь, нужно было без поправок набрать упражнение из 3-го урока Iczeliona, добиться чтобы оно заработало, а уже потом начинать собственные эксперименты над работающей программой. Теперь, то что касается ошибок, но это все IMHO, многие на этом форуме будут со мной несогласны
    Код (Text):
    1. .386                          
    2. .model flat         ;отсутствие stdcall компенсируется ключем "ml /Gz"
    3. ;option casemap :none можно убрать - отсутствие компенсируется ключем "ml /Cp".
    4. includelib user32.lib ;
    5. includelib kernel32.lib
    6. ;полный путь указывается в строке "link /LIBPATH:c:\masm32\lib"
    7. include windows.inc
    8. include user32.inc
    9. include kernel32.inc
    10. ;полный путь указывается в строке "ml /Ic:\masm32\include",
    11. ;обойдемся без всех данных в .data?
    12. ;.data?                                                                            
    13. ;@hInstance dword ? ; хендл модуля              
    14. ;@hIcon dword ? ; хендл иконки            
    15. ;@hCursor dword ? ; хендл курсора                                      
    16. ;@hbrBackground dword ? ; что то типа
    17. ;@hwnd dword ? ; хендл создаваемого окна                          
    18. ;@lParam dword ? ; параметр какой то                                  
    19. ;@wParam dword ? ; параметр какой то                                
    20. ;@message dword ? ;                                                        
    21. .data                                                                              
    22. ;@lpszClassName db "MyClass",0    обойдемся без @lpszClassName
    23. @WindowName db "My window :D",0  ;вместо MyClass  можно использовать "Mywindow :D"
    24. .code                              
    25. start:  ;push 0               без вызова  GetModuleHandle можно обойтись, так как он  
    26. ;call GetModuleHandle      возвращает в  @hInstance заранее  известное число 400000h
    27. ;mov @hInstance, eax    
    28. ;класически должно быть так push IDI_APPLICATION
    29. ;  push  NULL          
    30. ; call LoadIcon        
    31. ;mov @hIcon, eax   ;и под Win98 и под Win XP в @hIcon будет возвращено 10003h
    32.                          
    33. ;класически должно быть так push IDC_ARROW
    34. ;  push  NULL                                                                  
    35. ;call LoadCursor                                                              
    36. ;mov @hCursor, eax ;и под Win98 и под Win XP в @hCursor будет возвращено 10011h  
    37.  
    38. ;push 0ff6600h           ; можно не вызывать
    39. ;call CreateSolidBrush  ;
    40. ;mov @hbrBackground, eax ;для первого окна сойдет константа COLOR_WINDOW
    41.                                                                                    
    42. push offset @WindowName
    43. push 0                                        
    44. push COLOR_WINDOW                              
    45. push 10011h                              
    46. push 10003h                                                              
    47. push 400000h                                
    48. push 0                                
    49. push 0                              
    50. push offset WndProc   ;<- должен быть offset
    51. push CS_HREDRAW or CS_VREDRAW      
    52. push esp ;здесь обязательно должен быть указатель на структуру WNDCLASS
    53. ;которую создали в стеке  и между прочим я об этом говорил                          
    54. call RegisterClass                                                            
    55.                                                                                    
    56. push 0                              
    57. push 400000h
    58. push 0
    59. push 0
    60. push CW_USEDEFAULT
    61. push CW_USEDEFAULT
    62. push CW_USEDEFAULT
    63. push CW_USEDEFAULT
    64. push WS_VISIBLE or WS_OVERLAPPEDWINDOW    
    65. push offset @WindowName              
    66. push offset @WindowName;обходимся без @lpszClassName              
    67. push 0                                          
    68. call CreateWindowEx                        
    69. ;mov @hwnd, eax            
    70. ;использование стиля WS_VISIBLE делает ненужным ShowWindow
    71. ;и UpdateWindow                                
    72. ;push SW_SHOWNORMAL                                                    
    73. ;push offset @hwnd   <- здесь должно быть  push @hwnd     !
    74. ;call ShowWindow              
    75. ;push offset @hwnd  <- здесь должно быть  push @hwnd     !                                          
    76. ;call UpdateWindow
    77. mov ebp,esp; помещаем указатель на структуру MSG в ebp
    78. @LOL: push 0                                                                  
    79. push 0                                                                            
    80. push 0                                                                            
    81. push ebp
    82. call GetMessage                                                                
    83. ;cmp eax, 0  выход из программы обработаем в WndProc
    84. ;je @Exit                                                                            
    85. ;так как, не проверяем нажатие клавиш TranslateMessage
    86. ; нам ни к чему  
    87. ;push offset @hwnd <- про эту хрень тебе уже говорили
    88. ;push offset @message                                                          
    89. ;push offset @wParam                                                          
    90. ;push offset @lParam
    91. ;call TranslateMessage                                                          
    92. ; опять пытаешься пихать в стек переменные вместо указателя  
    93. ;push offset @hwnd                                                              
    94. ;push offset @message                                                          
    95. ;push offset @wParam                                                          
    96. push ebp;push offset @lParam                                                            
    97. call DispatchMessage                                                            
    98. jmp @LOL                                                                          
    99. ;выход из программы обработаем в WndProc
    100. ;@Exit:  push offset @wParam                                                            
    101. ;call ExitProcess                            
    102.  
    103. WndProc proc      ;WndProc proc hwnd, message, wParam, lParam
    104. ;cmp message, WM_CREATE            
    105. ;je @wm_create                            
    106. cmp dword ptr [esp+8],WM_DESTROY;cmp message, WM_DESTROY          
    107. je @wm_destroy                            
    108. ;Для функции DefWindowProc передаются те же параметры, что и для функции WndProc,
    109. ;поэтому достаточно будет поставить jmp вместо call                                              
    110. ;push lParam                              
    111. ;push wParam                            
    112. ;push message                            
    113. ;push hwnd                                
    114. jmp DefWindowProc;call DefWindowProc                    
    115. ;ret                                            
    116. ;@wm_create: чушь собачья!
    117. ;xor eax, eax
    118. ;ret
    119. @wm_destroy: push 0
    120. call ExitProcess;call PostQuitMessage
    121. ;ret
    122. WndProc endp
    123. end start
    В аттаче батник, которым программа собиралась, сорц и ехе на тот случай если кто-то будет говорить, что так не должно работать
    q_q спасибо за подсказку;)
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mikl__
    + обрамить .nolist include windows.inc ... .list - никто не будет рад мегабайтной добавке к листингу.
     
  16. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Вот код программы:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. ;===== инклуды =====
    6.  
    7. include masm32\include\windows.inc
    8. include masm32\include\user32.inc
    9. include masm32\include\kernel32.inc
    10. include masm32\include\gdi32.inc
    11.  
    12. includelib masm32\lib\user32.lib
    13. includelib masm32\lib\kernel32.lib
    14. includelib masm32\lib\gdi32.lib
    15.  
    16. ;===== данные =====
    17.  
    18. .data?
    19.  
    20. hInstance dword ? ; хендл модуля
    21. hIcon dword ? ; хендл иконки
    22. hCursor dword ? ; хендл курсора
    23. hbrBackground dword ? ; хендл фона
    24. hwnd dword ? ; хендл создаваемого окна
    25.  
    26. msg CWPSTRUCT <> ; структура сообщения
    27. wc WNDCLASS <> ; структура для создания класса
    28.  
    29. .data
    30.  
    31. WindowName db "Моё окошко",0
    32. lpszClassName db "Мой класс",0
    33.  
    34. .code
    35. start:
    36.  
    37. ;===== код программы =====
    38.  
    39. ;===== берём хендлы =====
    40.  
    41. invoke GetModuleHandle, 0
    42. mov hInstance, eax
    43.  
    44. invoke LoadIcon, 0, 0
    45. mov hIcon, eax
    46.  
    47. invoke LoadCursor, 0, 0
    48. mov hCursor, eax
    49.  
    50. invoke CreateSolidBrush, 0ff6600h
    51. mov hbrBackground, eax
    52.  
    53. ;===== создаём класс =====
    54.  
    55. mov wc.style, CS_HREDRAW or CS_VREDRAW
    56. mov wc.lpfnWndProc, offset WndProc ; <================================
    57. mov wc.cbClsExtra, 0
    58. mov wc.cbWndExtra, 0
    59. mov wc.hInstance, offset hInstance
    60. mov wc.hIcon, offset hIcon
    61. mov wc.hCursor, offset hCursor
    62. mov wc.hbrBackground, offset hbrBackground
    63. mov wc.lpszMenuName, 0
    64. mov wc.lpszClassName, offset lpszClassName
    65.  
    66. invoke RegisterClass, addr wc
    67.  
    68. ;===== создаём окно =====
    69.  
    70. invoke CreateWindowEx, 0, addr lpszClassName, addr WindowName, WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, addr hInstance, 0
    71. mov hwnd, eax
    72.  
    73. ;===== показываем окно и обновляем содержимое =====
    74.  
    75. invoke ShowWindow, addr hwnd, SW_SHOWNORMAL
    76. invoke UpdateWindow, addr hwnd
    77.  
    78. ;===== вечный цикл обмена сообщений =====
    79.  
    80. @LOL:
    81.  
    82. invoke GetMessage, addr msg, 0, 0, 0
    83. cmp eax, 0
    84. je @Exit
    85.  
    86. invoke TranslateMessage, addr msg
    87. invoke DispatchMessage, addr msg
    88.  
    89. jmp @LOL
    90.  
    91. @Exit:
    92. invoke ExitProcess, msg.wParam
    93.  
    94. ;===== обработка сообщений =====
    95.  
    96. WndProc proc @hwnd :dword, @message :dword, @wparam :dword, @lparam :dword
    97.  
    98. cmp @message, WM_DESTROY
    99. je @wm_destroy
    100.  
    101. invoke DefWindowProc, @hwnd, @message, @wparam, @lparam
    102.  
    103. @wm_destroy:
    104.  
    105. invoke PostQuitMessage, 0
    106.  
    107. WndProc endp
    108.  
    109. end start
    Вроде всё правильно, но линковщик пишет ошибку: fatal error LNK1104: cannot open file "prax1.exe"
    Помогите пожалуйста разобраться в чём дело
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Loginanton
    Ищи ошибки сам - это не десткий сад, еще раз повторяю, где текст батника которым, ты компилируешь и линкуешь, откуда мне знать на какой ты "prax1.exe" ссылаешься
    invoke ShowWindow, addr hwnd, SW_SHOWNORMAL <- откуда здесь и на следующей строке
    invoke UpdateWindow, addr hwnd <- addr hwnd (указатель на hwnd, а не сама переменная )
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, addr <- откуда указатель на hInstance
    взялся, а это что за перлы?
    invoke LoadIcon, 0, 0<-разве так в исходном тексте?
    mov hIcon, eax |
    invoke LoadCursor, 0, 0<-
    mov hCursor, eax
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Loginanton
    может во время сборки у табя запушен ЕХЕ ?
    и соответсвенно его нельзя открыть :dntknw:
     
  19. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Вот текста батника:
    Код (Text):
    1. ml /c /coff prax1.asm
    2. Link /SUBSYSTEM:WINDOWS prax1.obj
    3. pause
     
  20. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Loginanton
    Нажми Ctrl+Alt+Del и найди среди запущенных процессов prax1.exe
    Погаси его, удали prax1.exe, исправь ошибки и снова создай, и так до тех пор, пока не создашь своё первое окно:)