home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mass61.zip / ML611D.EXE / README.TXT < prev    next >
Text File  |  1995-09-19  |  33KB  |  841 lines

  1.  
  2.                    README.TXT File
  3.  
  4.            Release Notes for the Microsoft(R) MASM
  5.         Professional Development System, Version 6.11d
  6.  
  7.      (C) Copyright 1994, Microsoft Corporation.  All rights reserved.
  8.                       
  9.      This document contains release notes for the Microsoft MASM 
  10.      Professional Development System, version 6.11d. The information in 
  11.      this document and in the Microsoft Advisor (on-line help) is more 
  12.      up-to-date than that in the manuals.
  13.  
  14.      The printed documentation for MASM 6.11 has not changed from MASM 6.1. 
  15.      The MASM 6.11 installation disks provide several important files that 
  16.      include new or updated information for this release. They are:
  17.  
  18.      README.TXT =====> Contains patch installation instructions, 
  19.                documentation errata, system requirements, information 
  20.                and tips on using MASM 6.11, and known assembler bugs.
  21.  
  22.      PENTIUM.TXT ====> Contains .586 and .586P directives information, 
  23.                descriptions of the new Intel(R) Pentium(TM) 
  24.                instructions, and a table of Pentium timings for all 
  25.                instructions.
  26.  
  27.      CV.TXT =========> Contains release notes for Microsoft CodeView(TM).
  28.  
  29.      ERRMSG.TXT =====> Contains updated information on 32-bit Linker errors,
  30.                ML error messages, and Microsoft DOSXNT MS-DOS 
  31.                Extender error messages.
  32.  
  33.      SAMPLES.TXT ====> Contains information about MASM samples for MS-DOS 
  34.                and Microsoft Windows 3.1.
  35.  
  36.      NTSAMPLE.TXT ===> Contains information about MASM samples for 
  37.                Microsoft Windows NT.
  38.  
  39.      SUPPORT.TXT ====> Contains updated Microsoft Product Support policies.
  40.   
  41. ======================< README.TXT Table of Contents >=====================
  42.  
  43.      Part 1: Patch Installation
  44.      --------------------------
  45.  
  46.      Part 2: Documentation Errata
  47.      ----------------------------
  48.  
  49.      Part 3: System Requirements
  50.      ---------------------------
  51.  
  52.      Part 4: Tips for Using MASM 6.1x
  53.      --------------------------------
  54.          - ALIAS directive
  55.          - Assembling Files Generated by Compiler
  56.          - Building 32-Bit Applications
  57.            - 32-Bit Linking
  58.            - GROUP Directive and Flat-Model Programming
  59.            - Structure Packing Issues for Mixed Language Programming
  60.            - /WIN32 Switch for H2INC
  61.          - CD-ROM Not a Valid Target
  62.          - CMP Instruction Encoding
  63.          - Debugging MASM Applications under Visual C++, 32-Bit 
  64.            Edition, or Fortran PowerStation, 32-Bit Edition      
  65.          - INVOKE Command
  66.          - LINK and System Resources
  67.          - MOUSE.COM
  68.          - MS-DOS and Windows NT File Compatibility
  69.          - Multi-File Assembly with MASM.EXE
  70.          - NMAKE and NMAKER
  71.          - Response Files
  72.          - SAMPLES.TXT and NTSAMPLE.TXT
  73.          - Using Control-C to Halt Operation of MASM
  74.          - Using MASM 6.x Structures
  75.          - Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
  76.          - Working with MASM 5.1 Code
  77.          - Working With Microsoft BASIC Far Strings
  78.          - .FPO directive new to MASM 6.11a
  79.  
  80.      Part 5: Known Assembler Bugs
  81.      ----------------------------
  82.          - Exiting from MS-DOS Critical Errors
  83.          - Expression Order in High-Level Conditionals
  84.          - Hexadecimal Constants
  85.          - Initializing Nested Structures
  86.          - Span-Dependent Expressions used in Macros
  87.          - Span-Dependent Equates in Macros and EXTERNDEF ABS
  88.          - Span-Dependent Text Equates
  89.          - STRUCT and RECORD Initialization
  90.  
  91.      Part 6: What Has Been Fixed in 6.11d?
  92.      -------------------------------------
  93.  
  94. ====================< Part 1: Patch Installation >=======================
  95.  
  96.      1. Make backup copies of the files affected by the patch.  These 
  97.     files are all in the MASM bin directory (for example, 
  98.     C:\MASM611\BIN).  The following files will be affected:
  99.  
  100.     ML.EXE
  101.     ML.ERR
  102.     H2INC.EXE
  103.     H2INC.ERR
  104.  
  105.      2. Change to your MASM 6.11 or 6.11a root directory.  For example:
  106.  
  107.     C:
  108.     CD \MASM611
  109.  
  110.      3. Copy the patch files to your MASM 6.11 or 6.11a root directory.  
  111.     The patch files are:
  112.  
  113.     PATCH.EXE
  114.     PATCH.RTD
  115.     PATCH.RTP
  116.  
  117.      4. Run the patch program by typing:
  118.  
  119.     PATCH
  120.  
  121.     The patch program indicates its actions as it runs.  When the 
  122.     patch has been successfully completed, you can delete the patch 
  123.     files.
  124.  
  125.      5. Copy H2INC.EXE and H2INC.ERR from the patch diskette to your 
  126.     \masm611\bin directory. 
  127.  
  128.      If you have trouble:
  129.      -----------------------
  130.  
  131.      If you have problems installing this patch: 
  132.  
  133.      - Check to be sure that you have all three patch files: 
  134.        PATCH.EXE, PATCH.RTP, and PATCH.RTD.
  135.  
  136.      - Make sure you have the correct version of the files to be updated.  
  137.        This patch will only patch files from MASM 6.11 or 6.11a.
  138.  
  139.      If, after checking these possibilities, you still have problems, 
  140.      please contact Microsoft Product Support.
  141.  
  142. ====================< Part 2: Documentation Errata >=======================
  143.  
  144.      Environment and Tools, Page xxiii: Microsoft Support Services
  145.      -------------------------------------------------------------
  146.      Microsoft Support Services information has been updated. See
  147.      SUPPORT.TXT, in the directory in which you installed MASM, for
  148.      the most current Microsoft support information and policies.
  149.      
  150.      
  151.      Environment and Tools, Page 582: LIB Command Line Sample
  152.      --------------------------------------------------------
  153.      The following example, as it appears on page 582, is incorrect:
  154.  
  155.      LIB FIRST +SECOND, , THIRD
  156.  
  157.      It should instead read:
  158.  
  159.      LIB THIRD +FIRST +SECOND
  160.  
  161.      
  162.      Environment and Tools, Page 649, 651: _syscall and __syscall
  163.      ------------------------------------------------------------
  164.      The H2INC documentation on pages 649 and 651 lists _syscall and
  165.      __syscall as C keywords recognized by H2INC. These are not recognized,
  166.      and should be removed.
  167.  
  168.      
  169.      Environment and Tools, Page 819: Error Message A2156
  170.      ----------------------------------------------------
  171.      The value range given for the first parameter of the PAGE directive
  172.      is incorrect; "...either 0 or a value in the range of 10-255" should
  173.      read "...either 0 or a value in the range of 14-255."
  174.      
  175.      
  176.      Reference, Page 12: ML Command-line Options /Cu and /Cx
  177.      -------------------------------------------------------
  178.      /Cu is not the default command-line option, but is indicated as such
  179.      in the MASM 6.1 Reference. Instead, /Cx should be indicated as the 
  180.      default.
  181.      
  182.      
  183.      Reference, Page 98: LEA is no longer optimized
  184.      ----------------------------------------------
  185.      The MASM 6.1 Reference indicates that the LEA instruction is
  186.      encoded as a MOV when the source operand is a direct memory address.
  187.  
  188.      In response to programmer requests, MASM 6.1x no longer performs this 
  189.      optimization automatically.  The optimization can be performed by 
  190.      using the OPATTR operator, as shown in the following macro:
  191.  
  192.       MOVLEA MACRO Dest, Symbol
  193.       IF (OPATTR(Symbol)) AND 08h
  194.            MOV Dest, OFFSET Symbol
  195.       ELSE
  196.            LEA Dest, Symbol
  197.       ENDIF
  198.       ENDM
  199.  
  200.      
  201.      Programmer's Guide, Page 156: Using an Emulator Library
  202.      -------------------------------------------------------
  203.      The sample code demonstrating floating-point instructions served
  204.      by an emulator contains the directive .STARTUP. This directive
  205.      should be removed.
  206.  
  207.      
  208.      Programmer's Guide, Page 202: User-Defined Epilogues & Prologues
  209.      ----------------------------------------------------------------
  210.      The documentation for user-defined epilogue and prologue code reads
  211.      "Your macro function must return the parmbytes parameter."  It
  212.      should read "...the localbytes parameter."
  213.  
  214.      
  215.      Programmer's Guide, Page 323: The C++/MASM Interface
  216.      ----------------------------------------------------
  217.      The second sentence in the third paragraph reads: "The linkage 
  218.      specification applies only to called routines, not to external
  219.      variables." It should read "The linkage specification applies to
  220.      called routines and external variables." The last sentence in the
  221.      same paragraph should be removed.
  222.      
  223.      
  224.      Help for Runtime Error R6921
  225.      ----------------------------
  226.      The on-line help for runtime error R6921 reads "...Possibly the
  227.      CONFIG.SYS file contained a line such as DEVICE=C:\OS\MM386.EXE..."
  228.      The file name should read "C:\DOS\EMM386.EXE".
  229.  
  230. =================< Part 3: MASM 6.11 System Requirements >=================
  231.  
  232.      The following are system requirements for Microsoft MASM 6.11:
  233.  
  234.      - Personal computer using a 386 or higher processor running MS-DOS 
  235.        version 3.3 or later, Windows version 3.1 or later, or Windows NT 
  236.        version 3.1 or later.
  237.      - 4 MB of available memory.
  238.      - Hard disk with 10 MB available space.
  239.      - One 3.5" high-density (1.44 MB) disk drive (3.5" low-density (720K) 
  240.        or 5.25" high-density (1.2 MB) disks available separately with 
  241.        coupon enclosed).
  242.  
  243.      To target Windows 3.1, you need one of the following:
  244.  
  245.      - Microsoft Windows Software Development Kit (SDK) 3.1.
  246.      - Microsoft Visual C++ Development System, Standard or Professional 
  247.        Edition.
  248.  
  249.      To target Windows NT, you need one of the following:
  250.  
  251.      - Microsoft Windows NT Software Development Kit (SDK).
  252.      - Microsoft Visual C++ Development System, 32-Bit Edition.
  253.  
  254. ====================< Part 4: Tips for Using MASM 6.11 >===================
  255.      
  256.      ALIAS directive
  257.      ---------------
  258.      The ALIAS directive is not included in the printed documentation
  259.      for MASM 6.11. The ALIAS directive can be used for creating 
  260.      libraries that allow the linker (LINK) to map an old function to 
  261.      a new function. 
  262.  
  263.      Syntax:    ALIAS  <alias> = <actual-name>
  264.  
  265.      where alias is the alternate or alias name, and actual-name is
  266.      the actual name of the function or procedure. The angle brackets
  267.      are required.
  268.  
  269.  
  270.      Assembling Files Generated by Compilers
  271.      ---------------------------------------
  272.      Many compilers support assembly-language output.  If you experience
  273.      difficulty assembling the output of such compilers, you may need to
  274.      assemble using the /Zm option.  In some cases (for instance, if the
  275.      compiler inserts nondelimited comments or page numbers) it may be 
  276.      necessary to edit the assembly-language output by hand.
  277.  
  278.  
  279.      Building 32-bit Applications
  280.      ----------------------------
  281.      Following are a number of items you should keep in mind when
  282.      building 32-bit applications with MASM 6.11. Examples of how to 
  283.      create 32-bit applications can be found in the \SAMPLES\NTSAMPLE 
  284.      subdirectory of the directory in which you installed MASM.
  285.  
  286.       32-bit Linking
  287.       --------------
  288.       When you are creating a 32-bit application, you must link 
  289.       separately with a 32-bit linker. To prepare your object files 
  290.       for 32-bit linking, assemble using the following switches:
  291.       
  292.       - /c (assembles without linking)
  293.       - /coff (causes object files to be created in Windows NT-
  294.         compatible common object file format)
  295.         
  296.       After assembling, link with your 32-bit linker. Refer to the 
  297.       documentation included with your particular 32-bit linker for 
  298.       specific information and instructions. In addition, the sample
  299.       NT applications in \SAMPLES\NTSAMPLE demonstrate the use of
  300.       /c, /coff, and a 32-bit linker.
  301.  
  302.       GROUP Directive and Flat-Model Programming
  303.       ------------------------------------------
  304.       The GROUP directive has no effect when used in 32-bit flat-model
  305.       programming. It is recommended that you not use the GROUP 
  306.       directive when programming in flat model.
  307.  
  308.       Structure Packing Issues for Mixed Language Programming
  309.       -------------------------------------------------------
  310.       Microsoft MASM uses /Zp1 as it's default setting for structure 
  311.       packing; this means that structures are not packed. Other 
  312.       languages may use other default settings for packing. For 
  313.       example, Microsoft C/C++ compilers prior to Visual C++ 32-bit 
  314.       edition use /Zp2; Visual C++ 32-bit edition uses /Zp8 as the 
  315.       default. Modules built using different structure packing may not 
  316.       be able to share structure data items, so care must be taken 
  317.       when using structures in mixed language programs.
  318.  
  319.       The packing size is a maximum, not a fixed, packing value. This 
  320.       means that a member must have a size equal to or larger than the 
  321.       packing limit before any packing is done. 
  322.  
  323.       MASM 6.11 now supports structure packing on 8 byte boundaries as 
  324.       well as 16 byte boundaries using the /Zp8 or /Zp16 switches. Older 
  325.       versions of Masm only allowed up to /Zp4 structure packing.
  326.  
  327.  
  328.       /WIN32 Switch for H2INC
  329.       -----------------------
  330.       Use the /WIN32 switch with H2INC to convert C header files to 
  331.       NT-compatible MASM include files. When you use the /WIN32 switch,
  332.       C int data types are converted to the 4-byte assembler equivalent
  333.       DWORD (signed int data types are converted to SDWORD). Without 
  334.       the /WIN32 switch, H2INC converts int data types to 2-byte WORD 
  335.       (and signed int data types to SWORD).
  336.  
  337.     
  338.      CD-ROM Not a Valid Target
  339.      -------------------------
  340.      A CD-ROM drive is not a valid installation target for MASM 6.11. Setup
  341.      may incorrectly list a CD-ROM drive on the target drive list. 
  342.  
  343.  
  344.      CMP Instruction Encoding
  345.      ------------------------
  346.      MASM 6.1x uses a different encoding for the CMP <reg8>,<reg8> 
  347.      instruction than MASM 6.0 did.  There is no difference in length or 
  348.      processor timing.
  349.  
  350.      
  351.      Debugging MASM Applications under Visual C++, 32-bit Edition, 
  352.      or Fortran PowerStation, 32-bit Edition
  353.      -------------------------------------------------------------
  354.      When debugging a pure MASM application under the 32-bit editions of
  355.      Visual C++ or Fortran PowerStation, you must link in the library 
  356.      file (.LIB) provided with these high-level languages (LIBC.LIB in 
  357.      Visual C++, LIBF.LIB with Fortran PowerStation). If you do not use 
  358.      the .LIB file included in the high-level language, you will receive 
  359.      an "Access Violation" error message when you attempt to run a MASM 
  360.      application in either the 32-bit Visual C++ or 32-bit Fortran 
  361.      PowerStation integrated development environment.
  362.      
  363.      
  364.      INVOKE Command
  365.      --------------
  366.      The MASM 6.x INVOKE command does not support transferring control
  367.      between 16-bit and 32-bit code segments. When the assembler
  368.      encounters an INVOKE command in a 16-bit segment, it assumes
  369.      that the procedure being invoked is also in a 16-bit segment; if
  370.      the assembler encounters an INVOKE in a 32-bit segment, it assumes
  371.      that the invoked procedure is also in a 32-bit segment.
  372.  
  373.      To avoid this problem, push the necessary parameters on the stack
  374.      and make the appropriate call instead of using INVOKE.
  375.  
  376.  
  377.      LINK and System Resources
  378.      -------------------------
  379.      You may encounter the following error message when running LINK on 
  380.      Windows 3.1:
  381.       
  382.       System resource exhausted. Abort, Retry, Fail?
  383.  
  384.      This may occur because LINK opens a large number of files, and the 
  385.      buffer for SHARE may have been exceeded. To fix this problem, edit 
  386.      your AUTOEXEC.BAT, setting the following values for SHARE:
  387.  
  388.       /L:500 /F:4096
  389.  
  390.      
  391.      MOUSE.COM
  392.      ---------
  393.      Microsoft Mouse Driver (MOUSE.COM) Version 8.20a is included with
  394.      MASM 6.11. If you have a later version of the Microsoft Mouse
  395.      installed on your system, it is recommended you use it instead of
  396.      the Mouse Driver included with MASM 6.11.
  397.      
  398.  
  399.      MS-DOS and Windows NT File Compatibility
  400.      ----------------------------------------
  401.      Files installed on the Microsoft Windows NT File System (NTFS) are 
  402.      accessible only on Microsoft Windows NT.  Files installed on the 
  403.      MS-DOS File System (FAT) are accessible on MS-DOS, Microsoft Windows, 
  404.      or Microsoft Windows NT.
  405.  
  406.  
  407.      Multi-File Assembly with MASM.EXE
  408.      ---------------------------------
  409.      When assembling multiple files with MASM.EXE, you must terminate the
  410.      command-line with a semi-colon or a comma (for example, MASM *.asm;). 
  411.      Failure to do this may cause the program to appear to hang if you are 
  412.      running Microsoft NT. If this does occur, you can terminate the program 
  413.      with Ctrl+C.
  414.      
  415.  
  416.      NMAKE and NMAKER
  417.      ----------------
  418.      MASM 6.11 includes two versions of the NMAKE project management 
  419.      utility.  NMAKER.EXE is a real-mode version of the utility.  
  420.      NMAKE.EXE is a driver program which first loads the MS-DOS extender 
  421.      DOSXNT into memory, and then runs NMAKER.EXE.  Using the NMAKE.EXE 
  422.      driver will result in faster build times.  Some development tools 
  423.      from other manufacturers may be incompatible with NMAKE.EXE.  If you 
  424.      encounter incompatibilities, use NMAKER.EXE instead.
  425.  
  426.  
  427.      Response Files
  428.      --------------
  429.      Information on response files is not included in the MASM 6.1 manuals;
  430.      however, this information can be found in "ML Command Line Options" 
  431.      in On-line help.
  432.      
  433.      
  434.      SAMPLES.TXT and NTSAMPLE.TXT
  435.      ----------------------------
  436.      SAMPLES.TXT contains information about the MASM samples for 
  437.      MS-DOS/Windows; NTSAMPLE.TXT contains information about the 
  438.      samples given for MASM for Windows NT. Both files include 
  439.      information about additional tools you may need to build some 
  440.      of the samples. If you choose to install the sample code during the 
  441.      setup process, both SAMPLES.TXT and NTSAMPLE.TXT are included. 
  442.      SAMPLES.TXT can be found in the \MASM611\SAMPLES subdirectory;
  443.      NTSAMPLE.TXT can be found in the \MASM611\SAMPLES\NTSAMPLE
  444.      subdirectory.
  445.  
  446.  
  447.      Using Control-C to Halt Operation of MASM
  448.      -----------------------------------------
  449.      MS-DOS applications running under DPMI, such as ML.EXE, may not 
  450.      respond immediately to pressing Control-C.  If you press Control-C, 
  451.      and ^C appears on the screen but you are not returned to MS-DOS, 
  452.      press the Enter key.
  453.  
  454.  
  455.      Using MASM 6.x Structures
  456.      -------------------------
  457.      MASM 6.x supports a more powerful syntax for structure definition 
  458.      and usage than previous versions of MASM.  This more powerful 
  459.      syntax is enabled by default.  To use the older syntax, issue 
  460.      the OPTION OLDSTRUCTS directive (see Appendix A of the MASM
  461.      Programmer's Guide for more information).
  462.  
  463.      Note: use of nested structures requires the new MASM 6.x syntax.
  464.      If you use nested structures, the OPTION OLDSTRUCTS directive will
  465.      be ignored for the structure which is nested.
  466.  
  467.  
  468.      Visual C++ 1.0/Fortran PowerStation 1.0 Compatibility
  469.      -----------------------------------------------------
  470.      There are specific steps you must take to use MASM 6.11 with 
  471.      Microsoft Visual C++ 1.0 or Microsoft Fortran PowerStation 1.0.  
  472.      If you wish to do mixed language programming with these products, it 
  473.      is recommended that:
  474.  
  475.      - You install Visual C++/Fortran PowerStation and MASM 6.11 in 
  476.        separate sub-directories.
  477.  
  478.      - You place \MSVC\BIN or \F32\BIN (your Visual C++ or Fortran 
  479.        PowerStation sub-directory) first on your path statement before 
  480.        \MASM611\BIN (your MASM 6.11 sub-directory).
  481.  
  482.      - You use NMAKE.EXE from MASM 6.11.  You can do this using various
  483.        methods, such as moving or renaming NMAKE.EXE installed in \MSVC
  484.        or \F32 thus causing the system to continue searching your path 
  485.        and use the NMAKE.EXE in \MASM611.
  486.  
  487.      Optionally, for MASM 6.11/Visual C++ mixed programming, you may
  488.      use NMAKER.EXE which is installed with both products.
  489.  
  490.      When using the LINK utility included with Visual C++ 1.0, you may 
  491.      encounter one or both of the following warnings:
  492.  
  493.       LINK : warning L4017: /r : unrecognized option name; option 
  494.                      ignored
  495.       CVPACK : warning CK4007 : unrecognized option /x; option 
  496.                     ignored
  497.      
  498.      These warnings do not affect the resulting program and should be
  499.      ignored.
  500.      
  501.  
  502.      Working with MASM 5.1 Code
  503.      --------------------------
  504.      MASM 6.x offers major advances over previous versions of MASM.
  505.      Some of these improvements require changes that make MASM 5.1
  506.      source code incompatible with MASM 6.x. To provide compatibility
  507.      with code written for MASM 5.1, MASM 6.x allows you to access
  508.      MASM 5.1 compatibility code in three ways:
  509.      
  510.       - By using the conversion driver MASM.EXE. MASM.EXE converts
  511.         your existing command-line options to the new syntax, adds
  512.         the compatibility option /Zm, and invokes ML.EXE.
  513.       
  514.       - By using ML.EXE with the /Zm option. You also need to
  515.         convert command-line options to the new syntax.
  516.       
  517.       - By placing the statement OPTION M510 at the beginning of
  518.         each file. You also need to convert command-line options
  519.         to the new syntax.
  520.         
  521.      In most cases, using the /Zm option or OPTION M510 will be the best
  522.      solution for assembling existing code. If you prefer to modify your
  523.      code so it can be assembled without /Zm or OPTION M510, do the
  524.      following:
  525.      
  526.      1. Add the appropriate OPTION directives to your code.
  527.  
  528.     - Always add the following:
  529.  
  530.       OPTION OLDSTRUCTS ; Supports old-style structures
  531.       OPTION OLDMACROS  ; Supports old-style macros
  532.       OPTION DOTNAME    ; Supports naming identifiers with
  533.                 ; a leading dot [.]
  534.  
  535.     - If your code does not specify the .386 or .386P directive, add
  536.       the following:
  537.  
  538.       OPTION EXPR16     ; Use 16-bit precision in expressions
  539.  
  540.     - If your code does not contain a .MODEL directive, add the
  541.       following:
  542.  
  543.       OPTION OFFSET:SEGMENT ; Specifies that the OFFSET operator
  544.                 ; defaults to segment-relative rather
  545.                 ; than group-relative
  546.  
  547.     - If your code does not contain a .MODEL directive or if the
  548.       .MODEL directive does not specify a language, add the following:
  549.  
  550.       OPTION NOSCOPED       ; Makes code labels global rather than
  551.                 ; local to the procedure in which they
  552.                 ; appear
  553.       OPTION PROC:PRIVATE   ; Makes code labels defined with PROC
  554.                 ; local unless specified otherwise
  555.  
  556.      2. Once your code assembles with the OPTION directives, remove each 
  557.     OPTION directive, one at a time, and reassemble the code after you 
  558.     remove each one.
  559.  
  560.     Usually, it is best to remove the OPTION directives in the 
  561.     opposite order in which you added them. In some cases, you may 
  562.     decide that you prefer the MASM 5.x compatibility behavior 
  563.     instead of the new MASM 6.x behavior. When this is true, do not 
  564.     remove the corresponding OPTION statement from your code. 
  565.     
  566.      For more information on assembling MASM 5.1 code, see Appendix A 
  567.      of the MASM Programmer's Guide.
  568.  
  569.      
  570.      Working With Microsoft BASIC Far Strings
  571.      ----------------------------------------
  572.      The BASIC runtime function StringAssign does not correctly handle
  573.      strings of zero length.  Instead of calling StringAssign to convert
  574.      a zero-length string, simply return a near pointer to a doubleword 
  575.      with the value 0.
  576.  
  577.      .FPO Directive
  578.      --------------
  579.  
  580.      FPO stands for Frame Pointer Omission. The .FPO directive is a feature 
  581.      added to MASM386 5.10.NT that controls the emission of debug records 
  582.      to the .debug$F segment or section of the object file. These records 
  583.      are the same records that the Microsoft Visual C++ 1.10 or Microsoft 
  584.      Fortran PowerStation compilers emit when they perform frame 
  585.      pointer elimination under /Oy and /Ox optimization control, respectively. 
  586.      Unlike the compiler, MASM never performs any such optimization. it simply 
  587.      passes on the information supplied by the programmer within this directive 
  588.      to the object file.
  589.  
  590.      The .FPO directive does not have to be used in order to debug assembly 
  591.      programs under the Microsoft Visual C++ 1.10 or Microsoft Fortran 
  592.      PowerStation debuggers whether they are stand alone Windows NT
  593.      applications or mixed language C\Assembly or Fortran\Assembly Windows 
  594.      NT applications. This directive has been implemented to provide better 
  595.      backward compatibility with assembly code written for MASM386 5.10.NT, 
  596.      which is provided with the Windows NT DDK.
  597.  
  598.      The FPO directive should only be used on naked procedures or those 
  599.      procedures not declared with proto and called with invoke. Also you do 
  600.      not need to use the .FPO directive to debug naked procedures or on 
  601.      procedures that use proto and invoke. 
  602.  
  603.  
  604.      The following 6 parameters are used within the directive as follows. 
  605.  
  606.      .FPO (  number of bytes in a procedures local variables divided by 4, 
  607.          number of bytes in a procedures parameters divided by 4,
  608.          number of bytes in a procedure prologue,
  609.          number of registers saved by a procedures prologue,
  610.          If EBP is allocated,
  611.          Frame Type )            
  612.  
  613.  
  614.     Parameters                                      Range 
  615.     ----------                                      -----
  616.     number of bytes in local variables / 4          >= 0
  617.     number of bytes in parameters / 4               0 - 65535
  618.     number of bytes in the procedure prologue       0 - 255
  619.     number of registers saved                       0 - 7
  620.     If EBP is allocated                             0 = false, 1 = true
  621.     Frame Type                                      0 - 2
  622.  
  623.     The valid values for the Frame Type parameter above are 
  624.  
  625.     FRAME_FPO   0
  626.     FRAME_TRAP  1
  627.     FRAME_TSS   2
  628.  
  629.     The C compiler only generates entries with FRAME_FPO. The other two 
  630.     types are used inside the NT kernel to all stack traces across trap 
  631.     and tss frames that can appear in ring 0 code.
  632.  
  633.  
  634.     Example Usages:
  635.  
  636.     1) 
  637.     aproc proc
  638.  
  639.         .FPO ( 0, 0, 0, 0, 0, 0 )       ; all params are zero. 
  640.         ret
  641.  
  642.     aproc endp
  643.  
  644.  
  645.     2)                      
  646.     .code
  647.         push    +000000001h             
  648.         call    aproc
  649.         add     esp, 04h
  650.         ret             
  651.  
  652.     aproc proc
  653.         
  654.         push    ebp
  655.         mov     ebp, esp
  656.  
  657.         .FPO ( 0, 1, 3, 1, 1, 0 )       ; 0 = no locals
  658.                         ; 1 = 4 byte param \ 4
  659.                         ; 3 = bytes in procedure prologue
  660.                         ; 1 = one register saved in prologue
  661.                         ; 1 = if EBP was allocated
  662.                         ; 0 = frame type of FPO
  663.  
  664.         mov     eax, dword ptr [ebp+8]  ; move the passed param to EAX.
  665.  
  666.         leave   
  667.         ret     00h
  668.  
  669.     aproc endp
  670.  
  671.  
  672.     See ERRMSG.TXT for a list of possible error messages that could 
  673.     be encountered when using the .FPO directive.   
  674.  
  675. ======================< Part 5: Known Assembler Bugs >====================
  676.  
  677.      Exiting from MS-DOS Critical Errors  
  678.      -----------------------------------
  679.      MS-DOS critical errors, such as attempting to assemble a file on
  680.      a drive which does not exist or is empty, produce the "Abort, Retry
  681.      or Fail?" error message.  Selecting "Abort" when running MASM in 
  682.      MS-DOS may cause memory to be corrupted.  This problem does not 
  683.      occur when running MASM in Windows.  To avoid this problem, select
  684.      "Retry" or "Fail", as appropriate.
  685.  
  686.  
  687.      Expression Order in High-Level Conditionals
  688.      -------------------------------------------
  689.      Comparisons in high-level conditionals cannot begin with a literal.
  690.      For instance, this comparison causes an error:
  691.  
  692.       .IF 1 == AX
  693.  
  694.      but this works properly:
  695.  
  696.       .IF AX == 1
  697.  
  698.  
  699.      Hexadecimal Constants
  700.      ---------------------
  701.      In some instances, ML might not generate the appropriate error
  702.      message if it encounters a hexadecimal constant that does not have
  703.      an appending "h". The following will help to ensure that hexadecimal 
  704.      constants are properly represented:
  705.  
  706.      - Make sure that all hexadecimal constants have an appending "h".
  707.      - Begin all hexadecimal constants with the numeral 0. This ensures
  708.        that the compiler will generate the appropriate error message
  709.        if it encounters a hexadecimal constant that does not end in "h".
  710.  
  711.      
  712.      Initializing Nested Structures ? 
  713.      ------------------------------
  714.      If one structure is nested within another, the inner structure's
  715.      initializer list must either be empty or include a comma between
  716.      every field.  For example, the structure INFO declared on page 123 
  717.      of the Programmer's Guide contains a structure of type DISKDRIVES,
  718.      which in turn contains three BYTE fields.  An object of type INFO
  719.      could be initialized as:
  720.  
  721.       Info1 INFO { , , , , { }}      ; Inner initializer list is blank
  722.  
  723.      or as:
  724.  
  725.       Info1 INFO { , , , , {1, 2, }} ; Commas for all three fields
  726.  
  727.      but not as:
  728.  
  729.       Info1 INFO { , , , , {1, 2 }}  ; Error: missing last comma
  730.      
  731.       
  732.      Span-Dependent Expressions used in Macros
  733.      -----------------------------------------
  734.      MASM 6.1x evaluates macro expressions only on the first pass of 
  735.      assembly, but code and data are reevaluated on subsequent passes.
  736.      Because of this, macro expressions which depend on the span between
  737.      two addresses may not evaluate correctly. For instance, the
  738.      following code will not evaluate correctly:
  739.  
  740.       Label1:
  741.            JMP Label2
  742.       Label2:
  743.  
  744.       REPEAT Label2 - Label1  ; Evaluates incorrectly
  745.            INC AX
  746.       END
  747.  
  748.      View the listing file to determine if a questionable macro expression
  749.      was evaluated as desired.
  750.  
  751.  
  752.      Span-Dependent Equates in Macros and EXTERNDEF ABS
  753.      --------------------------------------------------
  754.      The ABS operator causes an identifier to be exported as a relocatable
  755.      unsized constant (see Programmer's Guide page 220).  If ABS is used
  756.      with EXTERNDEF within a macro, and the constant being exported
  757.      depends on the difference between two addresses, the constant may not
  758.      be exported correctly.  In some cases, the listing file will show the
  759.      correct value, but the value in the resulting .obj will be incorrect.
  760.      For instance, the following code will not evaluate correctly:
  761.  
  762.       EXTERNDEF TableSize:ABS  ; Will not be exported correctly
  763.  
  764.       MAKETABLE MACRO
  765.       Table1 LABEL BYTE
  766.            DB 0, 1, 2
  767.       TableSize EQU $-Table1
  768.       ENDM
  769.  
  770.       SEG1 SEGMENT
  771.       MAKETABLE
  772.       SEG1 ENDS
  773.  
  774.      To avoid this problem, either use the 'PUBLIC' directive in place of 
  775.      'EXTERNDEF', or put a label before the equate, within the macro.
  776.  
  777.  
  778.      Span-Dependent Text Equates
  779.      ---------------------------
  780.      The TEXTEQU operator is evaluated on the first assembly pass.  If
  781.      TEXTEQU is used with an expression that depends on the difference
  782.      between two addresses, the resulting constant may be incorrect.
  783.      For instance, the following code will not evaluate correctly:
  784.  
  785.       Label1:
  786.            JMP Label2
  787.       Label2:
  788.       WrongNum TEXTEQU %Label2-Label1 ; WrongNum will be incorrect
  789.  
  790.  
  791.      STRUCT and RECORD Initialization
  792.      --------------------------------
  793.      If a STRUCT containing a UNION is initialized incorrectly, it is
  794.      possible that the compiler might not generate an appropriate error.
  795.      If the UNION contains a RECORD, the STRUCT is initialized to the
  796.      default value for the original UNION.
  797.      
  798.  
  799.      EQU Redefinition
  800.      ----------------
  801.  
  802.      EQU can be redefined when a text macro is used, the following example
  803.      illustrates this known bug.
  804.  
  805.      a EQU <T>
  806.      a EQU <U>   ; This second occurence should generate an error "A2005: 
  807.          ; symbol redefinition" because once "a" is defined as a 
  808.          ; text macro it cannot be redefined to be a different kind 
  809.          ; of symbol.
  810.  
  811.  
  812.      y EQU y     ; This statement is syntactically correct, but any attempt  
  813.          ; to use "y" and you'll receive "error A2123: text macro 
  814.          ; nesting level too deep".
  815.  
  816. =================< Part 6: What Has Been Fixed in 6.11d? >================
  817.  
  818.      - The opcode generated for the FSETPM instruction has been 
  819.        corrected.
  820.  
  821.      - Errors when using the ALIAS directive and creating COFF object 
  822.        files have been fixed. 
  823.  
  824.      - Errors when specifying an entry point with the END directive and 
  825.        creating COFF object files have been fixed. 
  826.  
  827.      - Errors when using the ORG directive to back patch the code being 
  828.        generated in a COFF object file have been fixed.
  829.  
  830.      - The extra byte in the listing file for instructions using 32-bit
  831.        addressing modes has been removed.
  832.  
  833.      - Unresolved externals that could occur when a symbol appeared more
  834.        than once in EXTERNDEF directives have been fixed.
  835.  
  836.      - You can now step through code in include files when building COFF
  837.        object files.
  838.  
  839.      - Various Access Violations when generating COFF object files have 
  840.        been fixed.
  841.