[comp.sys.ibm.pc] MASM 4.00 Mishandling of INCLUDEs inside MACROs

mmm@gssc.UUCP (01/25/87)

=-=-=-=-=-=-=-=-=-= 

DISCLAIMER:  As I have been reading this newsgroup for only a month, it is
entirely possible that mention of the following bug has appeared previously,
and, if so, I apologize for the long-winded repetition.

=-=-=-=-=-=-=-=-=-=

I have discovered what appears to me to be a bug in the Microsoft Macro
Assembler, which I haven't seen mention of in any of the trade rags nor on the
network, so here it is.  Note that this is *not* the infamous bug for which
Dr. Dobbs published a patch last year, dealing with the assembler's inability
to handle include files with (or was it *without*) a terminating CTRL-Z.

What I've found is that MASM 4.00 mishandles INCLUDE pseudo-ops that are
imbedded in MACRO definitions.

Consider the following example files (Note that they do nothing.  They are for
demonstration purposes only):

---------- test.asm: --------------------

DOIT	Macro
	Include	ifile2.mac
	Include	ifile3.mac
	Endm

Code	Segment
	Assume	Cs:Code

Main	Proc	Far
	DOIT
Main	Endp
Code	Ends
	End

---------- ifile2.mac: --------------------

	%OUT	This is ifile2.mac
XY	Struc
XY_x	Dw	?
XY_y	Dw	?
XY	Ends

	Jmp	Start3

---------- ifile3.mac: --------------------

	%OUT	This is ifile3.mac
Start3:
	Mov	Ax,Es:[0].XY_y

            --------------------

I assembled test.asm with IBM MASM version 2.00 (similar, if not the same as
Microsoft MASM 3.00) and with Microsoft MASM 4.00 , producing a listing with
each:

	masm test,,test;

Here is what IBM MASM version 2.00 produced:

----------

IBM Personal Computer MACRO Assembler   Version 2.00  	Page	1-1
	 	 	 	 	 	 	 	01-25-87    


 	 	 	 	DOIT	Macro
 	 	 	 	 	Include	ifile2.mac
 	 	 	 	 	Include	ifile3.mac
 	 	 	 	 	Endm
 	 	 	 	
 0000	 	 	 	Code	Segment
 	 	 	 	 	Assume	Cs:Code
 	 	 	 	
 0000	 	 	 	Main	Proc	Far
 	 	 	 	 	DOIT
                             C+	XY	Struc
 0000  ????                  C+	XY_x	Dw	?
 0002  ????                  C+	XY_y	Dw	?
 0004                        C+	XY	Ends
 0000  EB 01 90              C+	 	Jmp	Start3
 0003                        C+	Start3:
 0003  26: A1 0002           C+	 	Mov	Ax,Es:[0].XY_y
 0007	 	 	 	Main	Endp
 0007	 	 	 	Code	Ends
 	 	 	 	 	End

	[I've removed the symbol table for brevity]

49900 Bytes free   

Warning Severe
Errors	Errors 
0	0

----------

And here's what Microsoft MASM 4.00 produced:

----------

Microsoft (R) Macro Assembler  Version 4.00                 1/25/87 11:13:47

                                                            Page     1-1
                                                            

                                DOIT	Macro 
                                	Include	ifile2.mac 
                                	Include	ifile3.mac 
                                	Endm 
                                 
 0000                           Code	Segment 
                                	Assume	Cs:Code 
                                 
 0000                           Main	Proc	Far 
                                	DOIT 
                             C  	%OUT	This is ifile3.mac 
 0000                        C  Start3: 
 0000  26: A1 0002           C  	Mov	Ax,Es:[0].XY_y 
                             C   
                             C  	%OUT	This is ifile2.mac 
                             C  XY	Struc 
 0000  ????                  C  XY_x	Dw	? 
 0002  ????                  C  XY_y	Dw	? 
 0004                        C  XY	Ends 
                             C   
 0004  EB FA                 C  	Jmp	Start3 
                             C   
                                 
                                Main	Endp 
 0006                           Code	Ends 
                                	End 

	[Again, symbol table removed for brevity]

  50260 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors

----------

Notice the different order in which the INCLUDE directives are processed by
the two assemblers.  It appears that MASM 4.00 delays handling of INCLUDEs
inside macros until the macro is processed, and then it processes the INCLUDEs
in the reverse order of their appearance in the macro.  This produces exactly
the opposite of the desired effect by inverting code ordering and invalidating
any order dependencies.

According to all documentation that I have read, MASM 4.00 is in error.
INCLUDE pseudo-ops are supposed to be handled immediately, suspending assembly
of the surrounding code while the include file is processed.  No mention is
made of there being a different method for handling INCLUDEs inside MACRO
expansions.

Now, the main reason for posting this:  Is there a patch for this bug?  (Yes,
I know this is a naive question, but you never know...)  I would like to
upgrade to MASM 4.00, but doing so would mean major architectural changes to
my existing code that assembles with IBM MASM 2.00.  I would rather stick with
IBM MASM 2.00 or patch MASM 4.00 than modify my code.

In any case, I am sending a copy of this posting to Microsoft Technical
Support in hopes that future assemblers won't have this problem.  I'll let you
know what they say.
-- 
			      Mitchell McLain
		    ...hplabs!tektronix!sequent!gssc!mmm
      Opinions are my own, not those of GSS (they're happy about that).