The MASM Forum Archive 2004 to 2012

Specialised Projects => Assembler/Compiler Technology => Topic started by: jj2007 on July 04, 2009, 09:57:25 PM

Title: MIRROR$
Post by: jj2007 on July 04, 2009, 09:57:25 PM
mov eax, MIRROR$("1234") assembles fine on ml 6.14 and ml 9.0 but chokes with JWasm. Any ideas why?

include \masm32\include\masm32rt.inc

MIRROR$ MACRO arg:REQ ;;usg: mirror text: cmp eax, MIRROR$("Masm")
LOCAL tmp$
  tmp$ equ <>
  FORC char, <arg>
   tmp$ CATSTR <char>, tmp$
  ENDM
  EXITM <tmp$>
ENDM

.code

start:
mov eax, MIRROR$("1234")
print hex$(eax)
getkey
exit ; short form of invoke ExitProcess, 0
end start
Title: Re: MIRROR$
Post by: jj2007 on July 04, 2009, 10:17:21 PM
Since we are already on Jwasm:

Quote   exit MACRO optional_return_value
      IFNDEF optional_return_value
        invoke ExitProcess, 0
      ELSE
        invoke ExitProcess,optional_return_value
      ENDIF
    ENDM
Warning! W286: IF[n]DEF expects a plain symbol as argument: IFNDEF

Quote   exit MACRO optional_return_value
      IFB <optional_return_value>
        invoke ExitProcess, 0
      ELSE
        invoke ExitProcess,optional_return_value
      ENDIF
    ENDM
Works fine...
Title: Re: MIRROR$
Post by: Jimg on July 04, 2009, 10:27:44 PM
first question,   clearly a bug-

  start:
=                         1 ??0019 equ <>
                           1 FORC char, <"1234">
>                         1 ??0019 CATSTR <char>, ??0019
>                         1 ENDM
00000000                   2 ??0019 CATSTR <">>, <>
                           Error! E048: Syntax error
= 1                       2 ??0019 CATSTR <1>, <>
= 21                      2 ??0019 CATSTR <2>, <1>
= 321                     2 ??0019 CATSTR <3>, <21>
= 4321                    2 ??0019 CATSTR <4>, <321>
00000000                   2 ??0019 CATSTR <">>, <4321>
                           Error! E048: Syntax error

edit: nonsense statement removed.

on ifndef, does a zero length string exist by definition?  Different, but not necessarily wrong.
Title: Re: MIRROR$
Post by: jj2007 on July 04, 2009, 10:46:03 PM
Quote from: Jimg on July 04, 2009, 10:27:44 PM

<"1234">
<4321>

Although I don't see why you would write a macro that returned a string identical to the input.

It mirrors the string, e.g. .if eax==MIRROR$("Jimg")
Works fine with ML, 6.14 and 9.0

Quote
on ifndef, does a zero length string exist by definition?  Different, but not necessarily wrong.

If it has not been defined, it does not exist. I use ifndef often, never had a problem.

Not that M$ was without problems - I just lost over an hour chasing a very odd bug. I have a 53k include file, it works fine with all my code except one source. That one works fine with ml/link 6.14, JWasm, polink but not with ml 9.0: It gave me a cryptic error message, "internal error" etc, plus a reg dump, until I had the bright idea to add

JustAnother MACRO
ENDM

at the bottom. Now it works :green2
Quote
Title: Re: MIRROR$
Post by: Jimg on July 04, 2009, 10:58:40 PM
awww, you caught me before I could remove that stupid statement :)
Title: Re: MIRROR$
Post by: Jimg on July 04, 2009, 11:03:55 PM
ifndef expects a symbol, not a null string, in jwasm.  One of many differences between it and masm.

As for the other, I guess you'll have to complain on sourceforge.  I lost interest after Japeth moved everything there.
Title: Re: MIRROR$
Post by: jj2007 on July 04, 2009, 11:04:04 PM
Quote from: Jimg on July 04, 2009, 10:58:40 PM
awww, you caught me before I could remove that stupid statement :)

Never mind :bg

Just found that I can solve my problem with ml 9.0 by inserting near the top of the include file

QuoteM$isCrap PROTO

If I comment it out, the bug comes back, even if I keep the number of characters constant. Cute ::)

MASM : fatal error A1016: Internal error

  Version 9.00.21022.08

  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 00428E55 (00400000) "D:\Masm32\bin\ml.exe"
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 00000000
  ExceptionInformation[ 1] = 00C26030

CONTEXT:
  Eax    = 00C26030  Esp    = 0012F8F4
  Ebx    = 0044A200  Ebp    = 0012F924
  Ecx    = 00000009  Esi    = 00C25FE9
  Edx    = 00000009  Edi    = 00000007
  Eip    = 00428E55  EFlags = 00010202
  SegCs  = 0000001B  SegDs  = 00000023
  SegSs  = 00000023  SegEs  = 00000023
  SegFs  = 0000003B  SegGs  = 00000000
  Dr0    = 00000000  Dr3    = 00000000
  Dr1    = 00000000  Dr6    = 00000000
  Dr2    = 00000000  Dr7    = 00000000
Title: Re: MIRROR$
Post by: Ficko on July 05, 2009, 08:16:54 PM
Hi JJ,

Just a suggestion.

Try ML VER 10.00...

:8)
Some things are smoothed out some got worse.

Ficko
Title: Re: MIRROR$
Post by: japheth on July 09, 2009, 11:15:03 AM
Hi jj,

the MIRROR$ is fixed in v1.96

the warning with IFxDEF is to make sure someone doesn't write

IFNDEF sym1 or sym2

because it won't work as expected.


Title: Re: MIRROR$
Post by: jj2007 on July 09, 2009, 12:26:35 PM
Quote from: japheth on July 09, 2009, 11:15:03 AM
Hi jj,

the MIRROR$ is fixed in v1.96
Thanx, works great :U

Quote
the warning with IFxDEF is to make sure someone doesn't write

IFNDEF sym1 or sym2

because it won't work as expected.


How would you rewrite the exit macro then?

exit MACRO optional_return_value
      IFNDEF optional_return_value
        invoke ExitProcess, 0
      ELSE
        invoke ExitProcess,optional_return_value
      ENDIF
ENDM

Warning! W284: IF[n]DEF expects a plain symbol as argument: IFNDEF
exit(2)
Title: Re: MIRROR$
Post by: japheth on July 09, 2009, 06:57:09 PM

> How would you rewrite the exit macro then?

What's wrong with IFNB instead of IFNDEF?
Title: Re: MIRROR$
Post by: jj2007 on July 09, 2009, 07:13:09 PM
Quote from: japheth on July 09, 2009, 06:57:09 PM

> How would you rewrite the exit macro then?

What's wrong with IFNB instead of IFNDEF?

Nothing is wrong, but I would like to understand where I can use IFNDEF without getting a warning. I use it quite a bit...

As to the exit macro, this works and is more elegant:

exit MACRO optional_return_value:=<0>
        invoke ExitProcess, optional_return_value
ENDM