Почему не работает?

Тема в разделе "WASM.BEGINNERS", создана пользователем splinter, 5 фев 2009.

  1. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    Доброе время суток. Начал изучать ассемблер, в среде МАСМ. Столкнулся с проблемой...

    Пишу простое приложение, кторое должно создавать окно, библиотечными вин-функциями.

    Вот какой код у меня получился:

    Код (Text):
    1. .386p
    2.  
    3. .MODEL FLAT, STDCALL
    4. ; -------------------------------------------------------------------------
    5. EXTERN MessageBoxA@16:near
    6. EXTERN CreateWindowExA@48:near
    7. EXTERN DefWindowProcA@16:near
    8. EXTERN DispatchMessageA@4:near
    9. EXTERN ExitProcess@4:near
    10. EXTERN GetMessageA@16:near
    11. EXTERN GetModuleHandleA@4:near
    12. EXTERN PostQuitMessage@4:near
    13. EXTERN RegisterClassA@4:near
    14. EXTERN ShowWindow@8:near
    15. EXTERN TranslateMessage@4:near
    16. EXTERN UpdateWindow@4:near
    17. EXTERN LoadCursorA@8:NEAR
    18. EXTERN LoadIconA@8:NEAR
    19.  
    20. includelib lib\kernel32.lib
    21. includelib lib\user32.lib
    22.  
    23. wndclass struc
    24.     classstyle dd ?
    25.     clwndproc dd ?
    26.     clscextra dd ?
    27.     clwndextra dd ?
    28.     clshinstance dd ?
    29.     clshicon dd ?
    30.     clshcursor dd ?
    31.     clbground dd ?
    32.     clmenuname dd ?
    33.     clname dd ?
    34. wndclass ends
    35.  
    36. msgs struc
    37.     mshwnd dd ?
    38.     msmessage dd ?
    39.     mswparam dd ?
    40.     mslparam dd ?
    41.     mstime dd ?
    42.     mspt dd ?
    43. msgs ends
    44.  
    45. .data
    46.     classname db 'ASMCLASS32',0
    47.     titlename db 'win win win hehehe',0
    48.     hinst dd 00000000h
    49.     wc wndclass <?>
    50.     nhwnd dd 0
    51.     msg msgs <?>
    52.     cap db 'message!',0
    53.     textmess db 'r button!',0
    54.     textmess2 db 'CREATE!!!!',0
    55.  
    56. ; -------------------------------------------------------------------------
    57. .code
    58. START:
    59.     push 0
    60.     call GetModuleHandleA@4
    61.     mov [hinst],eax
    62.  
    63.     mov [wc.classstyle],4003h
    64.     mov [wc.clwndproc],offset wndproc
    65.     mov [wc.clscextra],0
    66.     mov [wc.clwndextra],0
    67.     mov eax,[hinst]
    68.     mov [wc.clshinstance],eax
    69.  
    70.     push 32512
    71.     push 0
    72.     call LoadIconA@8
    73.  
    74.     mov [wc.clshicon],eax
    75.  
    76.     push 32512
    77.     push 0
    78.     call LoadCursorA@8
    79.  
    80.     mov [wc.clshcursor],eax
    81.    
    82.     mov [wc.clbground],5
    83.     mov dword ptr [wc.clmenuname],0
    84.     mov dword ptr [wc.clname],offset classname
    85.     push offset wc
    86.     call RegisterClassA@4
    87.  
    88.     push 0
    89.     push [hinst]
    90.     push 0
    91.     push 0
    92.     push 80000000h
    93.     push 80000000h
    94.     push 80000000h
    95.     push 80000000h
    96.     push 0CF0000h
    97.     push offset titlename
    98.     push offset classname
    99.     push 0
    100.     call CreateWindowExA@48
    101.  
    102.     mov [nhwnd],eax
    103.  
    104.     push 1
    105.     push [nhwnd]
    106.     call ShowWindow@8
    107.  
    108.     push [nhwnd]
    109.     call UpdateWindow@4
    110.  
    111. msg_loop:
    112.     push 0
    113.     push 0
    114.     push 0
    115.     push offset msg
    116.     call GetMessageA@16
    117.     cmp ax,0
    118.     jz end_loop
    119.     push offset msg
    120.     call TranslateMessage@4
    121.     push offset msg
    122.     call DispatchMessageA@4
    123.     jmp msg_loop
    124. end_loop:
    125.     push 0
    126.     call ExitProcess@4
    127. ; -------------------------------------------------------------------------
    128. wndproc proc
    129.     push ebp
    130.     mov ebp,esp
    131.     push ebx
    132.     push esi
    133.     push edi
    134.  
    135.     cmp dword ptr [ebp+0Ch],2h
    136.     jz wmdestroy
    137.  
    138.     cmp dword ptr [ebp+0Ch],1h
    139.     jz wmcreate
    140.  
    141.     cmp dword ptr [ebp+0Ch],204
    142.     jz wmrbutton
    143.    
    144.     push dword ptr [ebp+14h]
    145.     push dword ptr [ebp+10h]
    146.     push dword ptr [ebp+0Ch]
    147.     push dword ptr [ebp+08h]
    148.     call DefWindowProcA@16
    149.     mov eax,0
    150.     jmp finish
    151.    
    152. wmcreate:
    153.     push offset cap
    154.     push offset textmess2
    155.     call mess
    156.     mov eax,0
    157.     jmp finish
    158. wmrbutton:
    159.     push offset cap
    160.     push offset textmess
    161.     call mess
    162.     mov eax,0
    163.     jmp finish
    164. wmdestroy:
    165.     push 0
    166.     call PostQuitMessage@4
    167.     mov eax,0
    168. finish:  
    169.     pop edi
    170.     pop esi
    171.     pop ebx
    172.     pop ebp
    173.     ret 16
    174. wndproc endp
    175.  
    176. mess proc
    177.     push ebp
    178.     mov ebp,esp
    179.     push 0
    180.     push dword ptr [ebp+12]
    181.     push dword ptr [ebp+8]
    182.     push 0
    183.     call MessageBoxA@16
    184.     mov esp,ebp
    185.     pop ebx
    186.     ret 8
    187. mess endp
    188.  
    189. END START
    в коде я старался не использовать директив, типа Инвок и прочих - делающих асм похожим на язык высокого уровня.

    Код, что я привёл, вроде как и правильный, но не работает. А почему не раюотает - не знаю, не могу найти ошибку. Смотрел в отладчике - после функции CreateWindowExA в ЕАХ помещается 0, следовательно - ошибка. Но ведь там всё правильно... Качаю пример, компилирую, смотрю в отладчике - всё тоже самое, но работает. а мой - не хочет... Подскажите в чём я ошибся...

    вот пример, который работает:

    Код (Text):
    1. .386p
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. includelib .\lib\kernel32.lib
    6. includelib .\lib\user32.lib
    7.  
    8. include .\include\windows.inc  
    9. include .\include\kernel32.inc
    10. include .\include\user32.inc
    11.  
    12. .data
    13.  
    14. newhwnd         dd 0
    15. hInst           dd 00000000h
    16. szTitleName     db 'Window Application',0
    17. szClassName     db 'ASMCLASS32',0
    18. msg     MONMSGSTRUCT <?> ;  структура сообщения
    19. wc      WNDCLASS <?> ; структура класса
    20.  
    21. .code
    22. start: 
    23. Invoke GetModuleHandle,0 ; получаем hInstanse
    24. Mov [hInst], eax
    25.  
    26. Mov [wc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
    27.     ; устанавливаем стиль окна
    28. Mov [wc.lpfnWndProc], offset WndProc ;
    29. Mov [wc.cbClsExtra], 0
    30. Mov [wc.cbWndExtra], 0
    31. Mov eax, [hInst]
    32. Mov [wc.hInstance], eax
    33. Invoke LoadIcon,0,IDI_APPLICATION ; получаем значок приложения по
    34.             ; умолчанию
    35. Mov [wc.hIcon], eax
    36.  
    37. Invoke LoadCursorA,0,IDC_ARROW ; получаем курсор по умолчанию
    38. Mov [wc.hCursor], eax
    39.  
    40. Mov [wc.hbrBackground], 5
    41. Mov dword ptr [wc.lpszMenuName], 0
    42. Mov dword ptr [wc.lpszClassName], offset szClassName ; задаём имя класса
    43.             ;окна
    44. Invoke RegisterClassA,offset wc ; регистрируем класс окна
    45.  
    46. Push 0
    47. Push [hInst] ; дескриптор
    48. Push 0
    49. Push 0
    50. Push CW_USEDEFAULT ; высота
    51. Push CW_USEDEFAULT ; ширина
    52. Push CW_USEDEFAULT ; y
    53. Push CW_USEDEFAULT ; x
    54. Push WS_OVERLAPPEDWINDOW ; стиль
    55. Push offset szTitleName ; заголовок окна
    56. Push offset szClassName ; имя класса
    57. Push 0 ; дополнительный стиль
    58. Call CreateWindowEx ; создаём окно
    59. mov [newhwnd], eax ; сохраняем его дескриптор
    60. invoke ShowWindow,[newhwnd],SW_SHOWNORMAL; показываем окно   
    61. invoke UpdateWindow, [newhwnd]; обновляем его
    62. msg_loop: ; запускаем цикл обработки сообщений
    63. invoke GetMessage,offset msg, 0,0,0
    64. cmp ax, 0
    65. je end_loop    
    66. invoke TranslateMessage, offset msg
    67. invoke DispatchMessage, offset msg
    68. jmp msg_loop
    69. end_loop:
    70.     invoke ExitProcess, 0
    71.  
    72. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
    73.  
    74. Cmp [wmsg], WM_DESTROY
    75. Je wmdestroy
    76. Cmp [wmsg], WM_KEYDOWN
    77. Je wmkeydown
    78. Invoke DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
    79.     ; вызываем стандартный обработчик сообщений
    80. Jmp finish
    81. wmkeydown:
    82. cmp [wparam], VK_ESCAPE
    83. je wmdestroy; если нажата клавиша Escape то выход
    84. jmp finish
    85. wmdestroy:
    86. invoke PostQuitMessage, 0
    87. invoke ExitProcess, 0   ; выход
    88. finish:
    89. ret
    90. WndProc endp
    91. end start
     
  2. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    гуру, никто не знает? Откомпильте хоть, может у вас заработает))
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    splinter
    Зачем wndproc proc, если дальше всё равно вручную mov ebp,esp. Да кстати у тебя в конце pop ebx, а должно быть pop ebp. Попробуй так:
    Код (Text):
    1. wndproc:
    2. push ebp
    3. mov ebp,esp
    4. leave
    5. ret 16
    К томуже по-моему [hwnd] - это [ebp+4], а у тебя [ebp+8]
     
  4. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    В вашем:
    Код (Text):
    1.     call DefWindowProcA@16
    2.     mov eax,0 ; репрессировать!
    3.     jmp finish
    В рабочем:
    Код (Text):
    1. invoke PostQuitMessage, 0
    2. invoke ExitProcess, 0   ; выход - в странном месте
    murder
    [ebp+4] - адрес возврата)

    splinter
    может, понравятся опции
    Код (Text):
    1. option prologue: none
    2. option epilogue: none
    если уж все равно вручную создаем фреймы)
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    splinter
    Если охота эксперементировать -- возьми работающий пример и замени первую строку, что бы было как в твоем примере, компилируй, запускай, работает -- меняешь следующую строку и так далее... А вообще-то, поиск по wasm.ru/forum раздел WASM.BEGINNERS -- ищи "третий урок Iczelion'а" и смотри кто с какими ошибками сталкивался при его написании и как их исправляли
     
  6. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    JAPH
    Действительно :)
     
  7. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    splinter
    вдогонку:
    WM_RBUTTONDOWN - он 204h, иначе у вас не вылезет окошко по правой кнопке.
    Ну и структуру msgs неверно описали - посмотрите, как себя ведет заголовок этого окошка.
    На самом деле последний элемент структуры - POINT, а в ней два поля dword, так что
    Код (Text):
    1. msgs struc
    2.     mshwnd dd ?
    3.     msmessage dd ?
    4.     mswparam dd ?
    5.     mslparam dd ?
    6.     mstime dd ?
    7.     mspt dd ?
    8.          dd ?
    9. msgs ends
     
  8. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    дадада!
    ну эт разницы нет, так как после компиляции одно и тоже выходит

    Да, исправил, спасибо!

    Где можно про это подробней почитать? Просто вроде как верно...

    Но всё равно главная ошибка в функции CreateWindowExA, так как после неё в ЕАХ заносится 0 - в Ольке смотрел.

    Вот после небольших исправлений что поучилось:

    Код (Text):
    1. .386p
    2.  
    3. .MODEL FLAT, STDCALL
    4. ; -------------------------------------------------------------------------
    5. EXTERN MessageBoxA@16:near
    6. EXTERN CreateWindowExA@48:near
    7. EXTERN DefWindowProcA@16:near
    8. EXTERN DispatchMessageA@4:near
    9. EXTERN ExitProcess@4:near
    10. EXTERN GetMessageA@16:near
    11. EXTERN GetModuleHandleA@4:near
    12. EXTERN PostQuitMessage@4:near
    13. EXTERN RegisterClassA@4:near
    14. EXTERN ShowWindow@8:near
    15. EXTERN TranslateMessage@4:near
    16. EXTERN UpdateWindow@4:near
    17. EXTERN LoadCursorA@8:NEAR
    18. EXTERN LoadIconA@8:NEAR
    19.  
    20. includelib lib\kernel32.lib
    21. includelib lib\user32.lib
    22.  
    23. wndclass struc
    24.     classstyle dd ?
    25.     clwndproc dd ?
    26.     clscextra dd ?
    27.     clwndextra dd ?
    28.     clshinstance dd ?
    29.     clshicon dd ?
    30.     clshcursor dd ?
    31.     clbground dd ?
    32.     clmenuname dd ?
    33.     clname dd ?
    34. wndclass ends
    35.  
    36. msgs struc
    37.     mshwnd dd ?
    38.     msmessage dd ?
    39.     mswparam dd ?
    40.     mslparam dd ?
    41.     mstime dd ?
    42.     mspt dd ?
    43. msgs ends
    44.  
    45. .data
    46.     classname db 'ASMCLASS32',0
    47.     titlename db 'win win win hehehe',0
    48.     hinst dd 00000000h
    49.     wc wndclass <?>
    50.     nhwnd dd 0
    51.     msg msgs <?>
    52.     cap db 'message!',0
    53.     textmess db 'r button!',0
    54.     textmess2 db 'CREATE!!!!',0
    55.  
    56. ; -------------------------------------------------------------------------
    57. .code
    58. START:
    59.     push 0
    60.     call GetModuleHandleA@4
    61.     mov [hinst],eax
    62.  
    63.     mov [wc.classstyle],4003h
    64.     mov [wc.clwndproc],offset wndproc
    65.     mov [wc.clscextra],0
    66.     mov [wc.clwndextra],0
    67.     mov eax,[hinst]
    68.     mov [wc.clshinstance],eax
    69.  
    70.     push 32512
    71.     push 0
    72.     call LoadIconA@8
    73.  
    74.     mov [wc.clshicon],eax
    75.  
    76.     push 32512
    77.     push 0
    78.     call LoadCursorA@8
    79.  
    80.     mov [wc.clshcursor],eax
    81.    
    82.     mov [wc.clbground],5
    83.     mov dword ptr [wc.clmenuname],0
    84.     mov dword ptr [wc.clname],offset classname
    85.     push offset wc
    86.     call RegisterClassA@4
    87.  
    88.     push 0
    89.     push [hinst]
    90.     push 0
    91.     push 0
    92.     push 80000000h
    93.     push 80000000h
    94.     push 80000000h
    95.     push 80000000h
    96.     push 0CF0000h
    97.     push offset titlename
    98.     push offset classname
    99.     push 0
    100.     call CreateWindowExA@48
    101.  
    102.     mov [nhwnd],eax
    103.  
    104.     push 1
    105.     push [nhwnd]
    106.     call ShowWindow@8
    107.  
    108.     push [nhwnd]
    109.     call UpdateWindow@4
    110.  
    111. msg_loop:
    112.     push 0
    113.     push 0
    114.     push 0
    115.     push offset msg
    116.     call GetMessageA@16
    117.     cmp ax,0
    118.     jz end_loop
    119.     push offset msg
    120.     call TranslateMessage@4
    121.     push offset msg
    122.     call DispatchMessageA@4
    123.     jmp msg_loop
    124. end_loop:
    125.     push 0
    126.     call ExitProcess@4
    127. ; -------------------------------------------------------------------------
    128. wndproc proc
    129.     push ebp
    130.     mov ebp,esp
    131.     push ebx
    132.     push esi
    133.     push edi
    134.  
    135.     cmp dword ptr [ebp+0Ch],2h
    136.     jz wmdestroy
    137.  
    138.     cmp dword ptr [ebp+0Ch],1h
    139.     jz wmcreate
    140.  
    141.     cmp dword ptr [ebp+0Ch],204h
    142.     jz wmrbutton
    143.    
    144.     push dword ptr [ebp+14h]
    145.     push dword ptr [ebp+10h]
    146.     push dword ptr [ebp+0Ch]
    147.     push dword ptr [ebp+08h]
    148.     call DefWindowProcA@16
    149.     mov eax,0
    150.     jmp finish
    151.    
    152. wmcreate:
    153.     push offset cap
    154.     push offset textmess2
    155.     call mess
    156.     mov eax,0
    157.     jmp finish
    158. wmrbutton:
    159.     push offset cap
    160.     push offset textmess
    161.     call mess
    162.     mov eax,0
    163.     jmp finish
    164. wmdestroy:
    165.     push 0
    166.     call PostQuitMessage@4
    167.     mov eax,0
    168. finish:  
    169.     pop edi
    170.     pop esi
    171.     pop ebx
    172.     pop ebp
    173.     ret 16
    174. wndproc endp
    175.  
    176.  
    177.  
    178.  
    179. mess proc
    180.     push ebp
    181.     mov ebp,esp
    182.     push 0
    183.     push dword ptr [ebp+12]
    184.     push dword ptr [ebp+8]
    185.     push 0
    186.     call MessageBoxA@16
    187.     mov esp,ebp
    188.     pop ebp
    189.     ret 8
    190. mess endp
    191.  
    192. END START
    Всё равно - окно не создаётся... Может посмотрите, кто, с исправлениями запостьте... Буду очень признателен
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    splinter
    Ты уверен ? Если не отключить опции создания пролога\эпилога, то макрос proc сам создает стековый фрейм (push ebp и т.д.). Поэтому, если еще и ты добавляешь свой push ebp, то реальные смещения всех параметров в стеке относительно ebp увеличиваются на 4
     
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Попробуй
    Код (Text):
    1. SetWindowLong(CreateWindowEx(0,'STATIC',0,WS_OVERLAPPEDWINDOW+WS_VISIBLE,80000000h,80000000h,80000000h,80000000h,0,0,0,0),GWL_WNDPROC,wndproc);
    Ненадо никакого RegisterClass, ShowWindow, UpdateWindow
     
  11. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    splinter
    после вызова DefWindowProc ни в коем случае не надо сбрасывать еах в ноль! А то WM_NCCREATE возвращает ноль, а не единицу, и создание окна рушится

    почитать про структуры - в windows.inc или в справке по winapi
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    А вы уверены, что окно с такими параметрами должно создать ся, и создастся в видиой части экрана
     
  13. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    Использую МАСМ 2008 (10 вроде), настройки по дефолту

    Дабы это проверить создал листинг:
    Код (Text):
    1. .586p
    2.  
    3. .MODEL FLAT, STDCALL
    4.  
    5. .data
    6.     var1 dd 12h
    7. .code
    8. START:
    9.  
    10. push var1
    11. call sss
    12.  
    13. sss proc
    14.     push ebp
    15.     mov ebp,esp
    16.     mov eax,[ebp+4]
    17.     ret
    18. sss endp    
    19.  
    20. END START
    В ольке видим:

    Код (Text):
    1. PUSH DWORD PTR DS:[402000]
    2. CALL 0040100B
    3. PUSH EBP
    4. MOV EBP,ESP
    5. MOV EAX,DWORD PTR SS:[EBP+4]
    6. RETN
    В примере, рабочем, что я постил выше написано:

    Код (Text):
    1. Push CW_USEDEFAULT ; высота
    2. Push CW_USEDEFAULT ; ширина
    3. Push CW_USEDEFAULT ; y
    4. Push CW_USEDEFAULT ; x
    смотрим в windows.inc и видим, что константа CW_USEDEFAULT - 80000000h

    СПАСИБО ОГРОМНОЕ, ДРУЖИЩЕ!!! Это и была моя ошибка, которую я не мог найти! Окно создалось, всё работает как надо!

    выходной код:

    Код (Text):
    1. .386p
    2.  
    3. .MODEL FLAT, STDCALL
    4. ; -------------------------------------------------------------------------
    5. EXTERN MessageBoxA@16:near
    6. EXTERN CreateWindowExA@48:near
    7. EXTERN DefWindowProcA@16:near
    8. EXTERN DispatchMessageA@4:near
    9. EXTERN ExitProcess@4:near
    10. EXTERN GetMessageA@16:near
    11. EXTERN GetModuleHandleA@4:near
    12. EXTERN PostQuitMessage@4:near
    13. EXTERN RegisterClassA@4:near
    14. EXTERN ShowWindow@8:near
    15. EXTERN TranslateMessage@4:near
    16. EXTERN UpdateWindow@4:near
    17. EXTERN LoadCursorA@8:NEAR
    18. EXTERN LoadIconA@8:NEAR
    19.  
    20. includelib lib\kernel32.lib
    21. includelib lib\user32.lib
    22.  
    23. wndclass struc
    24.     classstyle dd ?
    25.     clwndproc dd ?
    26.     clscextra dd ?
    27.     clwndextra dd ?
    28.     clshinstance dd ?
    29.     clshicon dd ?
    30.     clshcursor dd ?
    31.     clbground dd ?
    32.     clmenuname dd ?
    33.     clname dd ?
    34. wndclass ends
    35.  
    36. msgs struc
    37.     mshwnd dd ?
    38.     msmessage dd ?
    39.     mswparam dd ?
    40.     mslparam dd ?
    41.     mstime dd ?
    42.     mspt dd ?
    43.           dd ?
    44. msgs ends
    45.  
    46. .data
    47.     classname db 'ASMCLASS32',0
    48.     titlename db 'win win win hehehe',0
    49.     hinst dd 00000000h
    50.     wc wndclass <?>
    51.     nhwnd dd 0
    52.     msg msgs <?>
    53.     cap db 'message!',0
    54.     textmess db 'r button!',0
    55.     textmess2 db 'CREATE!!!!',0
    56.  
    57. ; -------------------------------------------------------------------------
    58. .code
    59. START:
    60.     push 0
    61.     call GetModuleHandleA@4
    62.     mov [hinst],eax
    63.  
    64.     mov [wc.classstyle],4003h
    65.     mov [wc.clwndproc],offset wndproc
    66.     mov [wc.clscextra],0
    67.     mov [wc.clwndextra],0
    68.     mov eax,[hinst]
    69.     mov [wc.clshinstance],eax
    70.  
    71.     push 32512
    72.     push 0
    73.     call LoadIconA@8
    74.  
    75.     mov [wc.clshicon],eax
    76.  
    77.     push 32512
    78.     push 0
    79.     call LoadCursorA@8
    80.  
    81.     mov [wc.clshcursor],eax
    82.    
    83.     mov [wc.clbground],5
    84.     mov dword ptr [wc.clmenuname],0
    85.     mov dword ptr [wc.clname],offset classname
    86.     push offset wc
    87.     call RegisterClassA@4
    88.  
    89.     push 0
    90.     push [hinst]
    91.     push 0
    92.     push 0
    93.     push 80000000h
    94.     push 80000000h
    95.     push 80000000h
    96.     push 80000000h
    97.     push 0CF0000h
    98.     push offset titlename
    99.     push offset classname
    100.     push 0
    101.     call CreateWindowExA@48
    102.  
    103.     mov [nhwnd],eax
    104.  
    105.     push 1
    106.     push [nhwnd]
    107.     call ShowWindow@8
    108.  
    109.     push [nhwnd]
    110.     call UpdateWindow@4
    111.  
    112. msg_loop:
    113.     push 0
    114.     push 0
    115.     push 0
    116.     push offset msg
    117.     call GetMessageA@16
    118.     cmp ax,0
    119.     jz end_loop
    120.     push offset msg
    121.     call TranslateMessage@4
    122.     push offset msg
    123.     call DispatchMessageA@4
    124.     jmp msg_loop
    125. end_loop:
    126.     push 0
    127.     call ExitProcess@4
    128. ; -------------------------------------------------------------------------
    129. wndproc proc
    130.     push ebp
    131.     mov ebp,esp
    132.     push ebx
    133.     push esi
    134.     push edi
    135.  
    136.     cmp dword ptr [ebp+0Ch],2h
    137.     jz wmdestroy
    138.  
    139.     cmp dword ptr [ebp+0Ch],1h
    140.     jz wmcreate
    141.  
    142.     cmp dword ptr [ebp+0Ch],204h
    143.     jz wmrbutton
    144.    
    145.     push dword ptr [ebp+14h]
    146.     push dword ptr [ebp+10h]
    147.     push dword ptr [ebp+0Ch]
    148.     push dword ptr [ebp+08h]
    149.     call DefWindowProcA@16
    150.     jmp finish
    151.    
    152. wmcreate:
    153.     push offset cap
    154.     push offset textmess2
    155.     call mess
    156.     mov eax,0
    157.     jmp finish
    158. wmrbutton:
    159.     push offset cap
    160.     push offset textmess
    161.     call mess
    162.     mov eax,0
    163.     jmp finish
    164. wmdestroy:
    165.     push 0
    166.     call PostQuitMessage@4
    167.     mov eax,0
    168. finish:  
    169.     pop edi
    170.     pop esi
    171.     pop ebx
    172.     pop ebp
    173.     ret 16
    174. wndproc endp
    175.  
    176.  
    177.  
    178.  
    179. mess proc
    180.     push ebp
    181.     mov ebp,esp
    182.     push 0
    183.     push dword ptr [ebp+12]
    184.     push dword ptr [ebp+8]
    185.     push 0
    186.     call MessageBoxA@16
    187.     mov esp,ebp
    188.     pop ebp
    189.     ret 8
    190. mess endp
    191.  
    192. END START
     
  14. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    Дабы не мусорить и не создавать новую тему, поднял старую, так как опять что-то пошло не так...

    Проблема в том, что не загружается меню с ресурса и де ошибка не могу найти...
    вот листинг:

    Код (Text):
    1. .586p
    2.  
    3. .MODEL FLAT, STDCALL
    4. ; -------------------------------------------------------------------------
    5. EXTERN MessageBoxA@16:near
    6. EXTERN CreateWindowExA@48:near
    7. EXTERN DefWindowProcA@16:near
    8. EXTERN DispatchMessageA@4:near
    9. EXTERN ExitProcess@4:near
    10. EXTERN GetMessageA@16:near
    11. EXTERN GetModuleHandleA@4:near
    12. EXTERN PostQuitMessage@4:near
    13. EXTERN RegisterClassA@4:near
    14. EXTERN ShowWindow@8:near
    15. EXTERN TranslateMessage@4:near
    16. EXTERN UpdateWindow@4:near
    17. EXTERN LoadCursorA@8:NEAR
    18. EXTERN LoadIconA@8:NEAR
    19. EXTERN SetMenu@8:NEAR
    20. EXTERN LoadMenuA@8:NEAR
    21.  
    22. includelib C:\masm32\lib\kernel32.lib
    23. includelib C:\masm32\lib\user32.lib
    24.  
    25. wndclass struc
    26.     classstyle dd ?
    27.     clwndproc dd ?
    28.     clscextra dd ?
    29.     clwndextra dd ?
    30.     clshinstance dd ?
    31.     clshicon dd ?
    32.     clshcursor dd ?
    33.     clbground dd ?
    34.     clmenuname dd ?
    35.     clname dd ?
    36. wndclass ends
    37.  
    38. msgs struc
    39.     mshwnd dd ?
    40.     msmessage dd ?
    41.     mswparam dd ?
    42.     mslparam dd ?
    43.     mstime dd ?
    44.     mspt dd ?
    45.           dd ?
    46. msgs ends
    47.  
    48. .data
    49.     classname db 'ASMCLASS32',0
    50.     titlename db 'win win win hehehe',0
    51.     hinst dd 00000000h
    52.     wc wndclass <?>
    53.     nhwnd dd 0
    54.     msg msgs <?>
    55.     cap db 'message!',0
    56.     textmess db 'r button!',0
    57.     textmess2 db 'CREATE!!!!',0
    58.    
    59.     pmenu db 'MENUP',0
    60. ; -------------------------------------------------------------------------
    61. .code
    62. START:
    63.     push 0
    64.     call GetModuleHandleA@4
    65.     mov [hinst],eax
    66.  
    67.     mov [wc.classstyle],4003h
    68.     mov [wc.clwndproc],offset wndproc
    69.     mov [wc.clscextra],0
    70.     mov [wc.clwndextra],0
    71.     mov eax,[hinst]
    72.     mov [wc.clshinstance],eax
    73.  
    74.     push 32512
    75.     push 0
    76.     call LoadIconA@8
    77.  
    78.     mov [wc.clshicon],eax
    79.  
    80.     push 32512
    81.     push 0
    82.     call LoadCursorA@8
    83.  
    84.     mov [wc.clshcursor],eax
    85.    
    86.     mov [wc.clbground],5
    87.     mov dword ptr [wc.clmenuname],0
    88.     mov dword ptr [wc.clname],offset classname
    89.     push offset wc
    90.     call RegisterClassA@4
    91.  
    92.     push 0
    93.     push [hinst]
    94.     push 0
    95.     push 0
    96.     push 80000000h
    97.     push 80000000h
    98.     push 80000000h
    99.     push 80000000h
    100.     push 0CF0000h
    101.     push offset titlename
    102.     push offset classname
    103.     push 0
    104.     call CreateWindowExA@48
    105.  
    106.     mov [nhwnd],eax
    107.  
    108.     push 1
    109.     push [nhwnd]
    110.     call ShowWindow@8
    111.  
    112.     push [nhwnd]
    113.     call UpdateWindow@4
    114.    
    115. msg_loop:
    116.     push 0
    117.     push 0
    118.     push 0
    119.     push offset msg
    120.     call GetMessageA@16
    121.     cmp ax,0
    122.     jz end_loop
    123.     push offset msg
    124.     call TranslateMessage@4
    125.     push offset msg
    126.     call DispatchMessageA@4
    127.     jmp msg_loop
    128. end_loop:
    129.     push 0
    130.     call ExitProcess@4
    131. ; -------------------------------------------------------------------------
    132. wndproc proc
    133.     push ebp
    134.     mov ebp,esp
    135.     push ebx
    136.     push esi
    137.     push edi
    138.  
    139.     cmp dword ptr [ebp+0Ch],2h
    140.     jz wmdestroy
    141.  
    142.     cmp dword ptr [ebp+0Ch],1h
    143.     jz wmcreate
    144.  
    145.     cmp dword ptr [ebp+0Ch],204h
    146.     jz wmrbutton
    147. ;==============================================================================================
    148.     cmp dword ptr [ebp+0CH],111h
    149.     jne defw
    150.    
    151.     cmp dword ptr [ebp+10h],5
    152.     jz wmdestroy
    153.    
    154. defw:
    155.     push dword ptr [ebp+14h]
    156.     push dword ptr [ebp+10h]
    157.     push dword ptr [ebp+0Ch]
    158.     push dword ptr [ebp+08h]
    159.     call DefWindowProcA@16
    160.     jmp finish
    161.    
    162. wmcreate:
    163.     push offset pmenu
    164.     push hinst
    165.     call LoadMenuA@8
    166.    
    167.     push eax
    168.     push  dword ptr [ebp+08h]
    169.     call SetMenu@8
    170.    
    171.     mov eax,0
    172.     jmp finish
    173. wmrbutton:
    174.     push offset cap
    175.     push offset textmess
    176.     call mess
    177.     mov eax,0
    178.     jmp finish
    179. wmdestroy:
    180.     push 0
    181.     call PostQuitMessage@4
    182.     mov eax,0
    183. finish:  
    184.     pop edi
    185.     pop esi
    186.     pop ebx
    187.     pop ebp
    188.     ret 16
    189. wndproc endp
    190.  
    191.  
    192.  
    193.  
    194. mess proc
    195.     push ebp
    196.     mov ebp,esp
    197.     push 0
    198.     push dword ptr [ebp+12]
    199.     push dword ptr [ebp+8]
    200.     push 0
    201.     call MessageBoxA@16
    202.     mov esp,ebp
    203.     pop ebp
    204.     ret 8
    205. mess endp
    206.  
    207. END START
    а вот листинг ресурса:
    Код (Text):
    1. MENUP MENU
    2. {
    3.     POPUP "ПЕРВЫЙ ПУНКТ"
    4.         {
    5.             MENUITEM "ПЕРВЫЙ",1
    6.             MENUITEM "ВТОРОЙ",2,GRAYED
    7.             POPUP "ПОДМЕНЮ"
    8.             {
    9.                 MENUITEM "ДЕСЯТКА",6
    10.             }
    11.         }
    12.     POPUP "ВТОРОЙ ПУНКТ"
    13.     {
    14.         MENUITEM "ТРЕТИЙ",3
    15.         MENUITEM "ЧЕТВЁРТЫЙ",4
    16.     }
    17.     MENUITEM "ВЫХОД",5
    18. }
    спасибо огромное, кто поможет или попробует это сделать...
     
  15. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    никто тож не нашёл? =(
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    splinter
    Взял твой код и ресурс из #14, в коде подправил пути к kernel32.lib и user32.lib, собрал, запускаю - окно с менюшкой.

    Что я сделал не так?
     
  17. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    хм... может я компилирую не прально... У вас какая версия МАСМ32?
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    splinter
    Microsoft (R) Macro Assembler Version 6.15.8803
    Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 - Build 1823
    Microsoft (R) Incremental Linker Version 5.12.8078
    Инклюды и библиотеки из The MASM32 SDK version 10.
     
  19. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    хм... пишу в коммандной строке:

    c:\masm32\bin\ml.exe /c /coff c:\masm32\11.asm

    и не создаётся obj-файл...
    и линкер тож.. Пишу:

    с:\masm32\bin\link.exe /subsystem:windows c:\masm32\11.obj c:\masm32\11.res

    не создаёт ехе файл


    Только если компилирую через qeditor.exe (Project -> Build all) всё получается... В чём может быть проблема?

    ЗЫ
    Извиняюсь за свою бестактность, программировать на ассемблере начал недавно, раньше только на высокоуровневых языках...
     
  20. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    splinter
    > не создаётся obj-файл...
    Что пишет компилятор?

    > не создаёт ехе файл
    Что пишет редактор связей?

    Как создаешь res-файл?