Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.79.60] |
|
Сообщ.
#1
,
|
|
|
Я надеюсь, есть знатоки fasm'a...
Пишу: ... invoke timeSetEvent, ON_FIRST_TIME, 00h, OffFirst, 00h, 1 ... section '.idata' import data readable library kernel32, 'kernel32.dll' include '%include%\apia\kernel32.inc' library user32, 'user32.dll' include '%include%\apia\user32.inc' library winmm, 'winmm.dll' import winmm, timeSetEvent, 'timeSetEvent' При выполнении прога вылетает: Цитата Программа FAU01C вызвала сбой при обращении к странице памяти в модуле <нет данных> по адресу 0000:000030e5. И так с любой длл-кой, кроме kernel32.inc user32.inc gdi32.inc comctl32.inc comdlg32.inc shell32.inc wsock32.inc... Что делать? |
Сообщ.
#2
,
|
|
|
Скорее всего у тебя ошибка в функции OffFirst.
Вот это работает на MASM'e: OffFirst proc arg1 :DWORD, arg2:DWORD, arg3 :DWORD, arg4 :DWORD, arg5 :DWORD jmp N Msg db "Hello from OffFirst!", 0 N: invoke MessageBox, 0, ADDR Msg, ADDR Msg, MB_OK ret 20 OffFirst endp ... ... invoke timeSetEvent, 3000, 00h, OffFirst, 00h, TIME_PERIODIC P.S. OffFirst у меня stdcall |
Сообщ.
#3
,
|
|
|
Нет, дело не в этом. Я же говорю, так со всеми длл-ками. На фасме твой вариант все равно не работает.
|
Сообщ.
#4
,
|
|
|
Давай всю прогу (или напиши другую, с более безобидной функцией) и кинь сюда.
У меня вообще какая-то хрень выходит при компиляции: invoke timeSetEvent, ON_FIRST_TIME, 00h, OffFirst, 00h, 1 macro/stdcall.inc [50] invoke [2]: stdcall [proc],arg macro/stdcall.inc [43] stdcall [1]: pushd arg error: undefined symbol. |
Сообщ.
#5
,
|
|
|
все работает
на тебе winmm.inc длдя фасма (сам делал) для импорта сделай к примеру файлик api.inc Цитата section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ crtdll,'crtdll.dll',\ USER32,'user32.dll',\ gdi32,'gdi32.dll',\ comctl32,'comctl32.dll',\ comdlg32,'comdlg32.dll',\ shell32,'shell32.dll',\ wsock32,'wsock32.dll',\ ddraw,'ddraw.dll',\ mapi,'mapi32.dll',\ opengl,'opengl32.dll',\ glu,'glu32.dll',\ advapi32,'advapi32',\ bass,'bass.dll',\ sdl,'sdl.dll',\ winmm,'winmm.dll' include '%fasminc%/apia/kernel32.inc' include '%fasminc%/apia/advapi32.inc' include '%fasminc%/apia/user32.inc' include '%fasminc%/apia/gdi32.inc' include '%fasminc%/apia/comctl32.inc' include '%fasminc%/apia/comdlg32.inc' include '%fasminc%/apia/shell32.inc' include '%fasminc%/apia/wsock32.inc' include '%fasminc%/apia/crtdll.inc' include '%fasminc%/apia/ddraw.inc' include '%fasminc%/apia/mapi.inc' include '%fasminc%/apia/opengl.inc' include '%fasminc%/apia/glu.inc' include '%fasminc%/apia/bass.inc' include '%fasminc%/apia/sdl.inc' include '%fasminc%/apia/winmm.inc' исходник будет так выглядеть Цитата format PE GUI entry start include '%fasminc%\win32a.inc' section '.code' code readable executable start: тут наш всякий код include 'api.inc' а тут автоматом импорт сгенерится без всякого гемороя Прикреплённый файлwinmm.rar (1.73 Кбайт, скачиваний: 155) |
Сообщ.
#6
,
|
|
|
2 Jin X.
Undefined symbol это ON_FIRST_TIME. Это у меня константа такая. 2 500mhz Все равно не работает. Добавлено в : Вот вся прога: format pe console entry lEntry include '%include%\win32a.inc' section '.data' data readable writeable hInput dd ? hOutput dd ? dwInputLength dd ? dwOutputLength dd ? sCommand rb 0FFh dwCommandLength dd ? sPrompt db 'command>' PROMPT_LENGTH equ 08h sOnFirst db '1+' sOnSecond db '2+' sOffFirst db '1-' sOffSecond db '2-' sQuit db 'quit' ON_FIRST_LENGTH equ 02h ON_SECOND_LENGTH equ 02h OFF_FIRST_LENGTH equ 02h OFF_SECOND_LENGTH equ 02h QUIT_LENGTH equ 04h sUnknownCommand db 'Error: Unknown command', 13, 10 UNKNOWN_COMMAND_LENGTH equ 18h ON_FIRST_TIME equ 3000 ON_SECOND_TIME equ 3000 TIME_SINGLE equ 00h section '.code' code readable executable lEntry: invoke GetStdHandle, STD_OUTPUT_HANDLE mov [hOutput], eax invoke GetStdHandle, STD_INPUT_HANDLE mov [hInput], eax lCommandCycleBegin: invoke WriteConsole, [hOutput], sPrompt, PROMPT_LENGTH, dwOutputLength, NULL invoke ReadConsole, [hInput], sCommand, 0FFh, dwCommandLength, NULL ;compare command mov ebx, [dwCommandLength] sub ebx, 02h ;'onfirst' cmp ebx, ON_FIRST_LENGTH jne @f stdcall CmpStr, sCommand, sOnFirst, ebx cmp eax, TRUE jne @f ;if 'onfirst' then call OnFirst invoke timeSetEvent, ON_FIRST_TIME, 00h, OffFirst, 00h, TIME_SINGLE jmp lCommandCycleBegin @@: ;'onsecond' cmp ebx, ON_SECOND_LENGTH jne @f stdcall CmpStr, sCommand, sOnSecond, ebx cmp eax, TRUE jne @f ;if 'onsecond' then call OnSecond jmp lCommandCycleBegin @@: ;'offfirst' cmp ebx, OFF_FIRST_LENGTH jne @f stdcall CmpStr, sCommand, sOffFirst, ebx cmp eax, TRUE jne @f ;if 'offfirst' then call OffFirst jmp lCommandCycleBegin @@: ;'offsecond' cmp ebx, OFF_SECOND_LENGTH jne @f stdcall CmpStr, sCommand, sOffSecond, ebx cmp eax, TRUE jne @f ;if 'offsecond' then call OffSecond jmp lCommandCycleBegin @@: ;'quit' cmp ebx, QUIT_LENGTH jne @f stdcall CmpStr, sCommand, sQuit, ebx cmp eax, TRUE jne @f ;if 'quit' then jmp lCommandCycleEnd @@: invoke WriteConsole, [hOutput], sUnknownCommand, UNKNOWN_COMMAND_LENGTH, dwOutputLength, NULL jmp lCommandCycleBegin lCommandCycleEnd: invoke ExitProcess, 00h proc CmpStr, lpsStr1, lpsStr2, dwLength enter push ebx push ecx push esi push edi mov esi, [lpsStr1] mov edi, [lpsStr2] mov ecx, [dwLength] @@: mov al, byte [esi] mov bl, byte [edi] cmp al, bl jne lNotEqual inc esi inc edi loop @b lEqual: mov eax, TRUE jmp @f lNotEqual: mov eax, FALSE @@: pop ebx pop ecx pop esi pop edi return proc OnFirst enter mov dx, 378h in al, dx or al, 10000000b out dx, al return proc OnSecond enter mov dx, 378h in al, dx or al, 01000000b out dx, al return proc OffFirst enter mov dx, 378h in al, dx and al, 01111111b out dx, al return proc OffSecond enter mov dx, 378h in al, dx and al, 10111111b out dx, al return section '.idata' import data readable library kernel32, 'kerneL32.dll' include '%include%\apia\kernel32.inc' library user32, 'user32.dll' include '%include%\apia\user32.inc' library winmm, 'WINMM.DLL' include '%include%\apia\winmm.inc' winmm.inc - от 500mhz |
Сообщ.
#7
,
|
|
|
Попробуй так:
section '.idata' import data readable library \ kernel32, 'kerneL32.dll', \ user32, 'user32.dll', \ winmm, 'WINMM.DLL' include '%include%\apia\kernel32.inc' include '%include%\apia\user32.inc' include '%include%\apia\winmm.inc' Ето кажеться связанно с форматом import секции. В начале должны быть описание библиотек а потом таблицы функции. Всего доброго. |
Сообщ.
#8
,
|
|
|
Цитата Ни фига, он не на неё ругается (да и убирал я её). Favst, 19.04.04, 17:24 Undefined symbol это ON_FIRST_TIME. Это у меня константа такая. |
Сообщ.
#9
,
|
|
|
Вот ето у меня компилиться без всяких проблем в Fresh. В FASM тоже должно быть так, только я изпользую stdcallEx.inc макросы для proc. Но с "enter" тоже должно работать.
В програме есть глюки, но она вполне работает. Кстати, "equ" оператор имеет особое значение в FASM-е и лучше не изпользуйте его. В 99% от случаев, надо изпользовавть "=" а не "equ". format pe console entry lEntry include '%finc%\win32\win32a.inc' section '.data' data readable writeable hInput dd ? hOutput dd ? dwInputLength dd ? dwOutputLength dd ? sCommand rb 0FFh dwCommandLength dd ? sPrompt db 'command>' PROMPT_LENGTH = 08h sOnFirst db '1+' sOnSecond db '2+' sOffFirst db '1-' sOffSecond db '2-' sQuit db 'quit' ON_FIRST_LENGTH = 02h ON_SECOND_LENGTH = 02h OFF_FIRST_LENGTH = 02h OFF_SECOND_LENGTH = 02h QUIT_LENGTH = 04h sUnknownCommand db 'Error: Unknown command', 13, 10 UNKNOWN_COMMAND_LENGTH = 18h ON_FIRST_TIME = 3000 ON_SECOND_TIME = 3000 TIME_SINGLE = 00h section '.code' code readable executable lEntry: invoke GetStdHandle, STD_OUTPUT_HANDLE mov [hOutput], eax invoke GetStdHandle, STD_INPUT_HANDLE mov [hInput], eax lCommandCycleBegin: invoke WriteConsole, [hOutput], sPrompt, PROMPT_LENGTH, dwOutputLength, NULL invoke ReadConsole, [hInput], sCommand, 0FFh, dwCommandLength, NULL ;compare command mov ebx, [dwCommandLength] sub ebx, 02h ;'onfirst' cmp ebx, ON_FIRST_LENGTH jne @f stdcall CmpStr, sCommand, sOnFirst, ebx cmp eax, TRUE jne @f ;if 'onfirst' then call OnFirst invoke timeSetEvent, ON_FIRST_TIME, 00h, OffFirst, 00h, TIME_SINGLE jmp lCommandCycleBegin @@: ;'onsecond' cmp ebx, ON_SECOND_LENGTH jne @f stdcall CmpStr, sCommand, sOnSecond, ebx cmp eax, TRUE jne @f ;if 'onsecond' then call OnSecond jmp lCommandCycleBegin @@: ;'offfirst' cmp ebx, OFF_FIRST_LENGTH jne @f stdcall CmpStr, sCommand, sOffFirst, ebx cmp eax, TRUE jne @f ;if 'offfirst' then call OffFirst jmp lCommandCycleBegin @@: ;'offsecond' cmp ebx, OFF_SECOND_LENGTH jne @f stdcall CmpStr, sCommand, sOffSecond, ebx cmp eax, TRUE jne @f ;if 'offsecond' then call OffSecond jmp lCommandCycleBegin @@: ;'quit' cmp ebx, QUIT_LENGTH jne @f stdcall CmpStr, sCommand, sQuit, ebx cmp eax, TRUE jne @f ;if 'quit' then jmp lCommandCycleEnd @@: invoke WriteConsole, [hOutput], sUnknownCommand, UNKNOWN_COMMAND_LENGTH, dwOutputLength, NULL jmp lCommandCycleBegin lCommandCycleEnd: invoke ExitProcess, 00h proc CmpStr, lpsStr1, lpsStr2, dwLength begin push ebx push ecx push esi push edi mov esi, [lpsStr1] mov edi, [lpsStr2] mov ecx, [dwLength] @@: mov al, byte [esi] mov bl, byte [edi] cmp al, bl jne lNotEqual inc esi inc edi loop @b lEqual: mov eax, TRUE jmp @f lNotEqual: mov eax, FALSE @@: pop ebx pop ecx pop esi pop edi return endp proc OnFirst begin mov dx, 378h in al, dx or al, 10000000b out dx, al return endp proc OnSecond begin mov dx, 378h in al, dx or al, 01000000b out dx, al return endp proc OffFirst begin mov dx, 378h in al, dx and al, 01111111b out dx, al return endp proc OffSecond begin mov dx, 378h in al, dx and al, 10111111b out dx, al return endp section '.idata' import data readable library kernel32, 'kerneL32.dll', \ user32, 'user32.dll', \ winmm, 'WINMM.DLL' include '%finc%\win32\apia\kernel32.inc' include '%finc%\win32\apia\user32.inc' include '%finc%\win32\apia\winmm.inc' |
Сообщ.
#10
,
|
|
|
Ладно, под win2000 все компилится... Вопрос в том, почему не работает под win98. И еще, как в 2000/xp получить доступ к LPT порту, в частности, узнать его адрес? Не считайте оффтопиком, это все из той же программы.
|
Сообщ.
#11
,
|
|
|
Цитата И еще, как в 2000/xp получить доступ к LPT порту, в частности, узнать его адрес? Не считайте оффтопиком, это все из той же программы адреса у LPT стандартные дело в том, что при попытке выполнить команды IN и OUT из 3-го ринга, будет вызвано исключение, поэтому нужно работать через WinAPI (CreateFile, ReadFile и WriteFile) |
Сообщ.
#12
,
|
|
|
Стандартные это 278, 378, 3BC? А как определить, какой из них использовать? Эта прога писалась под win98, под 2000 я юзал WinIo
WinIo Только что-то хреново, посылаю ноль на все три адреса, а лампочки горят... Может, имеет значение, что куда заземлять (не успел проверить)? И как юзать через CreateFile? |
Сообщ.
#13
,
|
|
|
Цитата Только что-то хреново, посылаю ноль на все три адреса, а лампочки горят... схему подключения и кусок проги здесь, что касается DOS и Win9x Здесь под Windows |