flat assembler
Message board for the users of flat assembler.
Index
> Macroinstructions > Extended macro packet for FASMG. |
Author |
|
Dima1205 27 Jul 2024, 22:03
The macropackage is intended for significant simplification of application development on FASMG (I wrote analog package to FASM 1 - https://board.flatassembler.net/topic.php?t=22832) under the Windows platform - Win32 and Win64. Under Dos the package isn't realized yet, nevertheless implementation plans were as well under Windows 16 bit.
In special cases with the help the package was succeeded to achieve almost cross-platform development for Win32 and Win64 for a set of teams x86. Example of the code with this package such: Code: ; ------------------------------------------------------------------------------------- include 'win32a.inc' format PE GUI 3.10 ;include 'win64a.inc' ;format PE64 GUI 5.00 include 'CMACRO.inc' ACC fix eax ;Íóæíî äëÿ ðàáîòû óñëîâèé: char test1[]="C:\WINDOWS\*.exe" char test12[]="May I introduce myself?"; char buffer[260]; char szClassName [ ] = "CodeBlocksWindowsApp"; module kernel32,user32,shell32,advapi32,gdi32,crtdll #define black_color 0x000000 typedef _dword HANDLE,HINSTANCE,LPSTR HANDLE Kernel32_test; entry WinMain WinMain: GetModuleHandle("Kernel32"); mov [Kernel32_test],ACC GetCurrentDirectory(260,buffer); MessageBox(NULL,test12,buffer,MB_OK) ; <<< ôèãíþ ïèøåò SetCurrentDirectory("C:\"); GetCurrentDirectory(260,buffer); MessageBox(NULL,test12,buffer,MB_OK) ; <<< ôèãíþ ïèøåò ExitProcess(0) IMPORTTABLE Сам файл CMACRO.inc пока выглядит таким образом: Code: ;Macro defined to Generate simbol: ;MASM protez: offset equ UNICODE_CONST_FASM_LABEL equ ;Специальная константа - для многострочных комментариев: STR_C_POWER_MULTILINE_STRING_ULTIMAE_CONST equ ;Call macro constant - neded to use all macros: macro.ccapi equ 1 macro.capi equ 1 macro.invoke equ 1 macro.stdcall equ 1 macro.ccall equ 1 macro.cinvoke equ 1 macro.fastcall equ 1 ; Указываем, что макросы присвоения С обрабатывают до 260 символов: ;Это ограничение принято в языке С++. При необходимости предел можно расширить. argument_count equ 260 macro kwmacro val1,val2 val1 equ `val2 end macro ;Подключение модулей: macro module names& iterate name, names val equ \NAPI\name.inc match any,val kwmacro val1,any match any1,val1 include any1 end match end match end iterate end macro ;Директивы sizof - по умолчанию её нет - поэтому придется доопределять ;данные. ;Директивы sizeof по выбранным данным (нужно для програботки данных): sizeof.db equ 1 sizeof.dw equ 2 sizeof.du equ 2 sizeof.dd equ 4 sizeof.dp equ 6 sizeof.df equ 6 sizeof.dq equ 8 sizeof.dt equ 10 ;Исходные константы для резервирования данных: sizeof.rb equ 1 sizeof.rw equ 2 sizeof.rd equ 4 sizeof.rp equ 6 sizeof.rf equ 6 sizeof.rq equ 8 sizeof.rt equ 10 ;;Макрос - формирует указанный индентификатор из символов val и n, и сохраняет результат ;;в переменную name.Нужен для генерации идентификаторов: macro testequ ar,ar1*,ar2* match any,ar2 eval 'ar equ ',`ar1,`ar2 end match match , n ar equ ar1 end match end macro define FALSE 0 define TRUE 1 macro return n if n eq 0 xor ACC,ACC else mov ACC,n end if ret; end macro ;;макрос для работы с списками констант для препроцессора macro TConstList name name equ ;методы для работы с одномерными списками ;Добавляет элемент Item в конец списка macro name.Append item match any, name name equ name, item end match match , name name equ item end match end macro ;Добавляет элемент Item в начало списка macro name.Append item match any, name name equ name, item end match match , name name equ item end match end macro ;теперь для работы с многомерными списками ;Добавляет элементы Item в конец двухмерного списка macro name.AppendAr item match any, name name equ name,<item> end match match , name name equ <item> end match end macro ;Добавляет элемент Item в начало двухмерного списка macro name.ReverseAppendAr item match any, name name equ <item>,name end match match , name name equ <item> end match end macro end macro ;Создаём списки для генерации таблицы импорта: TConstList LibraryList TConstList LibraryLishref ;TConstList IncludeList TConstList CreaterFunctionCStyleCallList; Список нужен для активации с подобного синтаксиса при вызове функций: TConstList PurgeList ; Список нужен для выключения макросов, чтобы потом не быо проблем с импортом: ;;ниже макросс помогающий собрать секцию импорта macro PURGE names& iterate name, names PURGE name end iterate end macro macro IMPORTTABLE data import match any3, PurgeList PURGE any3 end match match any,LibraryList library any end match match any1,LibraryLishref iterate list_dll,any1 match any12,list_dll.List import any12 end match end iterate end match end data ;Добавляем таблицу перемещаемых элементов - нужна для работы в Win32s пакете data fixups end data end macro ;ниже расположены макроссы, которые позволяют упростить работу с таблицей импорта ;макрос lib обеспечивает подгрузку библиотек по имени macro lib names& iterate name, names LibraryList.Append name ;Формируем таким образом символ кавычки: kwmacro val1,name.dll match any1,val1 LibraryList.Append any1 end match end iterate end macro ; Макросы для автовызова данных: ;;Call macro from name - neded for use all algoritm: macro callmacro name,val& match any,name any val end match end macro macro capi name,parm& match any,parm TConstList ArgumentList irp item,any arg_append equ match =ccapi arg1,item ArgumentList.Append <cinvoke arg1> testequ name_call,A.,arg1 match any345,name_call callmacro any345 end match arg_append equ 1 end match match =capi arg1,item ArgumentList.Append <invoke arg1> testequ name_call,A.,arg1 match any345,name_call callmacro any345 end match arg_append equ 1 end match ; match ,arg_append ArgumentList.Append item end match end irp match ANY,ArgumentList F.name ANY end match ;Если аргументов нет - вызываем напрямую модуль: match ,parm F.name end match end match end macro macro ccapi name,parm& match any,parm TConstList ArgumentList irp item,any arg_append equ match =ccapi arg1,item ArgumentList.Append <cinvoke arg1> testequ name_call,A.,arg1 match any345,name_call callmacro any345 end match arg_append equ 1 end match match =capi arg1,item ArgumentList.Append <invoke arg1> testequ name_call,A.,arg1 match any345,name_call callmacro any345 end match arg_append equ 1 end match ; match ,arg_append ArgumentList.Append item end match end irp match ANY,ArgumentList CF.name ANY end match ;Если аргументов нет - вызываем напрямую модуль: match ,parm CF.name end match end match end macro ; ;Служебные мкросы: ;Макрос - для генерации библиотек импорта упрощенный: ; macro LibImportNew librty,args*& match any,librty any.list_n equ iterate <Proc1,Proc2>, args Proc1.list_n equ PURGE Proc1 macro.Proc1 equ 1 PurgeList.Append Proc1 macro Proc1 args6*& match (any31),args6 capi Proc1,any31 else match any34,args6 capi Proc1,any34 end match end macro macro A.Proc1 match ,any.list_n any.list_n equ 1 lib any LibraryLishref.Append any TConstList any.List any.List.Append any end match match ,Proc1.list_n Proc1.list_n equ 1 any.List.Append Proc1 any.List.Append Proc2 end match end macro ;CreaterFunctionCStyleCallList.Append Proc1 macro F.Proc1 args2*& invoke Proc1,args2; A.Proc1; end macro macro CF.Proc1 args2*& cinvoke Proc1,args2; A.Proc1; end macro end iterate end match end macro ; ; Аналог api макроса: ; macro API_N names& iterate name, names ;Nicaaai iaiaoiaeiua iia?aoee ni no?ieaie: match any,UNICODE_CONST_FASM_LABEL testequ val,name,W else match ,UNICODE_CONST_FASM_LABEL testequ val,name,A end match ;Nicaaai iae?inu ia iniiaa eciaiaiiie no?iee: match any1,val PURGE name macro.name equ 1 PurgeList.Append name macro name args1& any1 args1 end macro macro F.name args1& F.any1 args1 end macro macro CF.name args1& CF.any1 args1 end macro end match end iterate end macro ; ; ; Улучшенный механизм данных - дополняем размерностью автоматически: ; ; struc (name) db val& match any, val name db val end match match , val name db ? end match name.size = $ - . sizeof.name = sizeof.db end struc struc (name) du val& match any, val name du val end match match , val name du ? end match name.size = $ - . sizeof.name = sizeof.du end struc struc (name) dw val& match any, val name dw val end match match , val name dw ? end match name.size = $ - . sizeof.name = sizeof.dw end struc struc (name) dd val& match any, val name dd val end match match , val name dd ? end match name.size = $ - . sizeof.name = sizeof.dd end struc struc (name) dq val& match any, val name dq val end match match , val name dq ? end match name.size = $ - . sizeof.name = sizeof.dq end struc struc (name) df val& match any, val name df val end match match , val name df ? end match name.size = $ - . sizeof.name = sizeof.df end struc struc (name) dt val& match any, val name dt val end match match , val name dt ? end match name.size = $ - . sizeof.name = sizeof.dt end struc ; ;Улучшенный механизм резервирования данных: ; struc (name) rb val* name rb val name.size = val sizeof.name = val end struc struc (name) rw val* name rw val name.size = val sizeof.name = val end struc struc (name) rp val* name rp val name.size = val sizeof.name = val end struc struc (name) rd val* name rd val name.size = val sizeof.name = val end struc struc (name) rt val* name rt val name.size = val sizeof.name = val end struc struc (name) rq val* name rq val name.size = val sizeof.name = val end struc ; ; ; Simple to convert C developer to FASM!!! ; ; macro TypeGenerator elemets& iterate <Proc1,Proc2,Proc3>, elemets macro Proc1 names*& str_value equ match .rettur,names rettur1 equ rettur else rettur1 equ names end match ; match any,rettur1 match value temp,any match pref == str_value, temp ;Опредяем нуль-терминатор строки: match ='COM',format_name value Proc2 str_value,'$' else match ='MZ',format_name value Proc2 str_value,'$' else match any1567,format_name ; value Proc2 str_value,0 end match else match [ pref ], temp value Proc3 pref ; else err 'incorrect argument' end match else names Proc2 ? end match end match end macro end iterate end macro ; ; Генерируем промежуточные типы данных - нужны для того, что ; пользоваем: ; TypeGenerator _byte,db,rb TypeGenerator _word,dw,rw TypeGenerator _dword,dd,rd TypeGenerator _pword,dp,rp TypeGenerator _fword,df,rf TypeGenerator _qword,dq,rq TypeGenerator _tbyte,dt,rt TypeGenerator _tword,dt,rt ; ; А вот теперь пришла пора приделать остальные типы данных с языков высокого уровня!!! ; macro typedef elm& match base types,elm iterate type,types macro type v& base v end macro end iterate end match end macro ; ; Многострочные комментарии из языка СИ!!! ; calminstruction calminstruction?.initsym? variable*,value& publish variable, value end calminstruction calminstruction ? line& local multi,part,rest initsym multi,0 arrange part, arrange rest, check multi jno start match any? */ part?,line jno done all: compute multi,multi xor 1 clip: arrange line, part rest assemble line done: exit exit start: match // any?, line jyes done match part? /* any? */ rest?, line jyes clip match part? /* any?, line jyes all match part? // any?, line jyes clip assemble line end calminstruction ; ; ; Генерация типов данных для языков высокого уровня: ; ; typedef _byte char Пока это не весь пакет - скорость выполнения компиляции примера на FASMG оставляет желать лучшего. А вот для MS-DOS MZ уже нормально: Code: #include 'CMACRO.inc' format MZ ;??????????? ???? DOS EXE (MZ EXE) entry code_seg:start ;????? ????? /* Make the class name into a global variable */ char szClassName [ ] = "CodeBlocksWindowsApp"; char szClassName1 [567] #define black_color 0x000000 #define black_color 0x000000 segment code_seg ;??????? ???? start: ;?????? ?????????? ?????????? ????????? mov ax,data_seg ;\ mov ds,ax ;/ ????????????? ???????? DS mov ah,09h ;\ mov dx,Disk_editor_const ; > ????? ?????? int 21h ;/ mov ah,09h ;\ mov dx,Disk_editor_const2 ; > ????? ?????? int 21h mov ax,4C00h ;\ int 21h ;------------------------------------------------------- segment data_seg char Disk_editor_const[]='Disk editor test' char Disk_editor_const2[]='Disk editor test2' _________________ Best regards, Dmitry |
|||
27 Jul 2024, 22:03 |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.