Не запускается простейшая программа под вин - в чем может быть ошибка?

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 1 ноя 2010.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Всем доброго времени суток. Возможно мой вопрос тупой, но очень хотелось бы наконец то разобраться и выйти на "прямую" дорогу в изучении Асма.

    Пробую что-нибудь накодить на Асме. Не могу понять, почему абсолютно ничего не получается, пример простейший хелло ворлд.
    Взял пример с вашего сайта (тема Win32ASM: "Hello, World" и три халявы MASM32) ,там написано что сие есть прога под вин32.

    Мои действия - создаю файл example.asm, загружаю его в Masm, жму build all. Предварительно меняю в коде пути к kernel32.lib и другому на свои, иначе выдает ошибку. Масм вроде все компилирует, создает файл exe. Пробую запускать ехе - не запускается. Через командную строку тоже не работает ничерта. Система - WinXp sp3

    Подскажите пожалуйста, что я делаю не так? И вообще - с чего сейчас актуально изучать Асм под винду? Просто многие советуют уроки Калашникова, но это же Дос, какой смысл его сейчас учить?

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

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    А вы не пробовали компилировать эти примеры так, как написано там, откуда вы их взяли.

    Код (Text):
    1. c:\tools\masm32\bin\ml /c /coff hello.asm
    2. c:\tools\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:c:\masm32\lib hello.obj
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    у калашникова надо учить асм, понятия регистров, памяти, стека, инструкций, а не прерывания дос.

    По поводу вопроса - тебе уже ответили, но уточню: скорее всего ты компилируешь как gui-приложение, а не как консольное. Поэтому консольные функции не отрабатывают. Читай мануалы внимательнее.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну что же, как известно, абсолютное большинство васмовцев - экстрасенсы. Видимо, всё дело в /SUBSYSTEM:CONSOLE, а Вы неудосужились проверить какие пераметры передаются линкеру.
    Жмите не build all а build console или как-то так.
     
  5. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Да, когда скомпилировал как консольное - все заработало).
    Спасибо всем большое за ответы и объяснения по теме!
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
  7. v_over

    v_over New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    18
    Я начал изучать азм с тетриса под вин, чего и всем другим советую.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    v_over
    И как успехи? Объясните, скажем, в двух словах, как передаются параметры через стек.
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Хочу еще, чисто для общего образования и развития спросить такое. Пример взят оттуда же (первая глава, Win32ASM: Минимальное приложение). Если скомпилировать сей код (причем не важно как, как гуи или как консоль), некоторые антивири видят в нем бэкдор (!). Вот отчет с вирустотала, если кто не верит http://www.virustotal.com/file-scan/report.html?id=e4163e12d3df995621d097481e733d40f636e28165d33d90c09252c32813aa96-1288731037

    Мне очень интересно - почему так? в чем причина? Понятное дело, что никакого трояна тут нет, ибо кода как такого (то, что должна делать прога) нет вообще. Интересен сам факт такой реакции антивирусов.


    Код (Text):
    1. ;Сырец 1. Минимальное приложение на Assembler'e (minimal.asm)
    2.  
    3.  .386
    4.  .model flat,stdcall
    5.  
    6. includelib kernel32.lib
    7.  
    8. ExitProcess PROTO :DWORD
    9.  
    10.  .code
    11.  
    12. WinMain PROC
    13.  ;...
    14.  push 0
    15.  call ExitProcess
    16. WinMain ENDP
    17.  
    18. end WinMain
     
  10. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Это твоя главная ошибка. Первые программы компилировать нужно вручную - через командную строку.
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Маленький файл, маленький импорт, нет ресурсов... Антивирусы невероятные параноики. Просто не обращай на них внимание.
     
  12. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Разбираюсь понемогу с уроками iczelion'а, опять возникла неясная ошибка. Третий урок "Простое окно" http://wasm.ru/article.php?article=1001003 при попытке скомпилировать в Масме выдает такую ошибку:
    [​IMG]

    Подскажите пожалуйста, что это может быть?
     
  13. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    http://blackbeam.narod.ru/asm.htm
     
  14. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Оказалось, что строку
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:lol: WORD
    Надо писать так как в примере, а не раздельно...

    Blackbeam, спасибо за ссылку.
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Подскажите пожалуйста еще по такому вопросу. Есть код

    Код (Text):
    1. .model small
    2.     .stack 100h
    3.     .code
    4. start:
    5.     mov ax,@data
    6.     mov ds,ax
    7.     mov es,ax
    8.     lea si,text1
    9.     lea di,text2
    10.     cld
    11.     mov cx,len_text1
    12.     repe cmpsb
    13.     je sravnenie
    14.      
    15.     mov dx,offset mess_no
    16.     mov ah,9
    17.     int 21h
    18.     jmp exit
    19.    
    20. sravnenie:
    21.     mov dx,offset mess_ys
    22.     mov ah,9
    23.     int 21h
    24.  
    25. exit:
    26.     mov ax,4c00h
    27.     int 21h
    28.  
    29.     .data
    30. text1   db "ASM the Best"
    31. text2   db "ASM the Best"
    32. len_text1=$-text1
    33. mess_no db "Stroki NE ravnu!",'$'
    34. mess_ys db "stroki ravnu!",'$'
    35. end start
    Почему-то упорно выводится, что "строки не равны" (mess_no), хотя должны быть равны. В чем может быть причина? Почти целый вечер сидел над кодом, но так и не разобрался.

    З.ы. интересно мнение опытных программистов - если человек в начале изучения Ассемблера сидит по полчаса над поиском мелкой ошибки (вида набирая код с книги, написал вместо ds dx), это нормально или свидетельствует о слабоумии?
     
  16. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    'len_text1=$-text1' -- это длина обеих строк. Должно быть 'len_text1=text2-text1' -- это будет длина первой строки.
     
  17. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    не правильно подсчитано len_text1
    $ обозначает текущую строку.
    теперь смотри сколько у тебя байт между $ и text1 - туда влезают обе строки, поэтому сравнивается в 2 раза больше байт, чем нужно. правильно будет как-то так:
    Код (Text):
    1. text1   db "ASM the Best"
    2. len_text1=$-text1
    3. text2   db "ASM the Best"
    4. len_text2=$-text2
    Набирая с книги, а тем более копипастя может быть и нормально. Когда начнёшь свой код писать - будет более понятно что к чему.
     
  18. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Mika0x65, krabz
    Спасибо! Так все заработало как надо.
     
  19. dcLout

    dcLout New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2010
    Сообщения:
    47
    M0rg0t

    Скачай и установи RADasm отсюда:
    http://radasm.cherrytree.at/wp-content/uploads/2010/03/radasm.zip

    Думаю, он пригодится. ))
     
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    dcLout, спасибо)

    У меня еще один вопрос. Есть еще один хелловорлд. Не могу понять - почему он не работает? Выдает опять же, кучу ошибок..

    Код (Text):
    1.     .386P
    2.     .model  flat,stdcall
    3.  
    4. include \masm32\include\windows.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\kernel32.inc
    7.  
    8. includelib \masm32\lib\user32.lib     ; Подключаем библиотеки
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11.     .data
    12. hello_mess  db "Первая программа под Windows на ассемблере", 0
    13. hello_title db "Hello, World!", 0
    14.  
    15.     .code
    16. start:
    17.     push    MB_OKCANCEL
    18.     push    offset hello_title
    19.     push    offset hello_mess
    20.     push    0
    21.     call    MessageBoxA
    22.     push    0
    23.     call    ExitProcess
    24.  
    25.     end start
    upd. разобрался. Оказывается, надо было добавить
    option casemap :none ; case sensitive