первый старт

Тема в разделе "WASM.BEGINNERS", создана пользователем S4urp8n, 28 июл 2008.

  1. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    написал прогу (см. ниже), компиляция проходит успешно, но при запуске появляется консоль и сообщение об ощибке. Помогите разобраться в чём тут дело, также хотелось бы узнать как улучшить листинг.
    заранее спасибо!

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\kernel32.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\windows.inc
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib
    9. .data
    10. ClassName db "MyClass",0
    11. AppName db "MyApp",0
    12. .data?
    13. hInstance HINSTANCE ?
    14. CommandLine LPSTR ?
    15. .code
    16. start:
    17. push NULL
    18. call GetModuleHandle
    19. mov hInstance,eax
    20. call GetCommandLine
    21. mov CommandLine,eax
    22. call windowmain
    23. push eax
    24. call ExitProcess
    25. windowmain proc hInst:HINSTANCE,pInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    26.     LOCAL msg:MSG
    27.     LOCAL hwnd:HWND
    28.     LOCAL window:WNDCLASSEX
    29.     mov window.cbSize,SIZEOF WNDCLASSEX
    30.     mov window.style,CS_HREDRAW or CS_VREDRAW
    31.     mov window.lpfnWndProc,offset WindowMessageProcessingProcedure
    32.     push IDC_ARROW
    33.     push NULL
    34.     call LoadCursor
    35.     mov window.hCursor,eax
    36.     push IDI_APPLICATION
    37.     push NULL
    38.     call LoadIcon
    39.     mov window.hIcon,eax
    40.     mov window.hIconSm,eax
    41.     mov window.cbClsExtra,NULL
    42.     mov window.cbWndExtra,NULL
    43.     push hInstance
    44.     pop window.hInstance
    45.     mov window.hbrBackground,COLOR_WINDOW+1
    46.     mov window.lpszMenuName,NULL
    47.     mov window.lpszClassName,OFFSET ClassName
    48.     push [window]
    49.     call RegisterClassEx
    50.     push offset ClassName
    51.     push offset AppName
    52.     push WS_OVERLAPPEDWINDOW
    53.     push CW_USEDEFAULT
    54.     push CW_USEDEFAULT
    55.     push CW_USEDEFAULT
    56.     push CW_USEDEFAULT
    57.     push NULL
    58.     push NULL
    59.     push hInst
    60.     push NULL
    61.     call CreateWindowEx
    62.     mov hwnd,eax
    63.     push CmdShow
    64.     push hwnd
    65.     call ShowWindow
    66.     push hwnd
    67.     call UpdateWindow
    68.     .WHILE TRUE
    69.         push 0
    70.         push 0
    71.         push NULL
    72.         push msg
    73.         call GetMessage
    74.     .BREAK .IF(!eax)
    75.         push msg
    76.         call TranslateMessage
    77.         push msg
    78.         call DispatchMessage
    79.     .ENDW
    80.     mov eax,msg.wParam
    81.     ret
    82. windowmain endp
    83. WindowMessageProcessingProcedure proc hwnd:HWND,umsg:UINT,wpar:WPARAM,lpar:LPARAM
    84.     .IF umsg==WM_DESTROY
    85.     push NULL
    86.     call PostQuitMessage
    87.     .ENDIF
    88.     xor eax,eax
    89.     ret
    90. WindowMessageProcessingProcedure endp
    91. end start
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    1. Отладчика не существует? Скомпилируй и прогони под Олли-дебагером. Найди ошибку. Или ты хочешь, чтобы мы за тебя отлавливали баги?

    2. Читай правила форума о названиях тем
     
  3. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ты написал:
    Код (Text):
    1. windowmain proc hInst:HINSTANCE,pInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    Но вызвал:
    Код (Text):
    1. call windowmain
    В результате вот тут:
    Код (Text):
    1. ...
    2. push hInst
    3. ...
    4. push CmdShow
    5. ...
    в стек заносится (пытается занести!) неизвестно чего...

    а вот тут:
    Код (Text):
    1. ...
    2.  ret
    3. windowmain endp
    при возврате происходит (если не вылетит с ошибкой раньше) чистка стека от параметров процедуры, которые никто туда не помещал...
     
  4. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    На первый взгляд ошибка тут

    В твою функцию, согласно прототипу, передается 4 аргумента
    Значит на выходе функции из стека вытолкнется 12 байт.


    Однако ты вызываешь свою функцию не передав ей НИ ОДНОГО аргумента, тем самым портишь стек и натыкаешься на ошибку
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    опередил на 14 секунд %)
     
  6. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    теперь передал (вроде :) ) но не помогает всё также

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\kernel32.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\windows.inc
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib
    9. .data
    10. ClassName db "MyClass",0
    11. AppName db "MyApp",0
    12. .data?
    13. hInstance HINSTANCE ?
    14. CommandLine LPSTR ?
    15. .code
    16. start:
    17. push NULL
    18. call GetModuleHandle
    19. mov hInstance,eax
    20. call GetCommandLine
    21. mov CommandLine,eax
    22. push NULL
    23. push CommandLine
    24. push NULL
    25. push hInstance
    26. call windowmain
    27. push eax
    28. call ExitProcess
    29. windowmain proc hInst:HINSTANCE,pInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    30.     LOCAL msg:MSG
    31.     LOCAL hwnd:HWND
    32.     LOCAL window:WNDCLASSEX
    33.     mov window.cbSize,SIZEOF WNDCLASSEX
    34.     mov window.style,CS_HREDRAW or CS_VREDRAW
    35.     mov window.lpfnWndProc,offset WindowMessageProcessingProcedure
    36.     push IDC_ARROW
    37.     push NULL
    38.     call LoadCursor
    39.     mov window.hCursor,eax
    40.     push IDI_APPLICATION
    41.     push NULL
    42.     call LoadIcon
    43.     mov window.hIcon,eax
    44.     mov window.hIconSm,eax
    45.     mov window.cbClsExtra,NULL
    46.     mov window.cbWndExtra,NULL
    47.     push hInstance
    48.     pop window.hInstance
    49.     mov window.hbrBackground,COLOR_WINDOW+1
    50.     mov window.lpszMenuName,NULL
    51.     mov window.lpszClassName,OFFSET ClassName
    52.     push [window]
    53.     call RegisterClassEx
    54.     push offset ClassName
    55.     push offset AppName
    56.     push WS_OVERLAPPEDWINDOW
    57.     push CW_USEDEFAULT
    58.     push CW_USEDEFAULT
    59.     push CW_USEDEFAULT
    60.     push CW_USEDEFAULT
    61.     push NULL
    62.     push NULL
    63.     push hInst
    64.     push NULL
    65.     call CreateWindowEx
    66.     mov hwnd,eax
    67.     push CmdShow
    68.     push hwnd
    69.     call ShowWindow
    70.     push hwnd
    71.     call UpdateWindow
    72.     .WHILE TRUE
    73.         push 0
    74.         push 0
    75.         push NULL
    76.         push msg
    77.         call GetMessage
    78.     .BREAK .IF(!eax)
    79.         push msg
    80.         call TranslateMessage
    81.         push msg
    82.         call DispatchMessage
    83.     .ENDW
    84.     mov eax,msg.wParam
    85.     ret
    86. windowmain endp
    87. WindowMessageProcessingProcedure proc hwnd:HWND,umsg:UINT,wpar:WPARAM,lpar:LPARAM
    88.     .IF umsg==WM_DESTROY
    89.     push NULL
    90.     call PostQuitMessage
    91.     .ENDIF
    92.     xor eax,eax
    93.     ret
    94. WindowMessageProcessingProcedure endp
    95. end start
    P.S это мой первый опыт вообще в программировании на асме, поэтому не судите строго, и в Olly я пока плоховато разбираюсь
     
  7. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    в оли показывает что все-таки при вызове происходит ощибка, но как исправить?
     
  8. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    короче я понимаю что invoke намного безопаснее использовать? правда?
     
  9. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Код (Text):
    1. WindowMessageProcessingProcedure proc hwnd:HWND,umsg:UINT,wpar:WPARAM,lpar:LPARAM
    2.     .IF umsg==WM_DESTROY
    3.     push NULL
    4.     call PostQuitMessage
    5.     .ENDIF
    6.     xor eax,eax
    7.     ret
    8. WindowMessageProcessingProcedure endp
    Для всех случаев, которые не обрабатываются, должно быть вызвано DefWindowProc. Иначе начнуться проблемы сразу с момента создания окна. Ты обрабатываешь только WM_DESTROY - это самое неважное, что только можно обработать :) Самое важное - это вызвать DefWindowProc для всех событий, а потом - уже делать специальные обработчики
     
  10. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    а что делает эта DefWindowProc?
     
  11. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    invoke? Сущая правда.

    ЗЫ: можешь взять моё, я всем его втюхиваю %)
    + лучше не выкладывать многостраничные листинги кода прямо на форум, а юзать прикреплённые файлы.
    И ещё. Товарищи! Структурируйте визуально свой кодес! Он станет намного более читабельным.
     
  12. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\kernel32.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\windows.inc
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib
    9. .data
    10. ClassName db "MyClass",0
    11. AppName db "MyApp",0
    12. .data?
    13. hInstance HINSTANCE ?
    14. CommandLine LPSTR ?
    15. .code
    16. start:
    17. push NULL
    18. call GetModuleHandle
    19. mov hInstance,eax
    20. call GetCommandLine
    21. mov CommandLine,eax
    22. push NULL
    23. push CommandLine
    24. push NULL
    25. push hInstance
    26. call windowmain
    27. push eax
    28. call ExitProcess
    29. windowmain proc hInst:HINSTANCE,pInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    30.     LOCAL msg:MSG
    31.     LOCAL hwnd:HWND
    32.     LOCAL window:WNDCLASSEX
    33.     mov window.cbSize,SIZEOF WNDCLASSEX
    34.     mov window.style,CS_HREDRAW or CS_VREDRAW
    35.     mov window.lpfnWndProc,offset WindowMessageProcessingProcedure
    36.     push IDC_ARROW
    37.     push NULL
    38.     call LoadCursor
    39.     mov window.hCursor,eax
    40.     push IDI_APPLICATION
    41.     push NULL
    42.     call LoadIcon
    43.     mov window.hIcon,eax
    44.     mov window.hIconSm,eax
    45.     mov window.cbClsExtra,NULL
    46.     mov window.cbWndExtra,NULL
    47.     push hInstance
    48.     pop window.hInstance
    49.     mov window.hbrBackground,COLOR_WINDOW+1
    50.     mov window.lpszMenuName,NULL
    51.     mov window.lpszClassName,OFFSET ClassName
    52.     push [window]
    53.     call RegisterClassEx
    54.     push offset ClassName
    55.     push offset AppName
    56.     push WS_OVERLAPPEDWINDOW
    57.     push CW_USEDEFAULT
    58.     push CW_USEDEFAULT
    59.     push CW_USEDEFAULT
    60.     push CW_USEDEFAULT
    61.     push NULL
    62.     push NULL
    63.     push hInst
    64.     push NULL
    65.     call CreateWindowEx
    66.     mov hwnd,eax
    67.     push CmdShow
    68.     push hwnd
    69.     call ShowWindow
    70.     push hwnd
    71.     call UpdateWindow
    72.     .WHILE TRUE
    73.         push 0
    74.         push 0
    75.         push NULL
    76.         push msg
    77.         call GetMessage
    78.     .BREAK .IF(!eax)
    79.         push msg
    80.         call TranslateMessage
    81.         push msg
    82.         call DispatchMessage
    83.     .ENDW
    84.     mov eax,msg.wParam
    85.     ret
    86. windowmain endp
    87. WindowMessageProcessingProcedure proc hwnd:HWND,umsg:UINT,wpar:WPARAM,lpar:LPARAM
    88.     .IF umsg==WM_DESTROY
    89.     push NULL
    90.     call PostQuitMessage
    91.     .ELSE
    92.     push lpar
    93.     push wpar
    94.     push umsg
    95.     push hwnd
    96.     call DefWindowProc
    97.     .ENDIF
    98.     xor eax,eax
    99.     ret
    100. WindowMessageProcessingProcedure endp
    101. end start
    Не помогло!
     
  13. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    спасибо учту но всё же хочется разобраться
     
  14. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    S4urp8n
    у меня работает
    ты линкеру указываешь параметр /CONSOLE ?
     
  15. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    S4urp8n
    Отдебажил первую часть кода. В частности, всё из-за того, что ты объявил переменную WNDCLASSEX (вместо WNDCLASS, которую и умеет регистрировать RegisterClass [а не RegisterClassЕх]), а во-вторых из-за того что ты её объявил локально, и компиль не догадывается [window] интерпретировать как

    Код (Text):
    1. PUSH EBP;
    2. ADD DWORD PTR [ESP], -50h;
    но есть и другие баги. найду ещё - отпишу.
     
  16. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    полный *************** Заменил на windows но не хочет работать!
     
  17. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Тфу ты чёрт. Ни бельмеса я в твоём коде не разберу =(
    Единственное что могу сказать - ты ещё и параметры в CreateWindowEx передавал не в том порядке что нужно (а нужен, согласно директиве вызова stdcall, обратный порядок: последний параметр кладётся в стэк первым, предпоследний - вторым, итд), и в GetMessage ты передавал не адрес структуры msg, а значение первого её мембера. Ну и напоследок, не совсем ясно, нахренаж тут всё-таки ещё одна процедура, чей код можно совершенно безболезненно вставить вместо
    Вот. А вообще, дальше разбираться лень. Покорно прошу извинить +) Чесслово, лучше разбирай уже готовый код. И (повторять как мантру) код нужно структурировать, и визуально в том числе! юзать отступы и выделять законченные куски пустыми строками!
     
  18. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    имхо применять .WHILE и проч, при этом не применяя invoke, как минимум странно.
     
  19. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    GoldFinch
    хм. Ну я вот применяю invoke, однако от всяких .WHILE и !=еах меня воротит... может, тут подобный случай, только в отношении invoke?
     
  20. S4urp8n

    S4urp8n New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    30
    только на след день я понял что для начала нужно пробовать что попроще (это я про invoke) сделал всё заново и прога стала работать как надо Всем СПАСИБО!
    но все-таки прошу обьяснить что делает DefWindowProc?