flat assembler
Message board for the users of flat assembler.

Index > Compiler Internals > Nesting macros containing locals in an irps causes an error

Author
Thread Post new topic Reply to topic
Tyler



Joined: 19 Nov 2009
Posts: 1216
Location: NC, USA
Tyler 05 Apr 2010, 04:02
The code is taken from the example with a local, but nested in an irps.
Code:
irps cond, a b
{
  macro movstr
     \{
        local move
      move:
        lodsb
        stosb
        test al,al
        jnz move
     \}
}

; Use it twice
movstr
movstr ; Error: symbol("move?QJ:") already defined.
    

Bug?(Fasmw 1.69.12)
This code above has no real reason to be nested, I was using irps to make a condition mov macro when I discovered the error, while using the irps to make a macro for all conditional endings.
Post 05 Apr 2010, 04:02
View user's profile Send private message Reply with quote
revolution
When all else fails, read the source


Joined: 24 Aug 2004
Posts: 20363
Location: In your JS exploiting you and your system
revolution 05 Apr 2010, 04:46
You have to escape local also.
Code:
irps cond, a b
{
  macro movstr
     \{
        \local move
      move:
        lodsb
        stosb
        test al,al
        jnz move
     \}
}    
Post 05 Apr 2010, 04:46
View user's profile Send private message Visit poster's website Reply with quote
Tyler



Joined: 19 Nov 2009
Posts: 1216
Location: NC, USA
Tyler 05 Apr 2010, 05:15
Dude, you're freakin' kidding me!!! Evil or Very Mad I spent SSOOO long pondering that one problem, I haven't finished anything today. The funny thing is, I also didn't escape the {}s the first few times, but I'd seen that done so many times, I eventually noticed it. Thanks, I'm using it for a conditional mov and call(not together), here's the code after I added \s
Code:
irps cond, a b e z na nb ne nz
{
   macro mov#cond dst*,src*,else_src
   \{
      if cond eq
         mov dst,src
      else
         \local .cond_met
         \local .cond_unmet
         j#cond .cond_met
         if ~(else_src eq )
            mov dst,else_src
         end if
         jmp .cond_unmet
         .cond_met:
         mov dst,src
         .cond_unmet:
      end if
   \}

     macro call#cond location ; Wasn't sure if I could use label
   \{
      \local true
      \local false
      j#cond true
      jmp false
      true:
      call location
      false:
   \}
}
    

The actual jumps are really bad style, but it'll simplify my code 100 fold.
Post 05 Apr 2010, 05:15
View user's profile Send private message Reply with quote
revolution
When all else fails, read the source


Joined: 24 Aug 2004
Posts: 20363
Location: In your JS exploiting you and your system
revolution 05 Apr 2010, 06:34
I use this little cmov macro for when I need to support older CPUs
Code:
irp cc,a,ae,b,be,c,e,g,ge,l,le,na,nae,nb,nbe,nc,ne,ng,nge,nl,nle,no,np,ns,nz,o,p,pe,po,s,z {
     local i
     macro cmov#cc [args] \{
           \common
            \local .x
              j#cc    .x
          load    i from $-2
          store   (i xor 1) at $-2
            mov     args
            .x:
 \}
}    
It shows the use of both escaped and unescaped local. Note that the other preprocessor strings need escaping also: common, forward, reverse,`, #, }.
Post 05 Apr 2010, 06:34
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:  


< 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.