home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Iczelion / files / ML614.exe / README.TXT < prev    next >
Encoding:
Text File  |  1999-04-12  |  36.4 KB  |  956 lines

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