Такой вот код имеется: .386 .model flat, stdcall ExitProcess PROTO ,WORD MessageBoxA PROTO ,WORD, WORD, WORD, WORD .data MsgBoxCaption db 'fuck',0 MsgBoxText db 'shit',0 .const NULL equ 0 MB_OK equ 0 .code Main: INVOKE MessageBoxA, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK INVOKE ExitProcess, NULL end Main Разъясните новичку,пожалуйста,следующие нюансы: 1) зачем здесь строка .const ? Чето мне подсказывает.что это константный сегмент,но,имхо,я о таком не слышал.А знать хочется,что это. 2) Можно ли не писать каждый раз прото,а подключать функции апи как в рнр инклудом ? 3) Почему типы всех параметров апи функций месаджбокс и экзит процесс дворд ?! почему не куворд или творд? 4) Почему в конце данной программы не написано end ?! 5) MsgBoxCaption db 'fuck',0 .Эта запись означает запись двоичного нуля в конец строки.Что будет,если вместо 0 подставить что-нибудь ? Значение допишется к строке 'fuck' ?! Никогда не встречал такого(((. Собсно,данный пример не компилится,хотя автор этой статьи на xserver.ru походу утверждает,что она рабочая (на масм написана).Ошибки следующие: a.obj : error LNK2001: unresolved external symbol _ExitProcess@4 a.obj : error LNK2001: unresolved external symbol _MessageBoxA@16 C:\WinAsm\Projects\a.exe : fatal error LNK1120: 2 unresolved externals Какие-то неразрешённые внешние символы,но как всё это понять ? Ошибки,я так понял,происходят на стадии линковки.И что означают символы собаки и цифры рядышком ? Ну,третья строка лога ошибок просто походу подводит итог о количестве констант. Также фраза *допишите* юзер32.либ к конце строки транслятора мне непонятна.Как сделать так,чтобы заработал пример?(
1. поставьте MinGW 2. потому что MS Win код - корявый. 3. в мануалах ассемблера GCC/MinGW четко описано, какая область памяти - что делает, и за что отвечает. для начала - слить среду разработки с sf.net Ming толковые и нужные примеры. masm - кал.
0) в асме не шарю. 1) да это сегмент константных данных. 2) хз. -> 0) 3) потому что так устроен windows и его апи. 4) там какбы и asm в начале не написано. на сколько я знаю asm и end выделяют ту часть которая написана на чистом ассемблере, типа mov, pop и тд. без всяких invoke и других. на масме для win32 начинается с .386. 5)думаю оно допишется к строке и ещё куча мусора хранящаяся в памати, так как строка ansi должна заканчиваться двоичым нулём. возможно компайлер просто выдаст ошибку. 6) ошибки выдаёт т.к ты не подключил нужные библиотеки. делается как-то так: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib ... 7)после @ стоит размер параметра в стеке. п.с. если где-то ошибся, смотри пинкт 0).
altblitz, ответ поставьте мин гв вне конкуренции : )))).Таким макаром можно вообще среду менять как перчатки. Ответы типо хз ни о чём.За все возможные ответы по теме - большое спасибо.Мне,как новичку,это было необходимо.
Так,проблема с библами решена благодаря BrainDead.Господи,я перебрал всевозможные варианты и комбинации синтаксиса инклуда и инклудлиб,а оказывается,ошибка была в том,что я указал расширение инк,а не либ ХДД.Ппц,пакеты масм32 одинаковые(один с оффа,другой тоже,но у другого чела),но в одном расширения либ,а в другом - инк))).Всё-таки я добился своего))))))))))).Осталось только узнать,в какой либе лежит какая функция...
Все верно, это константа. Я не знаю что такое "рнр", но можно вынести все инклуды в отдельный файл. Например: File includes.inc: Затем в коде подключать (пример на фасме). Не обязательно WORD. Могло быть BYTE, DWORD, DQWORD и так далее. В даном случае используется ворд(одно слово). А как же "end Main"? Обозначает конец строки. В такой программе это не критично, но следует соблюдать это правило.
Я тоже хочу по умничать! ))) 3) есть такая штука как msdn идешь туда и вбиваешь нужную тебе функцию (там же можно и посмотреть как с ними работать) и в самом верху тебе будет написано Code: int WINAPI MessageBox( __in_opt HWND hWnd, __in_opt LPCTSTR lpText, __in_opt LPCTSTR lpCaption, __in UINT uType ); Library User32.lib DLL User32.dll что означает что функций возвращает int значение - а это 4 байта DWORD и лежит в user32.dll. Полезно в общем заглядывать в msdn, а пока читай "Туториалы Iczelion'а о Win32 API" ссылку на которые тебе уже не раз давали ) 4) потому что это не паскаль 5) система windows впрочем как и nix системы написана на языке Си, а в си строки заканчиваются нулевым битом.
Спасибо вам большое,но я уже раньше разобрался,а потом инет пропал аж на трое суток.Да,мсдн для меня открыл новые горизонты))),даже описание на русском иногда попадается. Но с недавнего времени перестал корректно работать такой код: Code: ..386 .model flat,stdcall includelib C:\winasm\masm32\lib\kernel32.lib includelib C:\winasm\masm32\lib\user32.lib include C:\winasm\masm32\include\kernel32.inc include C:\winasm\masm32\include\user32.inc .data res db 'ahah',0 .code start: INVOKE MessageBox,0,res,res,0 INVOKE ExitProcess,0 end start end Трансляция и компоновка проходят без ошибок,но в висте ЕХЕшнег закрывается с ошибкой,как будто бы процесс упал)).Раньше этот пример работал (. В качестве доказательства: C:\winasm\masm32\bin\ML /c /coff /Cp /nologo /I"C:\winasm\masm32\include" "C:\WinAsm\Projects\a.asm" Assembling: C:\WinAsm\Projects\a.asm C:\winasm\masm32\bin\Link @"C:\WinAsm\Projects\link.war" Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 "/LIBPATH:C:\winasm\masm32\lib" "C:\WinAsm\Projects\a.obj" "/OUT:C:\WinAsm\Projects\a.exe" Make finished. 0 error(s) occured.