например, вот макрос чтобы компилировать строки вида: ExitProcess(GetLastError()) ExitProcess(MessageBox(0,"caption","text",0)) количество вложеных функций любое, всё сделано рекурсией на стадии препроцессинга. Этот кусок кода делает имена всех АПИ функций в папке include\APIA\*.inc макросами. Код (Text): include "fasmMacroLib\hllToAllFunc\hllToFunc.inc" macro import garbage,[p1,p2] { hllToFunc p1 } include 'apia/kernel32.inc' include 'apia/user32.inc' include 'apia/gdi32.inc' include 'apia/advapi32.inc' include 'apia/comctl32.inc' include 'apia/comdlg32.inc' include 'apia/shell32.inc' include 'apia/wsock32.inc' purge import в аттаче файл hllToFunc.inc . Если у кого есть какие то интересные макросы просьба выложить, для пользы общества. Сам макрос сделан по тупому, надеюсь потом доработать. Тупизм вот в чём, я не знаю зачем вообще в строке: ExitProcess(MessageBox(0,"caption","text",0)) аж две )). Мой макрос понимает и такую строку: ExitProcess(MessageBox(0,"caption","text",0) и такую: ExitProcess(MessageBox(0,"caption","text",0)))))))))))))))))) я надеюсь потом это исправить.
переделал немного макрос. теперь всё должно быть строго: ExitProcess(MessageBox(0,"caption","text",0)))))))))))))))))) - выдаст сообщение о несоответствии "(" и ")". и теперь всё в одном файле. Его надо просто подключить и всё. Все АПИ можно вызывать как в ХЛА, АПИ(ПАРАМЕТРЫ). Причём параметром может быть вложеная функция. АПИ(АПИ(аргументы),аргументы) кол-во вложеный функций неограничено. теперь делаю что то вроде таково: Код (Text): format PE Console .data hModule dd ? .code EntryPoint: hModule := GetModuleHandle(0) hModule := invoke GetModuleHandle,0 .end EntryPoint как до конца доделаю выложу.
вот немного переделал. теперь понимает и процедуры. только до того как вызывать процедуру в виде: имя_процедуры(параметры), надо добавить имя процедуры к макросам. сделать это можно так: hllToProc имя_процедуры1,имя_процедуры2,... по идее, в фасме, большой разницы между метками и процедурами я не вижу, так что можно добавлять и метки. типа этого: Код (Text): hllToProc EntryPoint .code EntryPoint: EntryPoint(0);толкнём 0 и вызовем EntryPoint. + немного переделал алгоритм, теперь должно быть намного быстрее(и не должно быть конфликтом с другими макросами).
переделал всё заново. теперь должно всё работать замечательно, просто. В архиве находиться: main.inc hllToFucn.inc listOfFunctions.inc msvcrt.inc pushd.inc и папка examples. теперь как мне кажеться всё стало намного проще, в плане использования этих макросов. Эта версия маросов должна использоваться только с версией фасма 1.67.14 и ВЫШЕ. в папке examples можно найти несколько простых примеров. В будущем надеюсь её дополнить. Вообще то макросы эти создавались для использования с win32a(w)x,но их можно использовать и с win32a(w). что для этого надо сделать можно прочитать в файле main.inc(правда на английском) в listOfFunctions.inc можно добавлять свои функции и процедуры. Если есть какие то ошибки или предложения, то пишите или сюда, или мне на мыло.
kernel32.inc Код (Text): api AddAtom,\ AddConsoleAlias,\ BeginUpdateResource,\ таких строчек, не было в 1.67.7 вот топик: http://board.flatassembler.net/topic.php?t=6051
переделал по другому принципу(теперь макросы универсальны, и всё в двух файлах.) подробности тут: http://board.flatassembler.net/topic.php?t=6407
по умолчанию, на все апи, что есть в папке \API,стоит invoke. но никто не мешает поставить, к примеру на wsprintf cinvoke. Код (Text): format PE Console include "win32ax.inc" include "HLA\syntax.inc" hllToFuncProcEx wsprintf:cinvoke ;we have invoke by default. .data string db 20 DUP(?) .code EntryPoint: wsprintf(string,"%d %X",100,100) ;-> cinvoke wsprintf,<string>,<'%d %X'>,<100>,<100> MessageBox(0,string,"See",0) ExitProcess(0) .end EntryPoint так что можно сказать, что настраиваються.