Всем доброго времени суток. Возможно мой вопрос тупой, но очень хотелось бы наконец то разобраться и выйти на "прямую" дорогу в изучении Асма. Пробую что-нибудь накодить на Асме. Не могу понять, почему абсолютно ничего не получается, пример простейший хелло ворлд. Взял пример с вашего сайта (тема Win32ASM: "Hello, World" и три халявы MASM32) ,там написано что сие есть прога под вин32. Мои действия - создаю файл example.asm, загружаю его в Masm, жму build all. Предварительно меняю в коде пути к kernel32.lib и другому на свои, иначе выдает ошибку. Масм вроде все компилирует, создает файл exe. Пробую запускать ехе - не запускается. Через командную строку тоже не работает ничерта. Система - WinXp sp3 Подскажите пожалуйста, что я делаю не так? И вообще - с чего сейчас актуально изучать Асм под винду? Просто многие советуют уроки Калашникова, но это же Дос, какой смысл его сейчас учить? Первый пример Код (Text): ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; ПРОЦ, МОДЕЛЬ, ОПЦИИ, ИНКЛУДЫ, БИБЛИОТЕКИ ИМПОРТА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .386 .model flat,stdcall option casemap:none includelib kernel32.lib SetConsoleTitleA PROTO :DWORD GetStdHandle PROTO :DWORD WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD Sleep PROTO :DWORD ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОНСТАНТ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .const sConsoleTitle db 'My First Console Application',0 sWriteText db 'hEILo, Wo(R)LD!!' ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОДА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .code ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; Самая Главная Процедура ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Main PROC LOCAL hStdout :DWORD ;(1) ;титл консоли push offset sConsoleTitle ;(2) call SetConsoleTitleA ;получаем хэндл вывода ;(3) push -11 call GetStdHandle mov hStdout,EAX ;выводим HELLO, WORLD! ;(4) push 0 push 0 push 16d push offset sWriteText push hStdout call WriteConsoleA ;задержка, чтобы полюбоваться;(5) push 2000d call Sleep ;выход ;(6) push 0 call ExitProcess Main ENDP ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= end Main Второй код Код (Text): .386 .model flat,stdcall option casemap:none includelib kernel32.lib include windows.inc include kernel32.inc .const sConsoleTitle db 'My First Console Application',0 sWriteText db 'hEILo, Wo(R)LD!!' .code Main PROC LOCAL hStdout :DWORD invoke SetConsoleTitle, offset sConsoleTitle invoke GetStdHandle, STD_OUTPUT_HANDLE mov hStdout,EAX invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL invoke Sleep, 2000d invoke ExitProcess, NULL Main ENDP end Main
А вы не пробовали компилировать эти примеры так, как написано там, откуда вы их взяли. Код (Text): c:\tools\masm32\bin\ml /c /coff hello.asm c:\tools\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:c:\masm32\lib hello.obj
у калашникова надо учить асм, понятия регистров, памяти, стека, инструкций, а не прерывания дос. По поводу вопроса - тебе уже ответили, но уточню: скорее всего ты компилируешь как gui-приложение, а не как консольное. Поэтому консольные функции не отрабатывают. Читай мануалы внимательнее.
Ну что же, как известно, абсолютное большинство васмовцев - экстрасенсы. Видимо, всё дело в /SUBSYSTEM:CONSOLE, а Вы неудосужились проверить какие пераметры передаются линкеру. Жмите не build all а build console или как-то так.
Да, когда скомпилировал как консольное - все заработало). Спасибо всем большое за ответы и объяснения по теме!
Хочу еще, чисто для общего образования и развития спросить такое. Пример взят оттуда же (первая глава, Win32ASM: Минимальное приложение). Если скомпилировать сей код (причем не важно как, как гуи или как консоль), некоторые антивири видят в нем бэкдор (!). Вот отчет с вирустотала, если кто не верит http://www.virustotal.com/file-scan/report.html?id=e4163e12d3df995621d097481e733d40f636e28165d33d90c09252c32813aa96-1288731037 Мне очень интересно - почему так? в чем причина? Понятное дело, что никакого трояна тут нет, ибо кода как такого (то, что должна делать прога) нет вообще. Интересен сам факт такой реакции антивирусов. Код (Text): ;Сырец 1. Минимальное приложение на Assembler'e (minimal.asm) .386 .model flat,stdcall includelib kernel32.lib ExitProcess PROTO :DWORD .code WinMain PROC ;... push 0 call ExitProcess WinMain ENDP end WinMain
Маленький файл, маленький импорт, нет ресурсов... Антивирусы невероятные параноики. Просто не обращай на них внимание.
Разбираюсь понемогу с уроками iczelion'а, опять возникла неясная ошибка. Третий урок "Простое окно" http://wasm.ru/article.php?article=1001003 при попытке скомпилировать в Масме выдает такую ошибку: Подскажите пожалуйста, что это может быть?
Оказалось, что строку WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShowWORD Надо писать так как в примере, а не раздельно... Blackbeam, спасибо за ссылку.
Подскажите пожалуйста еще по такому вопросу. Есть код Код (Text): .model small .stack 100h .code start: mov ax,@data mov ds,ax mov es,ax lea si,text1 lea di,text2 cld mov cx,len_text1 repe cmpsb je sravnenie mov dx,offset mess_no mov ah,9 int 21h jmp exit sravnenie: mov dx,offset mess_ys mov ah,9 int 21h exit: mov ax,4c00h int 21h .data text1 db "ASM the Best" text2 db "ASM the Best" len_text1=$-text1 mess_no db "Stroki NE ravnu!",'$' mess_ys db "stroki ravnu!",'$' end start Почему-то упорно выводится, что "строки не равны" (mess_no), хотя должны быть равны. В чем может быть причина? Почти целый вечер сидел над кодом, но так и не разобрался. З.ы. интересно мнение опытных программистов - если человек в начале изучения Ассемблера сидит по полчаса над поиском мелкой ошибки (вида набирая код с книги, написал вместо ds dx), это нормально или свидетельствует о слабоумии?
'len_text1=$-text1' -- это длина обеих строк. Должно быть 'len_text1=text2-text1' -- это будет длина первой строки.
не правильно подсчитано len_text1 $ обозначает текущую строку. теперь смотри сколько у тебя байт между $ и text1 - туда влезают обе строки, поэтому сравнивается в 2 раза больше байт, чем нужно. правильно будет как-то так: Код (Text): text1 db "ASM the Best" len_text1=$-text1 text2 db "ASM the Best" len_text2=$-text2 Набирая с книги, а тем более копипастя может быть и нормально. Когда начнёшь свой код писать - будет более понятно что к чему.
M0rg0t Скачай и установи RADasm отсюда: http://radasm.cherrytree.at/wp-content/uploads/2010/03/radasm.zip Думаю, он пригодится. ))
dcLout, спасибо) У меня еще один вопрос. Есть еще один хелловорлд. Не могу понять - почему он не работает? Выдает опять же, кучу ошибок.. Код (Text): .386P .model flat,stdcall include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib ; Подключаем библиотеки includelib \masm32\lib\kernel32.lib .data hello_mess db "Первая программа под Windows на ассемблере", 0 hello_title db "Hello, World!", 0 .code start: push MB_OKCANCEL push offset hello_title push offset hello_mess push 0 call MessageBoxA push 0 call ExitProcess end start upd. разобрался. Оказывается, надо было добавить option casemap :none ; case sensitive