README.DOC File

             Release Notes for the Microsoft(R) Macro Assembler
                Professional Development System, Version 6.1

     (C) Copyright 1992, Microsoft Corporation.  All rights reserved.
     This document contains release notes for version 6.1 of the
     Microsoft Macro Assembler Professional Development System for
     MS-DOS(R).  The information in this document and in the Microsoft 
     Advisor (online help) is more up-to-date than that in the manuals.
     Microsoft improves its languages documentation at the time of
     reprinting, so some of the information in this file may already be
     included in your manuals.

==============================< Contents >================================

     This file has 4 parts:
               Part     Contents
               ----     --------
               1        Documentation Errata

               2        Information on Microsoft CodeView

               3        Tips for Using MASM 6.1

               4        Known Assembler Bugs

====================< Part 1: Documentation Errata >======================

     Reference, Page 98: LEA is no longer optimized
     The MASM 6.1 Reference indicates that the LEA instruction is
     encoded as a MOV when the source operand is a direct memory address.

     In response to programmer requests, MASM 6.1 no longer performs this 
     optimization automatically.  The optimization can be performed by 
     using the OPATTR operator, as shown in the following macro:

          MOVLEA MACRO Dest, Symbol
          IF (OPATTR(Symbol)) AND 08h
               MOV Dest, OFFSET Symbol
               LEA Dest, Symbol

     Programmer's Guide, Page 202: User-Defined Epilogues & Prologues
     The documentation for user-defined epilogue and prologue code reads
     "Your macro function must return the parmbytes parameter."  It
     should read "...the localbytes parameter."

     Help for Runtime Error R6921
     The online help for runtime error R6921 reads "...Possibly the
     CONFIG.SYS file contained a line such as DEVICE=C:\OS\MM386.EXE..."
     The file name should read "C:\DOS\EMM386.EXE".

===============< Part 2: Information on Microsoft CodeView >==============

     CV.TXT File
     Detailed information on configuring CodeView is in the CV.TXT file,
     in the directory into which you installed MASM.

     CodeView and 32-bit Registers
     CodeView 4.01 does not support single-stepping through code which
     uses 32-bit registers while a DPMI server is present.  Windows 3.1
     and 386-MAX are examples of DPMI servers.  If you need to single-
     step through 32-bit code, you can exit Windows and use a VCPI server 
     such as EMM386.EXE to run CodeView, or use an alternate debugger 
     such as WDEB386 (available in the Microsoft Windows Software 
     Development Kit).

     CodeView and .COM Files
     CodeView 4.01 does not show source code when debugging .COM files.  
     If you need to view source code, build your program as a small-model 
     .EXE for debugging purposes.

====================< Part 3: Tips for Using MASM 6.1 >===================

     Working with MASM 5.1 Code
     There are differences between MASM 5.1 and MASM 6.1.  Some code
     written for MASM 5.1 will not assemble correctly with MASM 6.1.
     Appendix A of the MASM Programmer's Guide discusses how to work
     with code written for MASM 5.1.

     The file SAMPLES.TXT is installed if you choose to install the
     sample code during the setup process.  SAMPLES.TXT contains
     information about the purpose of the samples, and about additional
     tools you may need to build some of the samples.

     ERRMSG.TXT File
     The file ERRMSG.TXT is installed in the directory in which you
     installed MASM.  This file contains information about error
     messages which are not documented in the Programmer's Guide or
     the MASM help files.

     MASM 6.1 includes two versions of the NMAKE project management 
     utility.  NMAKER.EXE is a real-mode version of the utility.  
     NMAKE.EXE is a driver program which first loads the MS-DOS extender 
     into memory, and then runs NMAKER.EXE.  Using the NMAKE.EXE driver 
     will result in faster build times.  Some development tools from 
     other manufacturers may be incompatible with NMAKE.EXE.  If you 
     encounter incompatibilities, use NMAKER.EXE instead.

     Working With Microsoft BASIC Far Strings
     The BASIC runtime function StringAssign does not correctly handle
     strings of zero length.  Instead of calling StringAssign to convert
     a zero-length string, simply return a near pointer to a doubleword 
     with the value 0.

     Using Control-C to Halt Operation of MASM
     MS-DOS applications running under DPMI, such as ML.EXE, may not 
     respond immediately to pressing Control-C.  If you press Control-C, 
     and ^C appears on the screen but you are not returned to MS-DOS, 
     press the Enter key.

     Assembling Files Generated by Compilers
     Many compilers support assembly-language output.  If you experience
     difficulty assembling the output of such compilers, you may need to
     assemble using the /Zm option.  In some cases (for instance, if the
     compiler inserts nondelimited comments or page numbers) it may be 
     necessary to edit the assembly-language output by hand.

     Using MASM 6.x Structures
     MASM 6.0 and 6.1 support a more powerful syntax for structure
     definition and usage than previous versions of MASM.  This more
     powerful syntax is enabled by default.  To use the older syntax,
     issue the OPTION OLDSTRUCTS directive (see Appendix A of the MASM
     Programmer's Guide for more information).

     Note: use of nested structures requires the new MASM 6.x syntax.
     If you use nested structures, the OPTION OLDSTRUCTS directive will
     be ignored for the structure which is nested.

     Differences Between MASM 6.0 and MASM 6.1
     MASM 6.1 uses a different encoding for the CMP <reg8>,<reg8> 
     instruction than MASM 6.0 did.  There is no difference in length or 
     processor timing.
======================< Part 4: Known Assembler Bugs >====================

     Exiting from MS-DOS Critical Errors
     MS-DOS critical errors, such as attempting to assemble a file on
     a drive which does not exist or is empty, produce the "Abort, Retry
     or Fail?" error message.  Selecting "Abort" when running MASM in 
     MS-DOS may cause memory to be corrupted.  This problem does not 
     occur when running MASM in Windows.  To avoid this problem, select
     "Retry" or "Fail", as appropriate.

     Expression Order in High-Level Conditionals
     Comparisons in high-level conditionals cannot begin with a literal.
     For instance, this comparison causes an error:

          .IF 1 == AX

     but this works properly:

          .IF AX == 1

     Initializing Nested Structures
     If one structure is nested within another, the inner structure's
     initializer list must either be empty or include a comma between
     every field.  For example, the structure INFO declared on page 123 
     of the Programmer's Guide contains a structure of type DISKDRIVES,
     which in turn contains three BYTE fields.  An object of type INFO
     could be initialized as:

          Info1 INFO { , , , , { }}      ; Inner initializer list is blank

     or as:

          Info1 INFO { , , , , {1, 2, }} ; Commas for all three fields

     but not as:

          Info1 INFO { , , , , {1, 2 }}  ; Error: missing last comma

     Span-Dependent Expressions used in Macros
     MASM 6.1 evaluates macro expressions only on the first pass of 
     assembly, but code and data are reevaluated on subsequent passes.
     Because of this, macro expressions which depend on the span between
     two addresses may not evaluate correctly.  For instance, the
     following code will not evaluate correctly:

               JMP Label2

          REPEAT Label2 - Label1  ; Evaluates incorrectly
               INC AX

     View the listing file to determine if a questionable macro expression
     was evaluated as desired.

     Span-Dependent Equates in Macros and EXTERNDEF ABS
     The ABS operator causes an identifier to be exported as a relocatable
     unsized constant (see Programmer's Guide page 220).  If ABS is used
     with EXTERNDEF within a macro, and the constant being exported
     depends on the difference between two addresses, the constant may not
     be exported correctly.  In some cases, the listing file will show the
     correct value, but the value in the resulting .obj will be incorrect.
     For instance, the following code will not evaluate correctly:

          EXTERNDEF TableSize:ABS  ; Will not be exported correctly

          Table1 LABEL BYTE
               DB 0, 1, 2
          TableSize EQU $-Table1

          SEG1 SEGMENT
          SEG1 ENDS

     To avoid this problem, either use the 'PUBLIC' directive in place of 
     'EXTERNDEF', or put a label before the equate, within the macro.

     Span-Dependent Text Equates
     The TEXTEQU operator is evaluated on the first assembly pass.  If
     TEXTEQU is used with an expression that depends on the difference
     between two addresses, the resulting constant may be incorrect.
     For instance, the following code will not evaluate correctly:

               JMP Label2
          WrongNum TEXTEQU %Label2-Label1 ; WrongNum will be incorrect

     Using The /link /nologo Command Line Options
     The /link command line option for ML causes all following parameters
     to be passed to the linker.  If the /nologo command line option for
     is passed to the linker, the linker may parse other parameters
     incorrectly.  To avoid this problem, use the /nologo command line 
     switch for ML rather than passing it to the linker.  For instance,

          ML hello.asm /link /nologo MYLIB.LIB


          ML /nologo hello.asm /link MYLIB.LIB

     Alternately, you may use the NMAKE utility to automate building
     your project.

     RET n Does Not Generate Epilogue
     In MASM 5.1, using RET followed by a constant would cause epilogue
     code to be generated.  MASM 6.1 does not generate epilogue code in
     this case.