Код (Text): include '%fasm%\win32ax.inc' start: ccall [mciSendString],_cmd_eject,0,0,0 cinvoke mciSendString,_cmd_close,0,0,0 stdcall [ExitProcess],0 _cmd_eject db 'set cdaudio door open',0 _cmd_close db 'set cdaudio door closed',0 data import library kernel32,'KERNEL32.DLL',winmm,'WINMM.DLL' import winmm,mciSendString,'mciSendStringA' include '%fasm%\api\kernel32.inc' end data А есть ли ограничения какие-то для call, invoke... Всмысле работает вроде полюбому, но зачем тогда? Кстати, на что нужны секции ежели без этого код даже меньше получает!? Я сначала оставлял только '.code', но в какой-то момент подглюкивать стало, пришлось изолировать в '.data' пока вообще не допилил, что их оба можно кильнуть Ещё хотел было include '%fasm%\api\kernel32.inc' в начале включить, как и положенно в си языках, однако что это в data import валидно только?
call это комманда а invoke это макрос. Ну секции нужны чтобы определить где у тя рессурсы где импор где отладочная информация итд. Так же они участвуют в загрузке exe.
Долго думал, что же ты имеешь в виду Да, валидно только в импорте. Ты сам посмотри что находиться в kernel32.inc.
ccall и stdcall нужны для вызова соответствующих процедур в программе. invoke и cinvoke - для импортируемых функций. все просто. неправда, invoke x компилирутся так же, как и stdcall [x], аналогично с ccall. vover Тут про макрос ccall, а не команду call.
без секций код короче, и в них наверное нет необходимости, но наверное для больших приложений это надо для порядка в ущерб 0,5 кб. 2. я имел ввиду, чтоесть ли неподдерживаемые функции, всмысле не сишные в виндоус? или же макрос сам их контролирует, типа что если я вместо call вызову ccall там где это не валидно? или попрёт!
Это потому, что не тратится место на выравнивание (секции выравниваются по 512 байтной границе). Нужны в основном в целях безопасности, чтобы нельзя было записывать в секцию, где должны быть одни константы. Да и многие программисты просто педанты и им нравиться раскладывать данные по "полочкам". ccall - это макрос, который компилятор разворачиват в код, который, естественно, будет валиден везде, где поддерживаются данные опкоды. ccall GetSomeInfo,eax,ebx,ecx - развернётся в push ecx push ebx push eax call GetSomeInfo (если быть точным, то call 00445566)
Z3N Увы, как раз многие программисты далеко не педанты, если взглянуть на большую часть гoвнокода, что можно найти в инете. Нормальный код, где все грамотно на своих местах, а исключения хорошо аргументированы, увы, встречается очень редко. Из 10 просмотренных мною за последние 3 дня исходников только 2 оказались удовлетворительно-читабельными =) Причем исходники совершенно разных людей из совершенно разных областей и эти люди в них далеко не новички. Ой что-то меня понесло) На сим закончу. Неправда =)