flat assembler
Message board for the users of flat assembler.

Index > Macroinstructions > [fasm1 forever] Multisections .code .data .stream

Goto page 1, 2, 3  Next
Author
Thread Post new topic Reply to topic
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
UPDATED RELEASE Cool :
Code:
macro .multisection [entry_file] 
        {
        common
        macro proc [param]
        \{ 
                \common
                end if
                lastcuRRent='code'
                if cuRRent='code'
        \}      
        macro endp 
        \{
                end if
                lastcuRRent='code'
                if cuRRent='code'
        \}
        macro .data
        \{ 
                end if
                lastcuRRent='data'
                if cuRRent='data'
        \}      
        macro data arg&
        \{ 
                end if
                if cuRRent='data'
                        arg
                end if
                if cuRRent=lastcuRRent
        \}
        macro .dataonce param
        \{
                end if
                local cond
                if cuRRent='data' & once@\#param='true'
                        cond='skip'
                else if cuRRent='data'
                        once@\#param='true'
                        cond='data'
                else
                        once@\#param='false'
                        cond='skip'
                end if
                lastcuRRent=cond
                if cuRRent=cond
        \}
        macro .idata
        \{ 
                end if
                lastcuRRent='idata'
                if cuRRent='idata'
        \}
        macro .code 
        \{
                end if
                lastcuRRent='code'
                if cuRRent='code'
        \}
        macro .comment
        \{
                end if
                lastcuRRent='comment'
                if cuRRent='comment'
        \}
        macro dotstream arg
        \{      
                        streamcuRRent=\`arg
                        savedcuRRent=cuRRent
                        cuRRent='stream'
                purge .stream
                macro .stream arg
                \\{
                \\}
                forward
                if savedcuRRent=lastcuRRent
                        include entry_file
                end if
                common
                
                        cuRRent=savedcuRRent
                        streamcuRRent='none'
                        savedcuRRent='none'
        \}
        macro .frame param
        \{
                end if
                if cuRRent='stream' &streamcuRRent=\`param
        \}
        streamcuRRent='none'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        cuRRent='idata'
        section '.idata' import data readable writeable
                library kernel32,'KERNEL32.DLL',\
                        kernel32clone,'Kernel32.dll',\
                user32,'USER32.DLL',\
                user32clone,'USER32.DLL',\
                gdi32,'GDI32.DLL',\
                advapi32,'ADVAPI32.DLL',\
                comctl32,'COMCTL32.DLL',\
                comdlg32,'COMDLG32.DLL',\
                shell32,'SHELL32.DLL',\
                wsock32,'WSOCK32.DLL',\
                ole32,'ole32.dll',\
                UxTheme,'UxTheme.dll',\
                Normaliz,'Normaliz.dll',\
                Msftedit,'Msftedit.dll',\
                Riched20,'Msftedit.dll',\
                Avrt,'Avrt.dll',\
                Msimg32,'Msimg32.dll',\
                gdiplus,'gdiplus.dll',\
                D2d1,'D2d1.dll'
                
        import_kernel32
        import_user32
        import_gdi32
        import_advapi32
        import_comctl32
        import_comdlg32
        import_shell32
        import_wsock32
        
        all_api

    forward
        if cuRRent='idata'
                include entry_file
        end if
        common
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        cuRRent='data'
        section '.data' data readable writeable
        forward
        purge .stream
        macro .stream arg
        \{      dotstream arg
                purge .stream
                macro .stream arg
                \\{     dotstream \arg
                \\}
        \}
        if cuRRent='data'
                include entry_file
        end if
        common
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        cuRRent='code'
        purge proc,endp
        macro proc [param]
        \{ 
                \common
                end if
                lastcuRRent='code'
                if cuRRent='code'
                proc param
        \}      
        macro endp
        \{
                end if
                lastcuRRent='code'
                if cuRRent='code'
                endp
        \}
        section '.text' code readable executable
        entry $
        sub rsp,8
        forward
        purge .stream
        macro .stream arg
        \{      dotstream arg
                purge .stream
                macro .stream arg
                \\{     dotstream \arg
                \\}
        \}
        if cuRRent='code'
                include entry_file
        end if
}    

FEATURES:
1. Linker. It will combine all your sections in all project files at same time.
2. Proc. You can use multisections inside procedures.
3. Unlimited quantity of pseudo sections any time you need it.
4. Easy to add some more kind of sections like .rsrc
5. Short names like masm .code .data .idata (up to you actually)
6. No need of .end for sections. Just declare the next one.
7. Comment whole block by .comment
8. Macros can use combinations of different sections (data+code+frames)
9. Don't worry about already defined data any more.
Macros can insert Data just once by .dataonce <unique name>
10. Single line data directive data <define variable here>
11. .frame <name of stream> .stream <unique name> Collects frames from whole project to specified places.

Warning. Namespace feature removed at the moment as useless until improved to full functionality.
Do not declare sections inside if operators.
To enjoy it put(include) the macro to Header(Main file) then link your project files:
Code:
include   '<your macros and header files>'
[b].multisection[/b] '<your project file 1>','<your project file 2>','<your project file n...>'
    


Description:
Filesize: 59.51 KB
Viewed: 1458 Time(s)

Untitled.png




Last edited by Overclick on 29 Apr 2022, 13:54; edited 9 times in total
Post 21 Jul 2020, 11:27
View user's profile Send private message Visit poster's website Reply with quote
revolution
When all else fails, read the source


Joined: 24 Aug 2004
Posts: 18723
Location: In your JS exploiting you and your system
revolution
Post 21 Jul 2020, 11:30
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Seems like idea is to use some sort of different names, but I think we can use files to store all subsections together.
Post 21 Jul 2020, 11:36
View user's profile Send private message Visit poster's website Reply with quote
Roman



Joined: 21 Apr 2012
Posts: 1220
Roman
Good macro somthing like this:

macro .dll [arg] {
section '.idata' import data readable writeable
library arg,`arg#'.DLL',\


import_#arg

}

In code:
.dll kernel32,user32,gdi32
Post 22 Jul 2020, 12:39
View user's profile Send private message Reply with quote
fasmnewbie



Joined: 01 Mar 2011
Posts: 555
fasmnewbie
Overclick wrote:
This is why I like masm -- simple sections, sticked together by compilation. I mean .code .data...Any macro can make parts for sections. What's wrong with fasm?


I don't know man, the last time I tried, MASM's '.data' macro still unable to align to 32-byte boundaries. Horrible macro for dealing with YMM data. Had to move down to raw "dseg segment". I hope it is already fixed by now.
Post 24 Jul 2020, 01:03
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
I did it
Code:
macro .multisection entry_file {        
        macro .data \{ 
                end if 
                if current='data'
        \}
        macro .idata \{ 
                end if 
                if current='idata'
        \}
        macro .code \{
                end if
                if current='code'
        \}
        current='idata'
        section '.idata' import data readable writeable
        if current='idata'
                include entry_file
        end if
        current='data'
        section '.data' data readable writeable 
        if current='data'
                include entry_file
        end if
        current='code'
        section '.text' code readable executable
        entry $
        sub rsp,8
        if current='code'
                include entry_file
        end if
}       

.multisection 'MyWorkFile.asm'     

Wink
Post 30 Jul 2020, 14:01
View user's profile Send private message Visit poster's website Reply with quote
Roman



Joined: 21 Apr 2012
Posts: 1220
Roman
How use this ?
What code in MyWorkFile.asm ?
Post 30 Jul 2020, 14:50
View user's profile Send private message Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Put this macro on header/Main file or include it to there.
Write your program on some separate file then put it there by
.multisection '<your program>'
Post 30 Jul 2020, 14:57
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Upd: Use it carefully with "fix" where you need it. Declare it before or after multisection.
Post 31 Jul 2020, 16:14
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
UPDATED RELEASE Cool :
Code:
macro .multisection [entry_file] {
        common
        macro proc [param] \{ 
                end if
                if cuRRent='code'
        \}      
        macro endp \{
                end if
                if cuRRent='code'
        \}
        macro .data \{ 
                end if
                if cuRRent='data'
        \}
        macro .idata \{ 
                end if
                if cuRRent='idata'
        \}
        macro .code \{
                end if
                if cuRRent='code'
        \}
        macro .comment \{
                end if
                if cuRRent='comment'
        \}  
        section '.idata' import data readable writeable 
        cuRRent='idata'
        forward
        if cuRRent='idata'
                include entry_file
        end if
        common
        section '.data' data readable writeable 
        cuRRent='data'
        forward
        if cuRRent='data'
                include entry_file
        end if
        common
        cuRRent='code'
        purge proc
        purge endp
        macro proc [param] \{ 
                \common
                end if
                proc param
                if cuRRent='code'
        \}      
        macro endp \{
                end if
                endp
                if cuRRent='code'
        \}
        section '.text' code readable executable
        entry $
        sub rsp,8
        forward
        if cuRRent='code'
                include entry_file
        end if
}    

FEATURES:
1. Linker. It will combine all your sections in all project files at same time.
2. Proc. You can use multisections inside procedures.
3. Unlimited sections any time you need it.
4. Easy to add some more kind of sections like .rsrc
5. Short names like masm .code .data (up to you actually)
6. No need of .end
7. Comment whole block by .comment

Do not use fix inside linked files. Do not declare sections inside if operators.
To enjoy it put(include) the macro to Header(Main file) then link your project files by:
Code:
.multisection '<your project file 1>','<your project file 2>','<your project file n...>'
    


Last edited by Overclick on 09 Sep 2020, 23:45; edited 1 time in total
Post 07 Aug 2020, 06:26
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
New feature:
.comment
Code:
        macro .comment
        \{
                end if
                if cuRRent='comment'
        \}    

Easiest way to comment whole block of code when you need it. Enjoy Wink
Post 09 Sep 2020, 23:43
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
New feature:
.dataonce <unique name>
Code:
macro   .dataonce name
        {
        end if
        if name=0 &cuRRent='data'
                name=1
        }    

Example:
Code:
dataSomeMacro = 0                     ;declare unique name
macro SomeMacro [arg]
        .dataonce dataSomeMacro          ;once again
                Param1 db ?
                Param2 db ?
        .code                                    ;finish job by declaring next section.
                mov [Param1],1
                lea arg,[Param2]
        }    

SomeMacro rsi
...
SomeMacro rdi
...
SomeMacro rax

Data block will be added to data section just once. No matter how many times you use your macro. Don't try to use multisection blocks inside 'if -end if' constructions, just in main macro body. But you can use 'if - end if' inside that sections as normally do.
Have a look to my new macro .function. That one can be used with 'if - and if' without problems.
https://board.flatassembler.net/topic.php?t=21847
I tried to hide that ugly unique names for all, but not success. Have to be used with names for a while Smile
Post 11 Apr 2021, 12:38
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Release updated, check the first comment

Added .namespace
Fixed .dataonce -- no need to declare unique name before macro any more, only next to directive
Post 05 Apr 2022, 02:11
View user's profile Send private message Visit poster's website Reply with quote
macomics



Joined: 26 Jan 2021
Posts: 593
Location: Russia
macomics
Overclick wrote:
Code:
macro .namespace param
        \{      
                end if
                define currentnamespace param
                if cuRRent='data'
                        restruc dd
                        struc dd data&
                        \\{
                                common
                                restore .
                                . #@\\#param dd data
                                . equ . #@\\#param
                                list@\\#param equ .,list@#param
                        \\}
                end if
                current@namespace equ list@\#currentnamespace fake@fake
                setnamespace \current@namespace
                if cuRRent=lastcuRRent
        \}    

Is only `dd` enough?
And, in my opinion, when using the argument with &, it is necessary to check for <empty>.
Code:
struc dd data& { if ~ data eq
...
end if }    
Post 05 Apr 2022, 06:04
View user's profile Send private message Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Quote:

And, in my opinion, when using the argument with &, it is necessary to check for <empty>.

empty data gonna generate some error, but why not

dd just for demonstration. I created db dw and dq but need to fix proc before release.
Some passed values undefined yet.
Post 05 Apr 2022, 13:56
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
All fixed.
I'll do structures and jumps later
Post 11 Apr 2022, 09:04
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
How about this? Do you like single line data includes? Even more it works inside labelspaces )


Description:
Filesize: 55.37 KB
Viewed: 1765 Time(s)

Capture.JPG


Post 20 Apr 2022, 14:48
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
I'm trying to get possible to use subsections inside label-spaces but it woun't. So the solution is a single line data macro only. (Not updated yet)
Post 20 Apr 2022, 15:05
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
OMG I fixed that issue too


Description:
Filesize: 52.68 KB
Viewed: 1751 Time(s)

Capture.JPG


Post 20 Apr 2022, 15:20
View user's profile Send private message Visit poster's website Reply with quote
Overclick



Joined: 11 Jul 2020
Posts: 512
Location: Ukraine
Overclick
Anonce:
New superior directives coming soon:
.frame <unique name>
.stream <unique name>

Absolute modular programming. Your may place any data/code to any predefined places.

Example:
Code:
.data
  ;...
  somestructure:
  .stream one
.code
  ;...
  .stream one
  .stream two
  ;...
  .data  ;may be a macros
    .frame one
      >>elements of structure or any other data sticked together
  .code
    .frame one
      >>element of code sticked together
    .frame two
  ;...
  .data  ;may be macros
    .frame one
      >>elements of structure or any other data sticked together
  .code
    .frame one
      >>element of code sticked together    

You also may stream frames multiply times
Post 21 Apr 2022, 08:53
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  
Goto page 1, 2, 3  Next

< 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-2020, Tomasz Grysztar. Also on GitHub, YouTube, Twitter.

Website powered by rwasa.