Author Topic: GoAsm can't see labels in macros  (Read 4774 times)

Yuri

  • Member
  • **
  • Posts: 175
GoAsm can't see labels in macros
« on: June 22, 2013, 07:44:28 PM »
When I try to assemble this code:
Code: [Select]
macro1 MACRO
    M1:
    xor eax,eax
ENDM

CODE SECTION

Start:
    macro1
    M2:
    mov eax,M2 - M1
    ret

I get an error from GoAsm:
Quote
Error!
Line 11 of assembler source file (macro.asm):-
Cannot calculate memory offset due to unknown:-
M2 - M1

And this one:
Code: [Select]
macro1 MACRO
    M1:
    xor eax,eax
ENDM

CODE SECTION

Start:
    jmp > M1
    macro1
    ret

results in this:
Quote
Error!
Line 11 of assembler source file (macro.asm):-
There was a forward short jump to nowhere
jmp > M1

dedndave

  • Member
  • *****
  • Posts: 8825
  • Still using Abacus 2.0
    • DednDave
Re: GoAsm can't see labels in macros
« Reply #1 on: June 22, 2013, 10:26:17 PM »
the M1 label inside the macro is local to the macro
it has no set address

try this
Code: [Select]
Start:
    macro1
    M2:
    mov eax,M2 - Start
    ret

Yuri

  • Member
  • **
  • Posts: 175
Re: GoAsm can't see labels in macros
« Reply #2 on: June 23, 2013, 01:29:43 AM »
Yes, it looks like such labels are local when they are inside a macro. But if you yourself are inside a macro and the label is outside, you can't see it either. I couldn't find anything that explained these restrictions in the GoAsm help, so I don't know if this is a feature or still a bug. Such labels are called unscoped re-usable labels.  Anyway, unique labels, having more than one letter in the name, work for this purpose, so I will use them.

Yuri

  • Member
  • **
  • Posts: 175
Re: GoAsm can't see labels in macros
« Reply #3 on: June 23, 2013, 02:30:13 AM »
No, it's not quite the case yet. I can jump back from one macro to another using unique labels, but I can't jump forward. The code below compiles fine if I comment out the jump to BB, but with it not only the jump is to nowhere but also GoAsm sees a copy of label AA somewhere.
Code: [Select]
macro1 MACRO
jmp >> BB
AA:
ENDM

macro2 MACRO
jmp << AA
BB:
ENDM

CODE SECTION

Start:
macro1
macro2
ret
Quote
Error!
Line 14 of assembler source file (macro.asm):-
Macro contained a forward jump to nowhere
jmp >> BB
Defined in Line 1 of assembler source file (macro.asm):
macro1 MACRO

Line 15 of assembler source file (macro.asm):-
Label of this name already declared:-
AA:

dedndave

  • Member
  • *****
  • Posts: 8825
  • Still using Abacus 2.0
    • DednDave
Re: GoAsm can't see labels in macros
« Reply #4 on: June 23, 2013, 03:50:07 AM »
well - backward reference addresses are known in advance
forward references are not, as the assembler chews through the source from beginning toward the end

either way - if you are trying to reference labels inside a macro from outside or visa-versa,
i would say you are asking for a problem - lol

some versions of masm have a known bug with lines like
Code: [Select]
Label0: MacroCallyou must present it as
Code: [Select]
Label0:
        MacroCall

not that this is really related - the point is, labels and macros don't play well together

wjr

  • Member
  • **
  • Posts: 209
    • WJR's website
Re: GoAsm can't see labels in macros
« Reply #5 on: June 23, 2013, 12:33:58 PM »
The documentation does not go into details regarding labels within macros, so I can see how one could assume that what you have attempted should work. However, macro processing does get a bit more complicated, and from what I can see so far, there was some effort put into the "unscoped re-usable labels" actually having a narrow scope to just within the macro.

I think the main reasoning here was (since these labels are re-usable) to prevent having the inclusion of a macro (which used the same labels) from throwing off jumps or calculations in the original code (there would have been no error message for duplicate label symbols). Feature for this one - documentation needs updating...

As you noticed, there were also restrictions within macros for forward references. I haven't tested this, but it would appear that for the case of a locally scoped re-usable label (ex. jmp >.name), I might be able to somewhat easily let this one jump forward out of the macro. There probably was a reason for not doing this, but I can't see it yet or think of one at the moment...


Yuri

  • Member
  • **
  • Posts: 175
Re: GoAsm can't see labels in macros
« Reply #6 on: June 23, 2013, 05:33:02 PM »
Thanks for the clarification, Wayne. Yes, that makes sense.

I haven't tested this, but it would appear that for the case of a locally scoped re-usable label (ex. jmp >.name), I might be able to somewhat easily let this one jump forward out of the macro.

In the meantime I have found a way to modify the label name so that the macro could be used more than once without name clashes.
Code: [Select]
macroA(ord) MACRO
.name##ord
xor eax,eax
ENDM

macroB(ord) MACRO
jmp << .name##ord
ENDM

CODE SECTION

Start:

    macroA(1)
    macroB(1)
    macroA(2)
    macroB(2)

    macroA(3)
    macroA(4)
    macroB(4)
    macroB(3)

    macroA(5)
    macroA(6)
    macroB(5)
    macroB(6)
    ret

dedndave

  • Member
  • *****
  • Posts: 8825
  • Still using Abacus 2.0
    • DednDave
Re: GoAsm can't see labels in macros
« Reply #7 on: June 23, 2013, 10:45:27 PM »
i don't know if GoAsm supports NEAR, but....
Code: [Select]
    jmp near Label0should work in masm