Nasm. Как найти ошибку и отладить программу?

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

  1. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Проблема в следующем, написал программу выводящую окошко.
    Параметры компиляции
    Код (Text):
    1. nasm -fwin32
    2. GoLink.exe /entry _main win.obj kernel32.dll user32.dll gdu32.dll
    Код компилируется, и линкуется, но при запуске тут же вылетает жуткий фатал, и врубается отладчик VS2008. В нем я потыкался, ничего непонял.
    Вопрос: Как мне найти и исправить ошибки, я исходник читаю, но вроде все в нем впорядке, а отладчиком ollyDbg 1.10 мне помница потыкался, ну тама состояние регистров посмотрел и т.д, но суть не понял. Подскажите как в будущем предупредить такие ошибки, и что читать по поводу отладки? Точнее быть, как ошибку то исправить и почему nasm откомпилировал с ошибкой?
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    jershell
    Привел бы код что ли...
     
  3. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Я просто ститал, что надо не кормить голодных, а учить их ловить рыбу, но как скажешь начальник, вот код :):
    Код (Text):
    1. ; Демо окна на nasm
    2. ;IDE NASMX
    3. ;Пишу какой-то бред, и не вшибаю.
    4. %include "c:\nasmx\inc\nasmx.inc"
    5. %include "c:\nasmx\inc\win32\windows.inc"
    6. %include "c:\nasmx\inc\win32\kernel32.inc"
    7. %include "c:\nasmx\inc\win32\user32.inc"
    8. entry win
    9. global main
    10. [section .text]
    11. main:
    12. proc win
    13.     invoke GetModuleHandleA, dword 0
    14.     mov [hInstance],eax
    15.     invoke WinMain, dword hInstance, dword 0,dword 0, dword SW_SHOWDEFAULT
    16.     invoke ExitProcess, dword 0
    17.     ret
    18. endproc
    19.  
    20. proc WinMain
    21. hInst argd
    22. hPrevInst argd
    23. CmdLine argd
    24. CmdShow argd
    25.  
    26. invoke LoadIconA,dword 0,dword 100
    27. mov ecx, dword WndProc
    28. mov [wc + WNDCLASSEX.hIcon], eax
    29. mov [wc + WNDCLASSEX.hIconSm], eax
    30. mov [wc + WNDCLASSEX.lpfnWndProc],ecx
    31.  
    32. invoke LoadCursorA,dword 0, dword IDC_ARROW
    33. mov [wc + WNDCLASSEX.hCursor],eax
    34. invoke RegisterClassExA, dword wc
    35. invoke CreateWindowExA,dword 0,dword [ClassName],dword [AppName],dword WS_SYSMENU|WS_VISIBLE, dword 512, dword 314, dword 500, dword 400, dword 0, dword 0, dword [wc + WNDCLASSEX.hInstance], dword 0
    36. mov [hWnd],eax
    37.  
    38. invoke ShowWindow, dword hWnd,dword SW_SHOWDEFAULT
    39. invoke UpdateWindow, dword hWnd
    40. invoke SetFocus, dword hWnd
    41. .msg_loop:
    42. invoke GetMessageA, dword message, dword 0, dword 0, dword 0
    43. test eax,eax
    44. je .end_loop
    45. invoke TranslateMessage, dword message
    46. invoke DispatchMessageA, dword message
    47. jmp .msg_loop
    48. .end_loop:
    49. mov eax, dword [message+MSG.wParam]
    50. ret
    51. endproc
    52.  
    53. proc WndProc
    54. hWndp argd
    55. uMsg argd
    56. wParam argd
    57. lParam argd
    58. cmp argv(uMsg), dword WM_CREATE
    59. je _create
    60.  
    61. cmp argv(uMsg), dword WM_DESTROY
    62. je _destroy
    63.  
    64. cmp argv(uMsg), dword WM_KEYDOWN
    65. je _keydown
    66. invoke DefWindowProcA, dword argv(hWndp), dword argv(uMsg), dword argv(wParam), dword argv(lParam)
    67. ret
    68. _create:
    69. xor eax,eax
    70. ret
    71. _destroy:
    72. invoke PostQuitMessage, dword 0
    73. xor eax,eax
    74. ret
    75. _keydown: mov eax, dword [wParam]
    76. cmp eax,27
    77. jne _noExit
    78. invoke SendMessageA, dword argv(hWndp),dword [WM_CLOSE], dword 0
    79. _noExit:
    80. xor eax,eax
    81. ret
    82. endproc
    83.  
    84. [section .bss]
    85. hInstance:   resd 1
    86. hWnd:        resd 1
    87. [section .data]
    88. ClassName db "MyWin", 0x0
    89. AppName db "Окошко", 0x0
    90. ;wndclassex
    91. wc:
    92.     istruc WNDCLASSEX
    93.     at WNDCLASSEX.cbSize, dd WNDCLASSEX_size
    94.     at WNDCLASSEX.style, dd CS_HREDRAW|CS_VREDRAW
    95.     at WNDCLASSEX.lpfnWndProc, dd 0
    96.     at WNDCLASSEX.cbClsExtra, dd 0
    97.     at WNDCLASSEX.cbWndExtra, dd 0
    98.     at WNDCLASSEX.hInstance, dd 400000h
    99.     at WNDCLASSEX.hIcon, dd 0
    100.     at WNDCLASSEX.hCursor, dd NULL
    101.     at WNDCLASSEX.hbrBackground, dd BLACK_PEN
    102.     at WNDCLASSEX.lpszMenuName, dd 0
    103.     at WNDCLASSEX.lpszClassName, dd 0
    104.     at WNDCLASSEX.hIconSm, dd 0
    105.     iend
    106. message:
    107.     istruc MSG
    108.     at MSG.hwnd,                   dd    NULL
    109.     at MSG.message,                dd    NULL
    110.     at MSG.wParam,                 dd    NULL
    111.     at MSG.lParam,                 dd    NULL
    112.     at MSG.time,                   dd    NULL
    113.     at MSG.pt,                     dd    NULL
    114.     iend
    115.  
    116. rct:
    117.     istruc RECT
    118.     at RECT.left,                  dd    NULL
    119.     at RECT.top,                   dd    NULL
    120.     at RECT.right,                 dd    NULL
    121.     at RECT.bottom,                dd    NULL
    122.     iend
     
  4. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    http://www.wasm.ru/series.php?sid=17
     
  5. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Спасибо. Начал читать про отладку, пока вроде все понятно. А в общем, кто сможет на вышеописанные впросы ответить)? Плз люди ну хоть черкните пару строк по этому поводу, наверняка была такая же проллема, приложение-то учебное, и кампилятор не ругается, а ведь не запускается, мб есть какой-нибудь поисквичек ошибок?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    jershell
    Какие ответы? Учись отлаживать.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    jershell
    Ошибок прилично в принципе. Что сразу бросается в глаза — это при передаче wc в RegisterClassEx не указывается ни имя класса, ни размер структуры. Второе — строки передаются неверно. Вместо адреса строки в качестве параметра передаются первые четыре байта этой строки. Возможно, ошибок больше.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    jershell
    P.S. Извниняюсь. Не заметил, что структура частично уже заполнена в инициализированных данных. Соответственно замечание о размере структуры отпадает. Остальное в силе.
     
  9. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Да исправил, заработало, оли в этом месте показала, что ошибка. Прога запустилась, тольк как-то странно. При запуске появляется окошко, но при нажатии на esc не выходит, как понял неправильно где-то написал в процедуре WndProc. И ещё у меня песочные часы у курсора постоянно. Я так понимаю это не есть правильно?
     
  10. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Booster
    Те что задал вначале. Там как раз по поводу отладки.
     
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
  12. jershell

    jershell New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    18
    Прочитал книгу Рудольф Марек, и все же непонятно объяснено что лучше, подключать inc или использовать директиву _import_? В книге затрагивается этот момент, но что лучше так и не понятно. А именно при использовании _import нельзя компировать с параметрами -fwin32, но можно -fobj, который как написанно некоторые линковщики не возмут, и создается такое чуство, что так делать не стоит...
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    jershell
    рекомендую для начала немного поиспользовать масм32 и примеры изелиона
    попробуйте переписать программу с бумаги и сравнить с тем что набрал изелион
    "почувствуйте" синтаксис - навык не пропускать запятые, кавычки и прочие мелочи которые фатально влияют на работу программы
    после пересаживаетесь на ассемблер который вам больше нравиться и вникайте с помощью полученых навыков в тонкости его настройки всякими директивами
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    jershell
    будте внимательны к различному толкованию параметров в инструкциях как
    mov EAX,var - одни загружают значение другие адрес переменной
    в популярном здесь фасме mov EAX,var и lea EAX,var синонимы в том смысле что результат одинаковый
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Rockphorr
    mov EAX, [var] и lea EAX, [var]
    ну а olly и ms отладчики мне помнится генерируют листинг масмоподобный.
    jershell
    Объясните пожалуйста, как так получается, что исходник вы читаете нормально, а тоже самое, только чуть-чуть преобразованное, не понимаете. Из этого можно сделать вывод, что откопав где-то (у кого-то) исходник вы сюда пришли за разъяснениями по программированию на ассемблере.