flat assembler
Message board for the users of flat assembler.
Index
> Macroinstructions > Extended macro packet for FASM. FASM almost like in C |
Author |
|
Dima1205 05 Jul 2023, 19:28
The macropackage is intended for significant simplification of application development on FASM 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: format PE GUI 3.1 entry start include 'Win32M.inc' _class TCHAR 'FASMWIN32',0 _title TCHAR 'Win32 program template',0 _error TCHAR 'Startup failed.',0 wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class msg MSG start: movv [wc.hInstance],GetModuleHandleA,0 movv [wc.hIcon],LoadIconA,0,IDI_APPLICATION movv [wc.hCursor],LoadCursorA,0,IDC_ARROW _IF RegisterClassA(wc) ==0 capi MessageBoxA,NULL,_error,NULL,MB_ICONERROR+MB_OK _END _IF capi CreateWindowExA,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL == 0 capi MessageBoxA,NULL,_error,NULL,MB_ICONERROR+MB_OK _ENDIF _WHILE GetMessageA,msg,NULL,0,0 != 0 capi TranslateMessage,msg capi DispatchMessageA,msg _ENDW end_loop: capi ExitProcess,[msg.wParam] proc WindowProc hwnd,wmsg,wparam,lparam _IF [wmsg]==WM_DESTROY capi PostQuitMessage,0 return FALSE; _ELSE capi DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]; _ENDIF ret endp IMPORTTABLE The sample folder contains examples of the use of this macro package.
_________________ Best regards, Dmitry Last edited by Dima1205 on 06 Jul 2023, 22:32; edited 1 time in total |
|||||||||||
05 Jul 2023, 19:28 |
|
luboput 06 Jul 2023, 22:18
IF fix .if
.. ENDIF fix .endif и не надо макроса |
|||
06 Jul 2023, 22:18 |
|
Dima1205 06 Jul 2023, 22:28
It`s don`t work:
Code: .if invoke RegisterClassA,wc ==0 capi MessageBoxA,NULL,_error,NULL,MB_ICONERROR+MB_OK .endif It`s correct work: Code: _IF RegisterClassA(wc) ==0 capi MessageBoxA,NULL,_error,NULL,MB_ICONERROR+MB_OK _END So that in the condition you can write the invoke call, I write these macros. _________________ Best regards, Dmitry |
|||
06 Jul 2023, 22:28 |
|
Dima1205 06 Jul 2023, 22:41
Update macros, include FOREACH maco
|
|||
06 Jul 2023, 22:41 |
|
luboput 07 Jul 2023, 01:11
понял
;------------------- у меня DIALOG.asm example not work - Error illegal instruction (_IF msg==WM_INITDIALOG)
|
||||||||||
07 Jul 2023, 01:11 |
|
Dima1205 07 Jul 2023, 13:52
Okey, I fixed error:
Code: ;DialogBox example format PE GUI 3.1 include 'Win32M.inc' ;format PE64 GUI 5.0 ;include 'Win64M.inc' ID_CAPTION = 101 ID_MESSAGE = 102 ID_ICONERROR = 201 ID_ICONINFORMATION = 202 ID_ICONQUESTION = 203 ID_ICONWARNING = 204 ID_TOPMOST = 301 section '.text' code readable executable EntryMain start capi GetModuleHandleA,0 _IF -1 == capi DialogBoxParamA,eax,37,HWND_DESKTOP,DialogProc,0 capi MessageBoxA,HWND_DESKTOP,message,caption,[flags] _END capi ExitProcess,0 proc DialogProc hwnddlg,msg,wparam,lparam ;push ebx esi edi correct 0,hwnddlg,msg,wparam,lparam _IF [msg]== WM_INITDIALOG capi CheckRadioButton,[hwnddlg],ID_ICONERROR,ID_ICONWARNING,ID_ICONINFORMATION return TRUE; _ELSE_IF [msg]==WM_COMMAND _IF [wparam]==BN_CLICKED shl 16 + IDCANCEL jmp close_dlg _ELSE_IF [wparam]==BN_CLICKED shl 16 + IDOK capi GetDlgItemTextA,[hwnddlg],ID_CAPTION,caption,40h capi GetDlgItemTextA,[hwnddlg],ID_MESSAGE,message,100h mov [flags],MB_OK _ENDIF return TRUE; _ELSE_IF [msg]==WM_CLOSE close_dlg: capi EndDialog,[hwnddlg],0 _ELSE return FALSE; _ENDIF ;pop edi esi ebx ret endp section '.bss' readable writeable flags dd ? caption rb 40h message rb 100h IMPORTTABLE section '.rsrc' resource data readable directory RT_DIALOG,dialogs resource dialogs,\ 37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration dialog demonstration,'Create message box',70,70,190,175,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME dialogitem 'STATIC','&Caption:',-1,10,10,70,8,WS_VISIBLE dialogitem 'EDIT','',ID_CAPTION,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP dialogitem 'STATIC','&Message:',-1,10,40,70,8,WS_VISIBLE dialogitem 'EDIT','',ID_MESSAGE,10,50,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL dialogitem 'BUTTON','&Icon',-1,10,70,80,70,WS_VISIBLE+BS_GROUPBOX dialogitem 'BUTTON','&Error',ID_ICONERROR,20,82,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON+WS_TABSTOP+WS_GROUP dialogitem 'BUTTON','I&nformation',ID_ICONINFORMATION,20,95,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Question',ID_ICONQUESTION,20,108,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Warning',ID_ICONWARNING,20,121,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Style',-1,100,70,80,70,WS_VISIBLE+BS_GROUPBOX dialogitem 'BUTTON','&Top most',ID_TOPMOST,110,82,60,13,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX dialogitem 'BUTTON','OK',IDOK,85,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON dialogitem 'BUTTON','C&ancel',IDCANCEL,135,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON enddialog It's work to Win32/Win64 _________________ Best regards, Dmitry |
|||
07 Jul 2023, 13:52 |
|
luboput 07 Jul 2023, 20:03
?: why not IF-ELSE--END
fasm allows |
|||
07 Jul 2023, 20:03 |
|
Dima1205 07 Jul 2023, 21:31
I write _END macro simulate to _ENDIF.
|
|||
07 Jul 2023, 21:31 |
|
Dima1205 07 Jul 2023, 21:42
IF-ELSE--END AND UNLESS-ELSE_END can use this structure.
|
|||
07 Jul 2023, 21:42 |
|
Dima1205 08 Jul 2023, 11:55
I wrote analog api macro for my package interface capi.
Source: Code: macro API_N [name] { common ;Генерируем список параметров: TConstList test123 argv_test_data_argument equ rept argument_count item \{ testequ argv_test_data_argument,arg,item test123.Append argv_test_data_argument purge argv_test_data_argument \} forward match any,test123 \{ ;Отменяем предыдущее определение, если еще один макрос найден с таким же именем: PURGE name macro name any \\{ match any,UNICODE_CONST_FASM_LABEL \\\{ name#W any \\\} match ,UNICODE_CONST_FASM_LABEL \\\{ name#A any \\\} \\} \} macro F.#name args \{ match any,UNICODE_CONST_FASM_LABEL \\{ F.#name#W <args> \\} match ,UNICODE_CONST_FASM_LABEL \\{ F.#name#A <args> \\} \} macro CF.#name args \{ match any,UNICODE_CONST_FASM_LABEL \\{ CF.#name#W <args> \\} match ,UNICODE_CONST_FASM_LABEL \\{ CF.#name#A <args> \\} \} } It's can to use MessageBox how MessageBoxA and MessageBoxW. UNICODE_CONST_FASM_LABEL determinate in header files. _________________ Best regards, Dmitry |
|||
08 Jul 2023, 11:55 |
|
luboput 08 Jul 2023, 18:58
bug
|
||||||||||
08 Jul 2023, 18:58 |
|
Dima1205 08 Jul 2023, 22:07
Поправил код.
Code: ;format PE GUI 3.1 ;include 'Win32M.inc' format PE64 GUI 5.0 include 'Win64M.inc' lpFindFileData WIN32_FIND_DATA ;i dd NULL HANDLE i; x dd NULL test1 db "C:\WINDOWS\*.exe",0 EntryMain WinMain i=capi FindFirstFileA,test1,lpFindFileData; _FOR [x]= 2 TO 5 capi FindNextFileA,i,lpFindFileData capi MessageBoxA,NULL,lpFindFileData.cFileName,'',MB_OK ; <<< фигню пишет _ENDF capi FindClose,i capi ExitProcess,NULL IMPORTTABLE Макросы и примеры ещё накопятся потом пакет перезалью. _________________ Best regards, Dmitry |
|||
08 Jul 2023, 22:07 |
|
luboput 08 Jul 2023, 22:44
efficient macro to use (ru=эффективный по использованию макрос)
macro _cmp Var,Val,jto{cmp Var,Val jto }; ;=================================== _cmp [uMsg],WM_XXX, je fun_XXX ----> cmp [uMsg],WM_XXX je fun_XXX |
|||
08 Jul 2023, 22:44 |
|
Dima1205 08 Jul 2023, 23:54
ru=Он хорош, но бывают ситуации, когда требуется изменить условие на противоположное (например слева стоит число, а справа регистр или ячейка памяти), поэтому я писал свой обработчик. Думаю, когда будет время на FASMG перенесу.
It is good, but there are situations when you need to change the condition to the opposite (for example, a number is on the left, and a register or memory cell is on the right), so I wrote my own handler. I think when I have time for FASMG I will transfer it. |
|||
08 Jul 2023, 23:54 |
|
Dima1205 08 Jul 2023, 23:57
ru=Тем не менее, его включить в пакет стоит. Чем больше макросов для упрощения жизни, тем лучше. Я думаю, что имеет смысл ещё посмотреть как из MASM и NASM недостающую часть конструкций перенести. Можно и TASM поискать - там DOS макросы должны быть нормальными.
However, it is worth including it in the package. The more macros to make life easier, the better. I think that it makes sense to look at how to transfer the missing part of the structures from MASM and NASM. You can also look for TASM - there DOS macros should be normal. |
|||
08 Jul 2023, 23:57 |
|
Dima1205 10 Jul 2023, 16:46
Macros for create dll on Windows.
Code: ; ; ; Макросы для упрощённого создания Dll библиотек ; ; ; ;объявляем системный список - константу, которая будет использоваться для генерирования секции: TConstList ExportList ;системный список для export ; ; ; ; Точка входа в библиотеку ; ; macro entrylib { proc DllEntryPoint hinstDLL,fdwReason,lpvReserved ;функция инициализации DLL xor ACC,ACC add ACC,1 ;mov ACC,1 ; перемещаем в регистр eax значение True т.е Истина. Если сюда поставить False (ложь), то DLL не ;запустится ret ;выходим из этой функции endp } ; ; ; интерфейсные макроссы к секции экспорта ; ; macro EXPORTTABLE { data export match any,ExportList \{ export any \} end data } macro expproc [name1,name] { ExportList.Append <name1,name> } ;простой макросс для работы с секцией экспорта macro eproc [name] { ExportList.Append <name,`name> } macro explib name { ExportList.ReverseAppend `name#'.dll' } Example for uses: ru=Пример использования: Code: format PE DLL include 'Win32M.inc' module advapi32 explib api entrylib ; Определяем константы TOKEN_ADJUST_PRIVILEGES = 20h TOKEN_QUERY = 8h SE_PRIVILEGE_ENABLED = 2h ;здесь разместятся переменные библиотеки pid dd 0 count dd 0 hProcess dd 0 Pidcount dd 0 ;Определяем необходимые структуры для работы с привелегиями процесса struct LUID lowPart dd ? HighPart dd ? ends struct LUID_AND_ATTRIBUTES pLuid LUID Attributes dd ? ends struct _TOKEN_PRIVILEGES PrivilegeCount dd ? Privileges LUID_AND_ATTRIBUTES ends udtLUID LUID tkp _TOKEN_PRIVILEGES ;объявляем структуры для работы с процессами в windows9x struct PROCESSENTRY32 dwSize dd ? cntUsage dd ? th32ProcessID dd ? th32DefaultHeapID dd ? th32ModuleID dd ? cntThreads dd ? th32ParentProcessID dd ? pcPriClassBase dd ? dwFlags dd ? szExeFile db 260 dup(?) ends ;------------------------------------------------------------------ ; Функция повышения привелегий процесса ; Параметры вызова: ; type - тип привелегии,которую необходимо получить ;------------------------------------------------------------------ proc GetProcessPrivelege,type:dword capi GetCurrentProcess capi OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd capi LookupPrivilegeValue, NULL,[type], udtLUID mov [tkp.PrivilegeCount],1 mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED movv [udtLUID.lowPart],[tkp.Privileges.pLuid.lowPart] movv [udtLUID.HighPart],[tkp.Privileges.pLuid.HighPart] capi AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0 ret TTokenHd dd ? endp eproc GetProcessPrivelege ;------------------------------------------------------------------ ; Функция обрезки строки ; Параметры вызова: ; string - строка,которую надо обрезать ; kolvo - количество символов, которые надо убрать ; key - ключ обрезки. ; если key=1, то орбрезка происходит с начала, ; если key=0, то обрезка происходит с конца ;------------------------------------------------------------------ proc strcut,string:dword,kolvo:dword,key:dword capi lstrlen,[string] cmp [key],1 jne @f mov edi,[string] mov esi,edi add esi,[kolvo] mov ecx,eax repe movsb jmp exit1 @@: sub eax,[kolvo] add eax,[string] mov byte [eax],0 exit1: ret endp eproc strcut ;------------------------------------------------------------------ ; Функция убийства процесса ; Параметры вызова: ; id - pid процесса, который надо завершить ;------------------------------------------------------------------ proc KillProcess,id:dword capi OpenProcess,PROCESS_TERMINATE,0,[id] capi TerminateProcess,eax,0 ret endp eproc KillProcess ;------------------------------------------------------------------ ; Функция получения id процесса через ToolHelp32 ; Параметры вызова: ; name - имя процесса, id которого надо получить ;callback - процедура обработки значения(т.к. процесс может быть не 1, а несколько). ;Системные требования к функции: ; Windows 9x ; Windows 2000 и выше ;------------------------------------------------------------------ proc GetProcessID9x,name:dword,callback:dword mov [prcs.dwSize],sizeof.PROCESSENTRY32 capi CreateToolhelp32Snapshot,2,0 mov [hSnapshot], eax capi Process32First,[hSnapshot],prcs call_back_label_return_ifromation_process: mov edi,[name] capi strstr,prcs.szExeFile,edi cmp eax,0 je _NextProc_i stdcall [callback],[prcs.th32ProcessID] _NextProc_i: capi Process32Next,[hSnapshot],prcs cmp eax,0 jne call_back_label_return_ifromation_process ret prcs PROCESSENTRY32 hSnapshot dd ? endp eproc GetProcessID9x IMPORTTABLE EXPORTTABLE _________________ Best regards, Dmitry |
|||
10 Jul 2023, 16:46 |
|
Dima1205 14 Jul 2023, 22:11
ru= Портировал макросы для DOS https://board.flatassembler.net/topic.php?t=22853, https://board.flatassembler.net/topic.php?t=22851
en= I ported macros for DOS https://board.flatassembler.net/topic.php?t=22853, https://board.flatassembler.net/topic.php?t=22851 |
|||
14 Jul 2023, 22:11 |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.