Проблема в следующем, написал программу выводящую окошко. Параметры компиляции Код (Text): nasm -fwin32 GoLink.exe /entry _main win.obj kernel32.dll user32.dll gdu32.dll Код компилируется, и линкуется, но при запуске тут же вылетает жуткий фатал, и врубается отладчик VS2008. В нем я потыкался, ничего непонял. Вопрос: Как мне найти и исправить ошибки, я исходник читаю, но вроде все в нем впорядке, а отладчиком ollyDbg 1.10 мне помница потыкался, ну тама состояние регистров посмотрел и т.д, но суть не понял. Подскажите как в будущем предупредить такие ошибки, и что читать по поводу отладки? Точнее быть, как ошибку то исправить и почему nasm откомпилировал с ошибкой?
Я просто ститал, что надо не кормить голодных, а учить их ловить рыбу, но как скажешь начальник, вот код : Код (Text): ; Демо окна на nasm ;IDE NASMX ;Пишу какой-то бред, и не вшибаю. %include "c:\nasmx\inc\nasmx.inc" %include "c:\nasmx\inc\win32\windows.inc" %include "c:\nasmx\inc\win32\kernel32.inc" %include "c:\nasmx\inc\win32\user32.inc" entry win global main [section .text] main: proc win invoke GetModuleHandleA, dword 0 mov [hInstance],eax invoke WinMain, dword hInstance, dword 0,dword 0, dword SW_SHOWDEFAULT invoke ExitProcess, dword 0 ret endproc proc WinMain hInst argd hPrevInst argd CmdLine argd CmdShow argd invoke LoadIconA,dword 0,dword 100 mov ecx, dword WndProc mov [wc + WNDCLASSEX.hIcon], eax mov [wc + WNDCLASSEX.hIconSm], eax mov [wc + WNDCLASSEX.lpfnWndProc],ecx invoke LoadCursorA,dword 0, dword IDC_ARROW mov [wc + WNDCLASSEX.hCursor],eax invoke RegisterClassExA, dword wc 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 mov [hWnd],eax invoke ShowWindow, dword hWnd,dword SW_SHOWDEFAULT invoke UpdateWindow, dword hWnd invoke SetFocus, dword hWnd .msg_loop: invoke GetMessageA, dword message, dword 0, dword 0, dword 0 test eax,eax je .end_loop invoke TranslateMessage, dword message invoke DispatchMessageA, dword message jmp .msg_loop .end_loop: mov eax, dword [message+MSG.wParam] ret endproc proc WndProc hWndp argd uMsg argd wParam argd lParam argd cmp argv(uMsg), dword WM_CREATE je _create cmp argv(uMsg), dword WM_DESTROY je _destroy cmp argv(uMsg), dword WM_KEYDOWN je _keydown invoke DefWindowProcA, dword argv(hWndp), dword argv(uMsg), dword argv(wParam), dword argv(lParam) ret _create: xor eax,eax ret _destroy: invoke PostQuitMessage, dword 0 xor eax,eax ret _keydown: mov eax, dword [wParam] cmp eax,27 jne _noExit invoke SendMessageA, dword argv(hWndp),dword [WM_CLOSE], dword 0 _noExit: xor eax,eax ret endproc [section .bss] hInstance: resd 1 hWnd: resd 1 [section .data] ClassName db "MyWin", 0x0 AppName db "Окошко", 0x0 ;wndclassex wc: istruc WNDCLASSEX at WNDCLASSEX.cbSize, dd WNDCLASSEX_size at WNDCLASSEX.style, dd CS_HREDRAW|CS_VREDRAW at WNDCLASSEX.lpfnWndProc, dd 0 at WNDCLASSEX.cbClsExtra, dd 0 at WNDCLASSEX.cbWndExtra, dd 0 at WNDCLASSEX.hInstance, dd 400000h at WNDCLASSEX.hIcon, dd 0 at WNDCLASSEX.hCursor, dd NULL at WNDCLASSEX.hbrBackground, dd BLACK_PEN at WNDCLASSEX.lpszMenuName, dd 0 at WNDCLASSEX.lpszClassName, dd 0 at WNDCLASSEX.hIconSm, dd 0 iend message: istruc MSG at MSG.hwnd, dd NULL at MSG.message, dd NULL at MSG.wParam, dd NULL at MSG.lParam, dd NULL at MSG.time, dd NULL at MSG.pt, dd NULL iend rct: istruc RECT at RECT.left, dd NULL at RECT.top, dd NULL at RECT.right, dd NULL at RECT.bottom, dd NULL iend
Спасибо. Начал читать про отладку, пока вроде все понятно. А в общем, кто сможет на вышеописанные впросы ответить)? Плз люди ну хоть черкните пару строк по этому поводу, наверняка была такая же проллема, приложение-то учебное, и кампилятор не ругается, а ведь не запускается, мб есть какой-нибудь поисквичек ошибок?
jershell Ошибок прилично в принципе. Что сразу бросается в глаза — это при передаче wc в RegisterClassEx не указывается ни имя класса, ни размер структуры. Второе — строки передаются неверно. Вместо адреса строки в качестве параметра передаются первые четыре байта этой строки. Возможно, ошибок больше.
jershell P.S. Извниняюсь. Не заметил, что структура частично уже заполнена в инициализированных данных. Соответственно замечание о размере структуры отпадает. Остальное в силе.
Да исправил, заработало, оли в этом месте показала, что ошибка. Прога запустилась, тольк как-то странно. При запуске появляется окошко, но при нажатии на esc не выходит, как понял неправильно где-то написал в процедуре WndProc. И ещё у меня песочные часы у курсора постоянно. Я так понимаю это не есть правильно?
Прочитал книгу Рудольф Марек, и все же непонятно объяснено что лучше, подключать inc или использовать директиву _import_? В книге затрагивается этот момент, но что лучше так и не понятно. А именно при использовании _import нельзя компировать с параметрами -fwin32, но можно -fobj, который как написанно некоторые линковщики не возмут, и создается такое чуство, что так делать не стоит...
jershell рекомендую для начала немного поиспользовать масм32 и примеры изелиона попробуйте переписать программу с бумаги и сравнить с тем что набрал изелион "почувствуйте" синтаксис - навык не пропускать запятые, кавычки и прочие мелочи которые фатально влияют на работу программы после пересаживаетесь на ассемблер который вам больше нравиться и вникайте с помощью полученых навыков в тонкости его настройки всякими директивами
jershell будте внимательны к различному толкованию параметров в инструкциях как mov EAX,var - одни загружают значение другие адрес переменной в популярном здесь фасме mov EAX,var и lea EAX,var синонимы в том смысле что результат одинаковый
Rockphorr mov EAX, [var] и lea EAX, [var] ну а olly и ms отладчики мне помнится генерируют листинг масмоподобный. jershell Объясните пожалуйста, как так получается, что исходник вы читаете нормально, а тоже самое, только чуть-чуть преобразованное, не понимаете. Из этого можно сделать вывод, что откопав где-то (у кого-то) исходник вы сюда пришли за разъяснениями по программированию на ассемблере.