На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Для обсуждения создания операционных систем (ОС) используйте раздел Обсуждаем новые идеи.

3. Настоятельно рекомендую обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Перед созданием темы обязательно просмотрите FAQ раздела Assembler и Полезные ссылки.
  3.2. Правильно выбирайте подраздел (Общие вопросы/DOS, Windows/Unix, Hardware/not x86, RE/Protection), не делайте из форума свалку.
  3.3. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "В чём проблема?" будут отправляться в Корзину для мусора.
  3.4. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).

В каждом из подразделов могут быть дополнительные правила, но основные ПРАВИЛА ФОРУМА действуют везде!
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума - награждаться (DigiMoney и прочими радостями).

Приятного вам общения! ;)
Модераторы: Jin X, Qraizer
  
> fasm & dll, Почему не хочет подключаться длл-ка?
    Я надеюсь, есть знатоки fasm'a...

    Пишу:
    ExpandedWrap disabled
       
        ...
        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...

    Что делать?
      Скорее всего у тебя ошибка в функции OffFirst.
      Вот это работает на MASM'e:
      ExpandedWrap disabled
         
        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
      Сообщение отредактировано: Bjarne Stroustrup -
        Нет, дело не в этом. Я же говорю, так со всеми длл-ками. На фасме твой вариант все равно не работает.
        Кто такой генерал Фэйлор, и почему он читает мой диск?!
          Давай всю прогу (или напиши другую, с более безобидной функцией) и кинь сюда.
          У меня вообще какая-то хрень выходит при компиляции:
          ExpandedWrap disabled
              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.
          1 + 1 = 10
            все работает
            на тебе 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 Кбайт, скачиваний: 88)
              2 Jin X.
              Undefined symbol это ON_FIRST_TIME. Это у меня константа такая.
              2 500mhz
              Все равно не работает.

              Добавлено в :
              Вот вся прога:
              ExpandedWrap disabled
                 
                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
              Кто такой генерал Фэйлор, и почему он читает мой диск?!
                Попробуй так:
                ExpandedWrap disabled
                   
                  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 секции. В начале должны быть описание библиотек а потом таблицы функции.

                Всего доброго.
                Сообщение отредактировано: johnfound -
                  Цитата
                  Favst, 19.04.04, 17:24
                  Undefined symbol это ON_FIRST_TIME. Это у меня константа такая.
                  Ни фига, он не на неё ругается (да и убирал я её).
                  1 + 1 = 10
                    Вот ето у меня компилиться без всяких проблем в Fresh. В FASM тоже должно быть так, только я изпользую stdcallEx.inc макросы для proc. Но с "enter" тоже должно работать.
                    В програме есть глюки, но она вполне работает.
                    Кстати, "equ" оператор имеет особое значение в FASM-е и лучше не изпользуйте его. В 99% от случаев, надо изпользовавть "=" а не "equ".

                    ExpandedWrap disabled
                       
                      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'
                      Ладно, под win2000 все компилится... Вопрос в том, почему не работает под win98. И еще, как в 2000/xp получить доступ к LPT порту, в частности, узнать его адрес? Не считайте оффтопиком, это все из той же программы.
                        Цитата

                        И еще, как в 2000/xp получить доступ к LPT порту, в частности, узнать его адрес? Не считайте оффтопиком, это все из той же программы

                        адреса у LPT стандартные
                        дело в том, что при попытке выполнить команды IN и OUT из 3-го ринга, будет вызвано исключение, поэтому нужно работать через WinAPI (CreateFile, ReadFile и WriteFile)
                          Стандартные это 278, 378, 3BC? А как определить, какой из них использовать? Эта прога писалась под win98, под 2000 я юзал WinIo
                          WinIo
                          Только что-то хреново, посылаю ноль на все три адреса, а лампочки горят... Может, имеет значение, что куда заземлять (не успел проверить)? И как юзать через CreateFile?
                            Цитата

                            Только что-то хреново, посылаю ноль на все три адреса, а лампочки горят...

                            схему подключения и кусок проги

                            здесь, что касается DOS и Win9x

                            Здесь под Windows
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            [ Script Execution time: 0,1640 ]   [ 17 queries used ]   [ Generated: 25.06.16, 19:36 GMT ]  
                            Rambler's Top100