Откомпиленный masm-ом экзешник не запускается

Тема в разделе "WASM.BEGINNERS", создана пользователем Psixo, 7 апр 2006.

  1. Psixo

    Psixo New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    14
    Давно не трогал масм,все на С и Перле кодил,но сейчас возникла необходимость использовать масм,но возникла проблема... сам код компилится,но экзе не запускается,я думал где в коде косяки... а потом взял забил простеший вариант для проверки:
    Код (Text):
    1.  
    2. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    3. ;        ПРОЦ, МОДЕЛЬ, ОПЦИИ, ИНКЛУДЫ, БИБЛИОТЕКИ ИМПОРТА
    4. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    5.  
    6.  .386
    7.  .model flat,stdcall
    8. option casemap:none
    9.  
    10. includelib kernel32.lib
    11.  
    12. SetConsoleTitleA PROTO :DWORD
    13. GetStdHandle PROTO     :DWORD
    14. WriteConsoleA PROTO    :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    15. ExitProcess PROTO      :DWORD
    16. Sleep PROTO            :DWORD
    17.  
    18.  
    19. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    20. ;                         СЕКЦИЯ КОНСТАНТ
    21. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    22.  
    23.  .const
    24.  
    25. sConsoleTitle  db 'My First Console Application',0
    26. sWriteText  db 'hEILo, Wo(R)LD!!'
    27.  
    28. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    29. ;                          СЕКЦИЯ КОДА
    30. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    31.  
    32.  .code
    33.  
    34. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    35. ;                    Самая Главная Процедура
    36. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    37.  
    38. Main PROC
    39.   LOCAL hStdout :DWORD        ;(1)
    40.  
    41.   ;титл консоли
    42.   push offset sConsoleTitle   ;(2)
    43.   call SetConsoleTitleA
    44.  
    45.   ;получаем хэндл вывода      ;(3)
    46.   push -11
    47.   call GetStdHandle
    48.   mov hStdout,EAX
    49.  
    50.   ;выводим HELLO, WORLD!      ;(4)
    51.   push 0
    52.   push 0
    53.   push 16d
    54.   push offset sWriteText
    55.   push hStdout
    56.   call WriteConsoleA
    57.  
    58.   ;задержка, чтобы полюбоваться ;(5)
    59.   push 2000d
    60.   call Sleep
    61.  
    62.   ;выход                       ;(6)
    63.   push 0
    64.   call ExitProcess
    65.  
    66. Main ENDP
    67.  
    68. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    69.  
    70. end Main
    71.  
    72.  




    Знакомый код :)) не правда ли ;)



    Но суть в том что все делается,компилится,без проблем,ошибок нет,да вот не запускается :dntknw:

    Пробовал поставить длинный Sleep в итоге окна консоли так и не вижу,хотя в процессах прога висит.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Естественно ничего не заработает как надо - ты же консоль не создаешь. То есть будет выглядеть так:
    Код (Text):
    1.  
    2. ...
    3. Main PROC
    4.   LOCAL hStdout :DWORD        ;(1)
    5.  
    6.   call FreeConsole
    7.   call AllocConsole
    8. ...
    9.  


    Ну и не забудь добавить прототипы этих функций (они из kernel32.dll):
    Код (Text):
    1.  
    2. FreeConsole PROTO
    3. AllocConsole PROTO
    4.  
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Либо компилируй с ключом /SUBSYSTEM:CONSOLE.
     
  4. Psixo

    Psixo New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    14
    mix_mix,если вставить те функции которые ты указал,то все работает без проблем,да вот меня интересует почему у меня все тестовые примеры в RadAsm-е компилятся без ошибок,но окно приложения при запуске не появляется... А исходник я взял на вскидку, для проверки, из статьи:

    Win32ASM: "Hello, World" и три халявы MASM32 [Serrgio / HI-TECH]



    А теперь еще один вариант:


    Код (Text):
    1.  
    2. .386
    3.  .model flat,stdcall
    4. option casemap:none
    5.  
    6. includelib kernel32.lib
    7. include windows.inc
    8. include kernel32.inc
    9.  
    10.  .const
    11.  
    12. sConsoleTitle db 'My First Console Application',0
    13. sWriteText db 'hEILo, Wo(R)LD!!'
    14.  
    15.  .code
    16.  
    17. Main PROC
    18.   LOCAL hStdout :DWORD
    19.  
    20.   invoke SetConsoleTitle, offset sConsoleTitle
    21.   invoke GetStdHandle, STD_OUTPUT_HANDLE
    22.   mov hStdout,EAX
    23.   invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL
    24.   invoke Sleep, 2000d
    25.   invoke ExitProcess, NULL
    26.  
    27. Main ENDP
    28.  
    29. end Main
    30.  
    31.  




    Ключи для компиляции:

    c:\masm32\bin\ml /c /coff c:\masm32\test1.asm

    c:\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:c:\masm32\lib c:\masm32\test1.obj



    А результат все тот же, подвисание курсора на 2 секунды без появления консоли... вот такие пироги,или я гдето сглупил или все же есть в чем-то не моя вина...
     
  5. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Для подобных случаев (чтобы постоянно не писать в форум) существует следущий код:
    Код (Text):
    1.  
    2. include \masm32\include\masm32.inc
    3. includelib \masm32\lib\masm32.lib
    4. buf db 8 dup(0)
    5. ...
    6. invoke WriteConsole ... ; <- функция, которая неправильно работает
    7. ...
    8. invoke GetLastError
    9. invoke dw2a,eax,offset buf
    10. invoke MessageBox,0,offset buf,0,0
    11. ...
    12.  


    Далее из MSDN в system error codes находишь что за ошибку подразумевает код.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Для подобных случаев существует отладчик.
     
  7. Psixo

    Psixo New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    14
    Скажем так,дебаг показал что в результате вызова:

    invoke GetStdHandle, STD_OUTPUT_HANDLE



    Появляется ошибка:

    ERROR_INVALID_HANDLE (00000006)



    Насколько я помню,понять от чего возникает эта ошибка,оч. частно тяжело,я уже умаялся... MSDN,ответа толкового не дал,увы.



    П.С.: на форуме это все постится лишь с одной целью,разобраться, и при этом подрозумевается что более опытный человек тебе может помочь,по крайне мере я всегда исходил из этого...
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Psixo



    Всё указывает на то, что приложение не запускается как консольное, хотя я вижу, что флаг "/SUBSYSTEM:CONSOLE" указан. Посмотрите в PE Tools -> PE Editor или в любом другом вьювере/редакторе экзешников установлен ли флаг консоли в заголовке PE или нет.
     
  9. Psixo

    Psixo New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    14
    Поставил последнию версию masm32v9, раньше стояла 6-ая версия,теперь оконные приложения работают корректно,а консольные вроде,этого без вызова:

    FreeConsole и AllocConsole не работают,но мне сейчас уже это как-то безразлично,главаное заработало(хоть как-то!). Всем откликнувшимся спасибо.