flat assembler
Message board for the users of flat assembler.

Index > Macroinstructions > Extended macro packet for FASMG.

Author
Thread Post new topic Reply to topic
Dima1205



Joined: 02 Jul 2023
Posts: 24
Location: Russian, Moscow
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
Post 27 Jul 2024, 22:03
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.