 Microsoft(R) Macro Assembler Reference


 for the MS-DOS(R) and OS/2 Operating Systems


 Microsoft Corporation
 Information in this document is subject to change without notice and does
 not represent a commitment on the part of Microsoft Corporation.  The
 software described in this document is furnished under a license agreement
 or nondisclosure agreement.  The software may be used or copied only in
 accordance with the terms of the agreement.  The purchaser may make one copy
 for backup purposes.  No part of this manual may be reproduced or
 transmitted in any form or by any means, electronic or mechanical, including
 photocopying and recording, for any purpose other than the purchaser's
 personal use without the written permission of Microsoft Corporation.


 (C) Copyright Microsoft Corporation, 1987, 1988.  All rights reserved.
 Simultaneously published in the U.S. and Canada.

 Printed and bound in the United States of America.

 Timings and encodings in this manual are used with permission of Intel and
 come from the following publications:

 Intel Corporation. iAPX 86, 88, 186 and 188 User's Manual, Programmer's
 Reference. Santa Clara, Calif. 1986.
 Intel Corporation. iAPX 286 Programmer's Reference Manual including the iAPX
 286 Numeric Supplement, Santa Clara, Calif. 1985.

 Intel Corporation. 80386 Programmer's Reference Manual. Santa Clara, Calif.
 1986
 Intel Corporation. 80387 80-bit CHMOS III Numeric Processor Extension. Santa
 Clara, Calif. 1987.
 Intel Corporation.  i486 Microprocessor, Santa Clara, Calif. 1989.

 Document No. 410610002-500-R01-1287
 10   9   8   7   6   5   4   3   2   1

 Part No. 04696



 Document Conventions


 KEY TERMS
 Bold type indicates text that must be typed exactly as shown. This includes
 assembly-language instructions, directives, symbols, and operators, as well
 as keywords in other languages.


 placeholders
 Italics indicate variable information supplied by the user.

 Examples
 This typeface indicates example programs, user input, and screen output.


 [optional items]
 Double brackets indicate that the enclosed item is optional.


 {choice1 |  choice2}
 Braces and a vertical bar indicate a choice between two or more items. You
 must choose one of the items unless double square brackets surround the
 braces.


 Repeating elements...
 Three dots following an item indicate that more items having the same form
 may be typed.

 SHIFT+F1
 Small capital letters indicate key names.



 Tools



 BIND

 The BIND utility converts an OS/2 program to run under both DOS and OS/2.

 Command-Line Syntax
 BIND infile [libraries] [options]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                              Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP                               Option name: /HELP. Calls QuickHelp
                                     for help on BIND.

 /MAP [ mapfile]                     Option name: /M[AP]. Generates a map
                                     of the DOS part of the executable file.

 /NAMES  functions/NAMES  @filename  Option name: /N[AMES]. Specifies
                                     functions supported under OS/2 only.
                                     Use with a list of functions separated
                                     by spaces or a file specification
                                     preceded by  @.
 Option                              Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                    preceded by  @.

 /NOLOGO                             Option name: /NOLOGO. Suppresses the
                                     BIND copyright message.

 /O  outfile                         Option name: /O[UTFILE]. Specifies the
                                     name for the bound application.

 /?                                  Option name: /?. Displays a brief
                                     summary of BIND command-line syntax.







 Environment Variables
露컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable    Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 LIB         Specifies search path for library files.
 LINK        Specifies default command-line options for the linker.
 TMPf        Specifies path for the VM.TMP file.




 Microsoft(R) CodeView(R) Debugger

 The Microsoft(R) CodeView(R) debugger runs the assembled or compiled program
 while simultaneously displaying the program source code, program variables,
 memory locations, processor registers, and other pertinent information.

 Command-Line Syntax
 CV [options] executablefile [arguments]
 CVP [options] executablefile [arguments]



 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /2                                Permits the use of two monitors.

 /25                               Starts in 25-line mode.

 /43                               Starts in 43-line mode.

 /50                               Starts in 50-line mode.

 /B                                Starts in black-and-white mode.

 /C commands                       Executes  commands on start-up.

 /D[ buffersize]                   Enables disk overlays (CV only).

 /E                                Enables use of expanded memory (CV only).

 /F                                Exchanges screens by flipping between
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/F                                Exchanges screens by flipping between
                                   video pages (CV only).

 /G                                Eliminates refresh snow on CGA monitors
                                   (CV only).

 /I[0 | 1]                         Turns nonmaskable-interrupt and
                                   8259-interrupt trapping on (/I1) or off
                                   (/I0) (CV only).

 /K                                Disables installation of keyboard
                                   monitors for the program being debugged.

 /L dll                            Loads symbolic information for the
                                   specified dynamic-link library (CVP
                                   only).

 /M                                Disables CodeView use of the mouse (use
                                   this option when debugging an
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  this option when debugging an
                                   application that supports the mouse).

 /N[0 | 1]                         /N0 tells CodeView to trap nonmaskable
                                   interrupts; /N1 tells it not to trap (CV
                                   only).

 /O                                Enables debugging of multiple processes
                                   (CVP only).

 /R                                Enables 80386/486 debug registers (CV
                                   only).

 /S                                Exchanges screens by changing buffers
                                   (primarily for use with graphics
                                   programs) (CV only).

 /TSF                              Toggles TOOLS.INI entry to read/not read
                                   the CURRENT.STS file.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  the CURRENT.STS file.

 /X                                Enables use of extended memory (CV only).







 Environment Variables

 variable     Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 HELPFILES    Specifies path of help files or list of help filenames.
 INIT         Specifies path for TOOLS.INI and CURRENT.STS files.




 CVPACK

 The CVPACK utility reduces the size of an executable file that contains
 CodeView debugging information.

 Command-Line Syntax
 CVPACK [options] exefile


 Options

 Option     Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP      Calls QuickHelp for help on CVPACK.
 /P         Packs the file to the smallest possible size.
 /?         Displays a brief summary of CVPACK command-line syntax.




 EXEHDR

 The EXEHDR utility displays and modifies the contents of an executable-file
 header.

 Command-Line Syntax
 EXEHDR [options]  filenames


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HEAP: number                     Option name: /HEA[P]. Sets the heap
                                   allocation field to  number bytes for
                                   segmented executable files.

 /HELP                             Option name: /HEL[P]. Calls QuickHelp
                                   for help on EXEHDR.

 /MAX: number                      Option name: /MA[X]. Sets the maximum
 Option                            action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/MAX: number                      Option name: /MA[X]. Sets the maximum
                                   memory allocation to  number paragraphs
                                   for DOS executable files.



 /MIN: number                      Option name: /MI[N]. Sets the minimum
                                   memory allocation to  number paragraphs
                                   for DOS executable files.

 /NEW                              Option name: /NE[WFILES]. Enables
                                   support for HPFS.

 /NOLOGO                           Option name: /NO[LOGO]. Suppresses the
                                   EXEHDR copyright message.

 /PM: type                         Option name: /P[MTYPE]. Sets the
                                   application type for OS/2 or Microsoft
                                   Windows[tm], where  type is one of the
 Option                            action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  Windows[tm], where  type is one of the
                                   following:  PM (or  WINDOWAPI),  VIO (or
                                   WINDOWCOMPAT), or  NOVIO (or
                                   NOTWINDOWCOMPAT).

 /RESET                            Option name: /R[ESETERROR]. Clears the
                                   error bit in the header of an OS/2 or
                                   Windows executable file.

 /STACK: number                    Option name: /S[TACK]. Sets the stack
                                   allocation to  number bytes.

 /V                                Option name: /V[ERBOSE]. Provides more
                                   information about segmented executable
                                   files, including the default flags in
                                   the segment table, all run-time
                                   relocations, and additional fields from
                                   the header.

 Option                            action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /?                                Option name: /?. Displays a brief
                                   summary of EXEHDR command-line syntax.






 EXP

 The EXP utility deletes all files in the hidden DELETED subdirectory of the
 current or specified directory. EXP is used along with RM and UNDEL to
 manage backup files.

 Command-Line Syntax
 EXP [options] [directories]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP                             Calls QuickHelp for help on EXP.

 /Q                                Suppresses display of deleted files.

 /R                                Recurses into subdirectories of the
                                   current or specified directory.

 /?                                Displays a brief summary of EXP
                                   command-line syntax.






 HELPMAKE

 The HELPMAKE utility creates help files and customizes the help files
 supplied with Microsoft language products.

 Command-Line Syntax
 HELPMAKE {/E[n] | /D[c] | /H | /?} [options] sourcefiles


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /A c                              Specifies  c as an application-specific
                                   control character for the help database,
                                   marking a line that contains special
                                   information for internal use by the
                                   application.

 /C                                Indicates that the context strings are
                                   case sensitive so that at run time all
                                   searches for help topics will be case
                                   sensitive.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  sensitive.

 /D                                Fully decodes the help database.

 /DS                               Splits the concatenated, compressed help
                                   database into its components, using
                                   their original names. No decompression
                                   occurs.

 /DU                               Decompresses the database and removes
                                   all screen formatting and
                                   cross-references.

 /E[ n]                            Creates ("encodes") a help database from
                                   a specified text file (or files). The
                                   optional  n indicates the amount of
                                   compression to take place. The value of
                                   n can range from 0 to 15.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /H[ELP]                           Calls the QuickHelp utility. If HELPMAKE
                                   cannot find QuickHelp or the help file,
                                   it displays a brief summary of HELPMAKE
                                   command-line syntax.

 /K filename                       Specifies a file containing
                                   word-separator characters. This file
                                   must contain a single line of characters
                                   that separate words. ASCII characters
                                   from 0 to 32 (including the space) and
                                   character 127 are always separators. If
                                   the /K option is not specified, the
                                   following characters are also considered
                                   separators:


 /L                                Locks the generated file so that it
                                   cannot be decoded by HELPMAKE at a later
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  cannot be decoded by HELPMAKE at a later
                                   time.

 /NOLOGO                           Suppresses the HELPMAKE copyright
                                   message.

 /O outfile                        Specifies  outfile as the name of the
                                   help database. The name  outfile is
                                   optional with the /D option.



 /S n                              Specifies the type of input file,
                                   according to the following  n values:

 /T                                During encoding, translates dot commands
                                   to application-specific commands. During
                                   decoding, translates application
                                   commands to dot commands. The /T option
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  commands to dot commands. The /T option
                                   forces /A:.

 /V[ n]                            Sets the verbosity of the diagnostic and
                                   informational output, depending on the
                                   value of  n. The value of  n can range
                                   from 0 to 6.

 /W width                          Sets the fixed width of the resulting
                                   help text in number of characters. The
                                   value of  width can range from 11 to 255.

 /?                                Displays a brief summary of HELPMAKE
                                   command-line syntax.





 H2INC

 The H2INC utility converts C header (.H) files into MASM- compatible include
 (.INC) files. It translates declarations and prototypes, but does not
 translate code.

 Command-Line SyntaxH2INC [options]  filename.H


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /C                                Passes comments in the .H file to the
                                   .INC file.

 /Fa [ filename]                   Specifies that the output file contain
                                   only equivalent MASM statements. This is
                                   the default.

 /Fc [ filename]                   Specifies that the output file contain
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/Fc [ filename]                   Specifies that the output file contain
                                   equivalent MASM statements plus original
                                   C statements converted to comment lines.

 /HELP                             Calls QuickHelp for help on H2INC.

 /Ht                               Enables generation of text equates. By
                                   default, text items are not translated.

 /Mn                               Instructs H2INC to explicitly declare
                                   the distances for all pointers and
                                   functions.

 /Ni                               Suppresses the expansion of nested
                                   include files.

 /Zn  string                       Adds  string to all names generated by
                                   H2INC. Used to eliminate name conflicts
                                   with other H2INC-generated include files.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  with other H2INC-generated include files.



 /Zu                               Makes all structure and union tag names
                                   unique.

 /?                                Displays a brief summary of H2INC
                                   command-line syntax.




 Note: H2INC also supports the following options from Microsoft C, version
 6.0: /AC, /AH, /AL, /AM, /AS, /AT, /D, /F, /Fi, /G0, /G1, /G2, /G3, /G4,
 /Gc, /Gd, /Gr, /I, /J, /Tc, /U, /u, /W0, /W1, /W2, /W3, /W4, /X, /Za, /Zc,
 /Ze, /Zp1, /Zp2, /Zp4.

 Environment Variables
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable                          Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 CL                                Specifies default command-line options.

 H2INC                             Specifies default command-line options.
                                   Appended after the CL environment
                                   variable.

 INCLUDE                           Specifies search path for include files.






 IMPLIB

 The IMPLIB utility creates import libraries used by LINK to link
 dynamic-link libraries with applications.

 Command-Line Syntax
 IMPLIB [options] implibname {dllfile... | deffile...}


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP                             Option name: /H[ELP]. Calls QuickHelp
                                   for help on IMPLIB.

 /NOI                              Option name: /NOI[GNORECASE]. Preserves
                                   case for entry names in DLLs.

 /NOLOGO                           Option name: /NOL[OGO]. Suppresses the
                                   IMPLIB copyright message.

 /?                                Option name: /?. Displays a brief
                                   summary of IMPLIB command-line syntax.





 LIB

 The LIB utility helps create, organize, and maintain run-time libraries.
 Command-Line SyntaxLIB inlibrary [options] [commands] [, [listfile] [,
 [outlibrary] ] ] [;]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP

 /IGN                              Option name: /I[GNORECASE]. Tells LIB to
                                   ignore case when comparing symbols (the
                                   default). Use to combine a library
                                   marked /NOI with an unmarked library to
                                   create a new case-insensitive library.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  create a new case-insensitive library.

 /NOE                              Option name: NOE[XTDICTIONARY]. Prevents
                                   LIB from creating an extended dictionary.

 /NOI                              Option name: /NOI[GNORECASE]. Tells LIB
                                   to preserve case when comparing symbols.
                                   When combining libraries, if any library
                                   is marked /NOI, the output library is
                                   case sensitive, unless /IGN is specified.

 /NOLOGO                           Option name: /NOL[OGO]. Suppresses the
                                   LIB copyright message.

 /PAGE: number                     Option name: /P[AGESIZE]. Specifies the
                                   page size (in bytes) of a new library or
                                   changes the page size of an existing
                                   library. The default for a new library
                                   is 16.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  is 16.

 /?                                Option name: /?. Displays a brief
                                   summary of LIB command-line syntax.






 Commands
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Operator                          Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 + name                            Appends an object file or library file.

  - name                           Deletes a module.

  -+ name                          Replaces a module by deleting it and
 Operator                          Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 -+ name                          Replaces a module by deleting it and
                                   appending an object file with the same
                                   name.

  * name                           Copies a module to a new object file.

  -* name                          Moves a module out of the library by
                                   copying it to a new object file and then
                                   deleting it.






 LINK

 The LINK utility combines object files into a single executable file or
 dynamic-link library.

 Command-Line Syntax
 LINK objfiles [, [exefile] [, [mapfile] [, [libraries] [, [deffile] ] ] ] ]
 [;]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /ALIGN: size                      Option name: /A[LIGNMENT]. Directs LINK
                                   to align segment data in a segmented
                                   executable file along the boundaries
                                   specified by  size bytes, where  size
                                   must be a power of two.

 /BATCH                            Option name: /B[ATCH]. Suppresses
                                   prompts for library or object files not
                                   found.

 /CO                               Option name: /CO[DEVIEW]. Adds symbolic
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/CO                               Option name: /CO[DEVIEW]. Adds symbolic
                                   data and line numbers needed by the
                                   Microsoft CodeView debugger. This option
                                   is incompatible with the /EXEPACK option.

 /CPARM: number                    Option name: /CP[ARMAXALLOC]. Sets the
                                   program's maximum memory allocation to
                                   number of 16-byte paragraphs.

 /DOSSEG                           Option name: /DO[SSEG]. Orders segments
                                   in the default order used by Microsoft
                                   high-level languages.

 /DSALLOC                          Option name: /DS[ALLOCATE]. Directs LINK
                                   to load all data starting at the high
                                   end of the data segment. The /DSALLOC
                                   option is for assembly-language programs
                                   that create DOS .EXE files.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /EXEPACK                          Option name: /E[XEPACK]. Packs the
                                   executable file. The /EXEPACK option is
                                   incompatible with either /INCR or /CO.
                                   Do not use /EXEPACK on a Windows program.

 /FARCALL                          Option name: /F[ARCALLTRANSLATION].
                                   Optimizes far calls. The /FARCALL option
                                   is on automatically when using /TINY.
                                   Use the /PACKC option with /FARCALL when
                                   linking for OS/2; /PACKC is not
                                   recommended with /FARCALL when linking
                                   for Windows.

 /HELP                             Option name: /HE[LP]. Calls QuickHelp
                                   for help on LINK.

 /HIGH                             Option name: /HI[GH]. Places the
                                   executable file as high in memory as
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  executable file as high in memory as
                                   possible. Use /HIGH with the /DSALLOC
                                   option. This option is for
                                   assembly-language programs that create
                                   DOS .EXE files.

 /INCR                             Option name: /INC[REMENTAL]. Prepares
                                   for incremental linking with ILINK. This
                                   option is incompatible with /EXEPACK and
                                   /TINY.

 /INFO                             Option name: /INF[ORMATION]. Displays to
                                   the standard output the phase of linking
                                   and names of object files being linked.

 /LINE                             Option name: /LI[NENUMBERS]. Adds
                                   source-file line numbers and associated
                                   addresses to the map file. The object
                                   file must be created with line numbers.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  file must be created with line numbers.
                                   This option creates a map file even if
                                   mapfile is not specified.

 /MAP                              Option name: /M[AP]. Adds public symbols
                                   to the map file.

 /NOD[: libraryname]               Option name: /NOD[EFAULTLIBRARYSEARCH].
                                   Ignores the specified default library.
                                   Specify without  libraryname to ignore
                                   all default libraries.

 /NOE                              Option name: /NOE[XTDICTIONARY].
                                   Prevents LINK from searching extended
                                   dictionaries in libraries. Use /NOE when
                                   redefinition of a symbol causes error
                                   L2044.

 /NOFARCALL                        Option name: /NOF[ARCALLTRANSLATION].
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/NOFARCALL                        Option name: /NOF[ARCALLTRANSLATION].
                                   Turns off far-call optimization.

 /NOI                              Option name: /NOI[GNORECASE]. Preserves
                                   case in identifiers.

 /NOLOGO                           Option name: /NOL[OGO]. Suppresses the
                                   LINK copyright message

 /NONULLS                          Option name: /NON[ULLSDOSSEG]. Orders
                                   segments as with the /DOSSEG option, but
                                   with no additional bytes at the
                                   beginning of the _TEXT segment (if
                                   defined). This option overrides /DOSSEG.

 /NOPACKC                          Option name: /NOP[ACKCODE]. Turns off
                                   code segment packing.

 /PACKC[: number]                  Option name: /PACKC[ODE]. Packs
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/PACKC[: number]                  Option name: /PACKC[ODE]. Packs
                                   neighboring code segments together.
                                   Specify  number bytes to set the maximum
                                   size for physical segments formed by
                                   /PACKC.

 /PACKD[: number]                  Option name: /PACKD[ATA]. Packs
                                   neighboring data segments together.
                                   Specify  number bytes to set the maximum
                                   size for physical segments formed by
                                   /PACKD. This option is for OS/2 and
                                   Windows only.

 /PAUSE                            Option name: /PAU[SE]. Pauses during the
                                   link session for disk changes.

 /PM: type                         Option name: /PM[TYPE]. Specifies the
                                   type of Windows or OS/2 application
                                   where  type is one of the following:  PM
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  where  type is one of the following:  PM
                                   (or  WINDOWAPI),  VIO (or  WINDOWCOMPAT),
                                   or  NOVIO (or  NOTWINDOWCOMPAT).

 /STACK: number                    Option name: /ST[ACK]. Sets the stack
                                   size to  number bytes, from 1 byte to
                                   64K.

 /TINY                             Option name: /T[INY]. Creates a
                                   tiny-model DOS program with a .COM
                                   extension instead of .EXE. Incompatible
                                   with /INCR.

 /?                                Option name: /?. Displays a brief
                                   summary of LINK command-line syntax.



 Note: Several rarely used options not listed above are described in online
 help.

 Environment Variables
露컴컴컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable         Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 INIT             Specifies path for the TOOLS.INI file.
 LIB              Specifies search path for library files.
 LINK             Specifies default command-line options.
 TMP              Specifies path for the VM.TMP file.




 MASM

 The MASM program converts command-line options from MASM style to ML style,
 adds options to maximize compatibility, and calls ML.EXE.

 Command-Line Syntax
 MASM [options] sourcefile [, [objectfile] [, [listingfile]
 [, [crossreferencefile] ] ] ] [;]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /A                                Orders segments alphabetically. Results
                                   in a warning. Ignored.

 /B                                Sets internal buffer size. Ignored.

 /C                                Creates a cross-reference file.
                                   Translated to /FR.

 /D                                Creates a Pass 1 listing. Ignored.

 /D symbol[ = value]               Defines a symbol. Unchanged.

 /E                                Emulates floating-point instructions.
                                   Translated to /FPi.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  Translated to /FPi.

 /H                                Lists command-line arguments. Translated
                                   to /help.

 /HELP                             Calls QuickHelp for help on the MASM
                                   driver.

 /I  pathname                      Specifies an include path. Unchanged.

 /L                                Creates a normal listing. Translated to
                                   /Fl.

 /LA                               Lists all. Translated to /Fl and /Sa.

 /ML                               Treats names as case sensitive.
                                   Translated to /Cp.

 /MU                               Converts names to uppercase. Translated
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/MU                               Converts names to uppercase. Translated
                                   to /Cu.

 /MX                               Preserves case on nonlocal names.
                                   Translated to /Cx.

 /N                                Suppresses table in listing file.
                                   Translated to /Sn.

 /P                                Checks for impure code. Use  OPTION
                                   READONLY. Ignored.

 /S                                Orders segments sequentially. Results in
                                   a warning. Ignored.

 /T                                Enables terse assembly. Translated to
                                   /nologo.

 /V                                Enables verbose assembly. Ignored.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/V                                Enables verbose assembly. Ignored.

 /W0                               Enables warning level 0. Unchanged.

 /W1                               Enables warning level 1. Unchanged.

 /W2                               Enables warning level 2. Unchanged.

 /X                                Lists false conditionals. Translated to
                                   /Sx.

 /Z                                Displays error lines on screen. Ignored.

 /ZD                               Generates line numbers for CodeView.
                                   Translated to /Zd.

 /ZI                               Generates symbols for CodeView.
                                   Translated to /Zi.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴






 Environment Variables
露컴컴컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable         Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 INCLUDE          Specifies default path for .INC files.
 MASM             Specifies default command-line options.
 TMP              Specifies path for temporary files.





 ML

 The ML program assembles and links one or more assembly-language source
 files. The command-line options are case sensitive.

 Command-Line Syntax
 ML [options]  filename [ [options]  filename]... [/link linkoptions]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /AT                               Enables tiny-memory-model support.
                                   Enables error messages for code
                                   constructs that violate the requirements
                                   for .COM format files. Note that this is
                                   not equivalent to the  .MODEL  TINY
                                   directive.

 /Bl  filename                     Selects an alternate linker.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /c

 /Cp                               Preserves case of all user identifiers.

 /Cu                               Maps all identifiers to uppercase
                                   (default).

 /Cx                               Preserves case in public and extern
                                   symbols.

 /D symbol[ = value]               Defines a text macro with the given name.
                                   If  value is missing, it is blank.
                                   Multiple tokens separated by spaces must
                                   be enclosed in quotation marks.

 /EP                               Generates a preprocessed source listing
                                   (sent to STDOUT). See /Sf.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴



 /F  hexnum                        Sets stack size to  hexnum bytes (this
                                   is the same as /link /STACK: number).
                                   The value must be expressed in
                                   hexadecimal notation. There must be a
                                   space between /F and  hexnum.

 /Fb [ filename]                   Creates a bound executable file.

 /Fe  filename                     Names the executable file.

 /Fl [ filename]                   Generates an assembled code listing. See
                                   /Sf.

 /Fm [ filename]                   Creates a linker map file.

 /Fo  filename                     Names an object file.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/Fo  filename                     Names an object file.

 /FPi                              Generates emulator fixups for
                                   floating-point arithmetic
                                   (mixed-language only).

 /Fr [ filename]                   Generates a source browser .SBR file.

 /FR [ filename]                   Generates an extended form of a source
                                   browser .SBR file.

 /Gc                               Specifies use of FORTRAN- or
                                   Pascal-style function calling and naming
                                   conventions. Same as  OPTION
                                   LANGUAGE:PASCAL.

 /Gd                               Specifies use of C-style function
                                   calling and naming conventions. Same as
                                   OPTION  LANGUAGE:C.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  OPTION  LANGUAGE:C.

 /H  number                        Restricts external names to  number
                                   significant characters. The default is
                                   31 characters.

 /help                             Calls QuickHelp for help on ML.

 /I  pathname                      Sets path for include file. A maximum of
                                   10 /I options is allowed.

 /nologo                           Suppresses messages for successful
                                   assembly.

 /Sa                               Turns on listing of all available
                                   information.

 /Sf                               Adds first-pass listing to listing file.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /Sg                               Turns on listing of assembly-generated
                                   code.

 /Sl  width                        Sets the line width of source listing in
                                   characters per line. Range is 60 to 255
                                   or 0. Default is 0. Same as  PAGE  ,
                                   width.

 /Sn                               Turns off symbol table when producing a
                                   listing.

 /Sp  length                       Sets the page length of source listing
                                   in lines per page. Range is 10 to 255 or
                                   0. Default is 0. Same as  PAGE  length.

 /Ss  text                         Specifies  text for source listing. Same
                                   as  SUBTITLE  text.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /St  text                         Specifies title for source listing. Same
                                   as  TITLE  text.

 /Sx                               Turns on false conditionals in listing.

 /Ta  filename                     Assembles source file whose name does
                                   not end with the .ASM extension.

 /w                                Same as /W0.

 /W level                          Sets the warning level: level 0, 1, 2,
                                   or 3.



 /WX                               Returns an error code if warnings are
                                   generated.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /Zd                               Generates line-number information in
                                   object file.

 /Zf                               Makes all symbols public.

 /Zi                               Generates CodeView information in object
                                   file.

 /Zm                               Enables  M510 option for maximum
                                   compatibility with MASM 5.1.

 /Zp [ alignment]                  Packs structures on the specified byte
                                   boundary. The  alignment may be 1, 2, or
                                   4.

 /Zs                               Performs a syntax check only.

 /?                                Displays a brief summary of ML
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/?                                Displays a brief summary of ML
                                   command-line syntax.







 QuickAssembler Support

 For compatibility with QuickAssembler makefiles, ML recognizes the following
 options:
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /a                                Orders segments alphabetically. In MASM
                                   6.0, the  .ALPHA directive must be used.
                                   Ignored.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  Ignored.

 /Cl                               Equivalent to /Cp.

 /Ez                               Prints the source for error lines to the
                                   screen. This option is no longer
                                   supported and is ignored by MASM 6.0.

 /P1                               Performs one-pass assembly. MASM 6.0
                                   always performs a single pass through
                                   the source file. This option is ignored
                                   by MASM 6.0.

 /P2                               Performs two-pass assembly. MASM 6.0
                                   always performs a single pass through
                                   the source file. This option is ignored
                                   by MASM 6.0.

 /s                                Orders segments sequentially. In MASM
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/s                                Orders segments sequentially. In MASM
                                   6.0, the  .SEQ directive must be used.
                                   Ignored.

 /Sq                               Equivalent to /Sl0 /Sp0.






 Environment Variables
露컴컴컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable         Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 INCLUDE          Specifies search path for include files.
 ML               Specifies default command-line options.
 TMP              Specifies path for temporary files.



 NMAKE

 The NMAKE utility automates the process of compiling and linking project
 files.

 Command-Line Syntax
 NMAKE [options] [macros] [targets]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /A                                Executes all commands even if targets
                                   are not out-of-date.

 /C                                Suppresses the NMAKE copyright message
                                   and prevents nonfatal error or warning
                                   messages from being displayed.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  messages from being displayed.

 /D                                Displays the modification time of each
                                   file when the times of targets and
                                   dependents are checked.

 /E                                Causes environment variables to override
                                   macro definitions within description
                                   files.

 /F  filename                      Specifies  filename as the name of the
                                   description file to use. If a dash (-)
                                   is entered instead of a filename, NMAKE
                                   reads the description file from the
                                   standard input device.If /F is not
                                   specified, NMAKE uses MAKEFILE as the
                                   description file. If MAKEFILE does not
                                   exist, NMAKE builds command-line targets
                                   using inference rules.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  using inference rules.

 /HELP                             Calls QuickHelp for help on NMAKE.

 /I                                Ignores exit codes from commands in the
                                   description file. NMAKE continues
                                   executing the rest of the description
                                   file despite the errors.

 /N                                Displays but does not execute commands
                                   from the description file.

 /NOLOGO                           Suppresses the NMAKE copyright message.

 /P                                Displays all macro definitions,
                                   inference rules, target descriptions,
                                   and the . SUFFIXES list.

 /Q                                Checks modification times of
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/Q                                Checks modification times of
                                   command-line targets (or first target in
                                   the description file if no command-line
                                   targets are specified). NMAKE returns a
                                   zero exit code if all such targets are
                                   up-to-date and a nonzero exit code if
                                   any target is out-of-date. Only
                                   preprocessing commands in the
                                   description file are executed.

 /R                                Ignores inference rules and macros that
                                   are defined in the TOOLS.INI file or are
                                   predefined.

 /S                                Suppresses display of commands as they
                                   are executed.

 /T                                Changes modification times of
                                   command-line targets (or first target in
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  command-line targets (or first target in
                                   the description file if no command-line
                                   targets are specified) to the current
                                   time. Only preprocessing commands in the
                                   description file are executed. The
                                   contents of target files are not
                                   modified.

 /X  filename                      Sends all error output to  filename,
                                   which can be either a file or a device.
                                   If a dash (-) is entered instead of a
                                   filename, the error output is sent to
                                   the standard output device.

 /Z                                Internal option for use by the Microsoft
                                   Programmer's WorkBench (PWB).

 /?                                Displays a brief summary of NMAKE
                                   command-line syntax.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  command-line syntax.






 Environment Variable
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable                          Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 INIT                              Specifies path for TOOLS.INI file, which
                                   may contain macros, inference rules, and
                                   description blocks.





 PWB (Programmer's WorkBench)

 The Microsoft Programmer's WorkBench (PWB) provides an integrated
 environment for developing programs in assembly language. The command-line
 options are case sensitive.

 Command-Line Syntax
 PWB [options] [files]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /D[ init]                         Prevents PWB from examining
                                   initialization files, where  init is one
                                   or more of the following characters:

                                   A    Disable autoload extensions
                                   (including language-specific extensions
                                   and online help)
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  and online help)

                                   S    Ignore CURRENT.STS

                                   T    Ignore TOOLS.INI

                                   If the /D option does not include an
                                   init character, it is equivalent to
                                   specifying /DAST (all files


 /e  cmdstr                        Executes the command or sequence of
                                   commands at start-up. The entire  cmdstr
                                   argument must be placed in double
                                   quotation marks if it contains a space.
                                   If  cmdstr contains literal double
                                   quotation marks, place a backslash (\)
                                   in front of each double quotation mark.
                                   To include a literal backslash in the
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  To include a literal backslash in the
                                   command string, use double backslashes
                                   (\\).

 /m  mark                          Moves the cursor to the specified  mark
                                   instead of moving it to the last known
                                   position. The mark can be a line number.

 /P[ init]                         Specifies a program list for PWB to read,
                                   where  init can be

                                   F file    Read a foreign program list
                                   (one not created using PWB).

                                   L         Read the last program list.
                                   Use this option to start PWB in the same
                                   state you left it.

                                   P file    Read a PWB program list.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  P file    Read a PWB program list.

 /r                                Starts PWB in no-edit mode. Functions
                                   that modify files are disallowed.

 [ [/t]  file...]                  Loads the specified file at start-up.
                                   The  file specification can contain
                                   wildcards. If multiple  files are
                                   specified, PWB loads only the first file.
                                   When the  Exit function is invoked, PWB
                                   saves the current file and loads the
                                   next file in the list. Files specified
                                   with /t are temporary; PWB does not add
                                   them to the file history on the File
                                   menu.

                                   No other options can follow /t on the
                                   command line. Each temporary file must
                                   be specified in a separate /t option.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  be specified in a separate /t option.

 /?                                Displays a brief summary of PWB
                                   command-line syntax.





 Environment Variables
露컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable     Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 HELPFILES    Specifies path of help files or list of help filenames.
 INIT         Specifies path for TOOLS.INI and CURRENT.STS files.
 TMP          Specifies path for temporary files.




 PWBRMAKE

 PWBRMAKE converts the .SBR files created by the assembler into database .BSC
 files that can be read by the Microsoft Programmer's WorkBench (PWB) Source
 Browser. The command-line options are case sensitive.

 Command-Line Syntax
 PWBRMAKE [options] sbrfiles


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /Ei  filename/Ei ( filename...)   Excludes the contents of the specified
                                   include files from the database. To
                                   specify multiple filenames, separate
                                   them with spaces and enclose the list in
                                   parentheses.

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 /Em                               Excludes symbols in the body of macros.
                                   Use /Em to include only macro names.

 /Es                               Excludes from the database every include
                                   file specified with an absolute pathname
                                   or found in an absolute path specified
                                   in the INCLUDE environment variable.



 /HELP                             Calls QuickHelp for help on PWBRMAKE.

 /Iu                               Includes unreferenced symbols.

 /n                                Forces a nonincremental build and
                                   prevents truncation of .SBR files.

 /o  filename                      Specifies a name for the database file.
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
/o  filename                      Specifies a name for the database file.

 /v                                Displays verbose output.

 /?                                Displays a brief summary of PWBRMAKE
                                   command-line syntax.





 QuickHelp

 The QuickHelp utility displays online help files. All MASM reserved words
 and error messages can be used for topic.

 Command-Line Syntax
 QH [options] [topic]


 Options
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /d  filename                      Specifies either a specific database
                                   name or a path where the databases are
                                   found.

 /l number                         Specifies the number of lines the
                                   QuickHelp window should occupy.

 /m number                         Changes the screen mode to display the
                                   specified number of lines, where  number
                                   is in the range 25 to 60.

 /p  filename                      Sets the name of the paste file.

 /pa [ filename]                   Specifies that pasting operations are
                                   appended to the current paste file
                                   (rather than overwriting the file).
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  (rather than overwriting the file).

 /q                                Prevents the version box from being
                                   displayed when QuickHelp is installed as
                                   a keyboard monitor.

 /r  command                       Specifies the command that QuickHelp
                                   should execute when the right mouse
                                   button is pressed. The  command can be
                                   one of the following letters:

                                   l    Display last topic

                                   i    Display history of help topics

                                   w    Hide window

                                   b    Display previous topic

 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

                                   e    Find next topic

                                   t    Display contents

 /s                                Specifies that clicking the mouse above
                                   or below the scroll box causes QuickHelp
                                   to scroll by lines rather than by pages.

 /sg number                        Specifies the number of screen groups
                                   that QuickHelp should monitor, where
                                   number is in the range 1 to 12. This
                                   option is valid only when QuickHelp is
                                   detached from an OS/2 protected-mode
                                   screen group.

 /t  name                          Directs QuickHelp to copy the specified
                                   section of the given topic to the
                                   current paste file and exit. The  name
 Option                            Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
                                  current paste file and exit. The  name
                                   may be

                                   All      Paste the entire topic

                                   Syntax   Paste the syntax only

                                   Example  Paste the example only

                                   If the topic is not found, QuickHelp
                                   returns an exit code of 1.

 /u                                Specifies that QuickHelp is being run by
                                   a utility. If the topic specified on the
                                   command line is not found, QuickHelp
                                   immediately exits with an exit code of 3.






 Environment Variables
露컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Variable     Description
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 HELPFILES    Specifies path of help files or list of help filenames.
 QH           Specifies default command-line options.
 TMP          Specifies directory of default paste file.




 RM

 The RM utility moves a file to a hidden DELETED subdirectory of the
 directory containing the file. Use the UNDEL utility to recover the file and
 the EXP utility to expunge the hidden file.

 Command-Line Syntax
 RM [options] [files]


 Options
露컴컴컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option         Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /F             Deletes read-only files without prompting.
 /HELP          Calls QuickHelp for help on RM.
 /I             Inquires for permission before removing each file.
 /K             Keeps read-only files without prompting.
 /R  directory  Recurses into subdirectories of the specified directory.
 /?             Displays a brief summary of RM command-line syntax.




 UNDEL

 The UNDEL utility moves a file from a hidden DELETED subdirectory to the
 parent directory. UNDEL is used along with EXP and RM to manage backup
 files.

 Command-Line Syntax
 UNDEL [{option | files}]


 Options
露컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 Option     Action
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 /HELP      Calls QuickHelp for help on UNDEL.
 /?         Displays a brief summary of UNDEL command-line syntax.





 Cross-References



 Topical Cross-Reference for Directives


 Simplified Segment
 .MODEL
 .STARTUP
 .EXIT
 .CODE
 .STACK
 .DATA
 .DATA?
 .FARDATA
 .FARDATA?
 .CONST
 .DOSSEG


 Segment
 SEGMENT
 ENDS
 GROUP
 ASSUME
 END
 .ALPHA
 .DOSSEG
 .SEQ


 Conditional Assembly
 IF
 IFE
 IFB/IFNB
 IFDEF/IFNDEF
 IFDIF/IFDIFI
 IFIDN/IFIDNI
 ELSE
 ENDIF


 Macros
 MACRO
 LOCAL
 PURGE
 GOTO
 ENDM
 EXITM


 Data Allocation
 BYTE/SBYTE
 WORD/SWORD
 DWORD/SDWORD
 FWORD
 QWORD
 TBYTE
 LABEL
 ALIGN
 EVEN
 ORG
 REAL4
 REAL8
 REAL10


 Code Labels
 LABEL
 ALIGN
 EVEN
 ORG


 Scope
 PUBLIC
 EXTERNDEF
 EXTERN
 COMM
 INCLUDELIB


 Structure and Record
 RECORD
 STRUCT
 UNION
 ENDS
 TYPEDEF


 String
 CATSTR
 SIZESTR
 SUBSTR
 INSTR


 Equates
 EQU
 =
 TEXTEQU


 Repeat Blocks
 REPEAT
 WHILE
 FOR
 FORC
 ENDM
 GOTO


 Conditional Control Flow
 .IF
 .ELSE
 .ELSEIF
 .ENDIF
 .WHILE
 .ENDW
 .REPEAT
 .UNTIL/
 .UNTILCXZ
 .BREAK
 .CONTINUE


 Listing Control
 TITLE
 SUBTITLE
 PAGE
 .LIST
 .NOLIST
 .LISTIF
 .NOLISTIF
 .TFCOND
 .LISTMACROALL
 .NOLISTMACRO
 .LISTMACRO
 .CREF
 .NOCREF
 .LISTALL


 Conditional Error
 .ERR
 .ERRE
 .ERRNZ
 .ERRB
 .ERRNB
 .ERRDEF
 .ERRNDEF
 .ERRDIF/.ERRDIFI
 .ERRIDN/.ERRIDNI


 Processor
 .8086    .486
 .186    .486P
 .286    .8087
 .286P    .287
 .386    .387
 .386P    .NO87


 Procedures
 PROC
 ENDP
 PROTO
 INVOKE
 USES


 Miscellaneous
 OPTION
 COMMENT
 ECHO
 .RADIX
 END
 PUSHCONTEXT
 POPCONTEXT
 INCLUDE
 INCLUDELIB
 ASSUME




 Topical Cross-Reference for Symbols


 Segment Information
 @code
 @CodeSize
 @CurSeg
 @data
 @DataSize
 @fardata
 @fardata?
 @Model
 @stack
 @WordSize


 Macro Functions
 @CatStr
 @InStr
 @SizeStr
 @SubStr


 Environment Information
 @Cpu
 @Environ
 @Interface
 @Version


 Date and Time Information
 @Date
 @Time


 File Information
 @FileCur
 @FileName
 @Line


 Miscellaneous
 $
 ?
 @@:
 @B
 @F


 Topical Cross-Reference for Operators


 Arithmetic
 +    MOD
 -    .
 *    []
 /


 Macro
 <>    %
 !    &
 ;;


 Relational
 EQ    GE
 NE    LT
 GT    LE


 Logical
 and ShiftAND
 OR
 XOR
 NOT
 SHL
 SHR


 Record
 MASK
 WIDTH


 Segment
 :
 SEG
 OFFSET
 LROFFSET


 Type
 HIGH
 HIGHWORD
 LOW
 LOWWORD
 PTR
 SHORT
 SIZE
 SIZEOF
 LENGTH
 LENGTHOF
 THIS
 TYPE
 OPATTR


 Control Flow
 !    = =
 !=    >=
 &&    <=
 ||    >
 &    <


 Miscellaneous
 ;    :
 DUP    ::
 "  "    ' '
 CARRY?
 OVERFLOW?
 PARITY?
 SIGN?
 ZERO?



 Directives

  name =  expression
 Assigns the numeric value of  expression to  name. The symbol may be
 redefined later.


 .186
 Enables assembly of instructions for the 80186 processor; disables assembly
 of instructions introduced with later processors. Also enables 8087
 instructions.


 .286
 Enables assembly of nonprivileged instructions for the 80286 processor;
 disables assembly of instructions introduced with later processors. Also
 enables 80287 instructions.


 .286P
 Enables assembly of all instructions (including privileged) for the 80286
 processor; disables assembly of instructions introduced with later
 processors. Also enables 80287 instructions.


 .287
 Enables assembly of instructions for the 80287 coprocessor; disables
 assembly of instructions introduced with later coprocessors.

 .386
 Enables assembly of nonprivileged instructions for the 80386 processor;
 disables assembly of instructions introduced with later processors. Also
 enables 80387 instructions.

 .386P
 Enables assembly of all instructions (including privileged) for the 80386
 processor; disables assembly of instructions introduced with later
 processors. Also enables 80387 instructions.

 .387
 Enables assembly of instructions for the 80387 coprocessor.

 .486
 Enables assembly of nonprivileged instructions for the 80486 processor.

 .486P
 Enables assembly of all instructions (including privileged) for the 80486
 processor.

 .8086
 Enables assembly of 8086 instructions (and the identical 8088 instructions);
 disables assembly of instructions introduced with later processors. Also
 enables 8087 instructions. This is the default mode for processors.

 .8087
 Enables assembly of 8087 instructions; disables assembly of instructions
 introduced with later coprocessors. This is the default mode for
 coprocessors.

 ALIGN [ number]
 Aligns the next variable or instruction on a byte that is a multiple of
 number.

 .ALPHA
 Orders segments alphabetically.

 ASSUME  segregister : name [ ,  segregister : name]...
  ASSUME  dataregister : type [ ,  dataregister : type]...


 ASSUME  register :ERROR [ ,  register :ERROR]...


 ASSUME [ register :]  NOTHING [ ,  register :NOTHING]...
 Enables error-checking for register values. After an  ASSUME is put into
 effect, the assembler watches for changes to the values of the given
 registers.  ERROR generates an error if the register is used at all. NOTHING
 assumptions in one statement.

 .BREAK [ .IF  condition]
 Generates code to terminate a  .WHILE or  .REPEAT block if  condition is
 true.

 [ name]  BYTE  initializer [ ,  initializer]...
 Allocates and optionally initializes a byte of storage for each
 initializer. Can also be used as a type specifier anywhere a type is legal.

  name  CATSTR [ textitem1  [ ,  textitem2]...]
 Concatenates text items. Each text item can be a literal string, a constant
 preceded by a  %, or the string returned by a macro function.

 .CODE [ name]
 When used with  .MODEL, indicates the start of a code segment called  name
 (the default segment name is _TEXT for tiny, small, compact, and flat
 models, or  module_TEXT for other models).

 COMM  definition [ ,  definition]...
 Creates a communal variable with the attributes specified in  definition.
 Each  definition has the following form:

 [ langtype]  [ NEAR |  FAR]  label : type[ : count]

 The  label is the name of the variable. The  type can be any type specifier
 ( BYTE,  WORD, etc.) or an integer specifying the number of bytes. The
 count specifies the number of data objects (one is the default).

 COMMENT  delimiter [ text]
      [ text]
 [ text]  delimiter [ text]
 Treats all  text between or on the same line as the delimiters as a comment.

 .CONST
 When used with  .MODEL, starts a constant data segment (with segment name
 CONST). This segment has the read-only attribute.

 .CONTINUE [ .IF  condition]

 Generates code to jump to the top of a  .WHILE or  .REPEAT block if
 condition is true.

 .CREF
 Enables listing of symbols in the symbol portion of the symbol table and
 browser file.

 .DATA
 When used with  .MODEL, starts a near data segment for initialized data
 (segment name _DATA).

 .DATA?
 When used with  .MODEL, starts a near data segment for uninitialized data
 (segment name _BSS).

 .DOSSEG
 Orders the segments according to the DOS segment convention: CODE first,
 then segments not in DGROUP, and then segments in DGROUP. The segments in
 DGROUP follow this order: segments not in BSS or STACK, then BSS segments,
 and finally STACK segments. Primarily used for ensuring CodeView support in
 MASM stand-alone programs. Same as  DOSSEG.

 DOSSEG
 Identical to . DOSSEG, which is the preferred form.

 DB
 Can be used to define data like  BYTE.

 DD
 Can be used to define data like  DWORD.

 DF
 Can be used to define data like  FWORD.

 DQ
 Can be used to define data like  QWORD.

 DT
 Can be used to define data like  TBYTE.

 DW
 Can be used to define data like  WORD.

 [ name]  DWORD  initializer [ ,  initializer]...
 Allocates and optionally initializes a doubleword (4 bytes) of storage for
 each  initializer. Can also be used as a type specifier anywhere a type is
 legal.

 ECHO  message
 Displays  message to the standard output device (by default, the screen).
 Same as  %OUT.

 .ELSE
 See  .IF.

 ELSE
 Marks the beginning of an alternate block within a conditional block. See IF.

 END [ address]
 Marks the end of a module and, optionally, sets the program entry point to
 address.

 .ENDIF
 See  .IF.

 ENDIF
 See  IF.

 ENDM
 Terminates a macro or repeat block. See  MACRO,  FOR,  FORC,  REPEAT, or WHIL
  name  ENDP
 Marks the end of procedure  name previously begun with  PROC. See  PROC.

  name  ENDS
 Marks the end of segment, structure, or union  name previously begun with SEG

 .ENDW
 See  .WHILE.

  name  EQU  expression
 Assigns numeric value of  expression to  name. The  name cannot be redefined
 later.

  name  EQU  < text >
 Assigns specified  text to  name. The  name can be assigned a different text

 .ERR [ message]
 Generates an error.

 .ERRB  < textitem > [ ,  message]
 Generates an error if  textitem is blank.

 .ERRDEF  name [ ,  message]
 Generates an error if  name is a previously defined label, variable, or
 symbol.

 .ERRDIF[ I]  < textitem1 >, < textitem2 > [ ,  message]
 Generates an error if the text items are different. If  I is given, the
 comparison is case insensitive.

 .ERRE  expression [ ,  message]
 Generates an error if  expression is false (0).

 .ERRIDN[ I]  < textitem1 >, < textitem2 > [ ,  message]
 Generates an error if the text items are identical. If  I is given, the
 comparison is case insensitive.

 .ERRNB  < textitem > [ ,  message]
 Generates an error if  textitem is not blank.

 .ERRNDEF  name [ ,  message]
 Generates an error if  name has not been defined.

 .ERRNZ  expression [ ,  message]
 Generates an error if  expression is true (nonzero).

 EVEN
 Aligns the next variable or instruction on an even byte.

 .EXIT [ expression]
 Generates termination code. Returns optional  expression to shell.

 EXITM [ expression]
 Terminates expansion of the current repeat or macro block and begins
 assembly of the next statement outside the block. In a macro function,
 expression is the value returned.

 EXTERN [ langtype]  name [ ( altid )]  : type
 [ , [ langtype]  name [ ( altid )]  : type]...
 Defines one or more external variables, labels, or symbols called  name
 whose type is  type. The  type can be  ABS, which imports  name as a
 constant. Same as  EXTRN.

 EXTERNDEF [ langtype]  name : type [ , [ langtype]  name : type]...
 Defines one or more external variables, labels, or symbols called  name
 whose type is  type. If  name is defined in the module, it is treated as

 PUBLIC. If  name is referenced in the module, it is treated as  EXTERN. If
 name is not referenced, it is ignored. The  type can be  ABS, which imports
 name as a constant. Normally used in include files.

 EXTRN
 See  EXTERN.

 .FARDATA [ name]
 When used with  .MODEL, starts a far data segment for initialized data
 (segment name FAR_DATA or  name).

 .FARDATA? [ name]
 When used with  .MODEL, starts a far data segment for uninitialized data
 (segment name FAR_BSS or  name).

 FOR  parameter [ :REQ |  := default]  ,  < argument [ ,  argument]... >
       statements

  ENDM
 Marks a block that will be repeated once for each  argument, with the
 current  argument replacing  parameter on each repetition. Same as  IRP.

 FORC  parameter ,  < string >
      statements

  ENDM
 Marks a block that will be repeated once for each character in  string, with
 the current character replacing  parameter on each repetition. Same as

 IRPC.
 [ name]  FWORD  initializer [ ,  initializer]...
 Allocates and optionally initializes 6 bytes of storage for each
 initializer. Can also be used as a type specifier anywhere a type is legal.

 GOTO  macrolabel
 Transfers assembly to the line marked  : macrolabel.  GOTO is permitted only
 inside  MACRO,  FOR,  FORC,  REPEAT, and  WHILE blocks. The label must be
 the only directive on the line and must be preceded by a leading colon.

  name  GROUP  segment [ ,  segment]...
 Add the specified  segments to the group called  name.

 .IF  condition1
      statements
 [ .ELSEIF  condition2
       statements]
 [ .ELSE
       statements]
 .ENDIF
 Generates code that tests  condition1 (for example, AX > 7) and executes the
  statements if that condition is true. If an  .ELSE follows, its statements
 are executed if the original condition was false. Note: The conditions are
 evaluated at run time.

 IF  expression1
      ifstatements
 [ ELSEIF  expression2
       elseifstatements]
 [ ELSE
       elsestatements]
 ENDIF
 Grants assembly of  ifstatements if  expression1 is true (nonzero) or
 elseifstatements if  expression1 is false (0) and  expression2 is true. The
 following directives may be substituted for  ELSEIF:  ELSEIFB,  ELSEIFDEF,

 ELSEIFDIF,  ELSEIFDIFI,  ELSEIFE,  ELSEIFIDN,  ELSEIFIDNI,  ELSEIFNB, and ELS
 is false. Note: The expressions are evaluated at assembly time.

 IFB  textitem
 Grants assembly if  textitem is blank. See  IF for complete syntax.

 IFDEF  name
 Grants assembly if  name is a previously defined label, variable, or symbol.
 See  IF for complete syntax.

 IFDIF[ I]  textitem1 ,  textitem2
 Grants assembly if the text items are different. If  I is given, the
 comparison is case insensitive. See  IF for complete syntax.

 IFE  expression
 Grants assembly if  expression is false (0). See  IF for complete syntax.

 IFIDN[ I]  textitem1 ,  textitem2
 Grants assembly if the text items are identical. If  I is given, the
 comparison is case insensitive. See  IF for complete syntax.

 IFNB  textitem
 Grants assembly if  textitem is not blank. See  IF for complete syntax.

 IFNDEF  name
 Grants assembly if  name has not been defined. See  IF for complete syntax.

 INCLUDE  filename
 Inserts source code from the source file given by  filename into the current
 source file during assembly. The  filename must be enclosed in angle
 brackets if it includes a backslash, semicolon, greater-than symbol,
 less-than symbol, single quotation mark, or double quotation mark.

 INCLUDELIB  libraryname
 Informs the linker that the current module should be linked with
 libraryname. The  libraryname must be enclosed in angle brackets if it
 includes a backslash, semicolon, greater-than symbol, less-than symbol,
 single quotation mark, or double quotation mark.
  name  INSTR [ position ,]  textitem1 ,  textitem2
 Finds the first occurrence of  textitem2 in  textitem1. The starting
 position is optional. Each text item can be a literal string, a constant
 preceded by a  %, or the string returned by a macro function.

 INVOKE  expression [ ,  arguments]

 Calls the procedure at the address given by  expression, passing the
 arguments on the stack or in registers according to the standard calling
 conventions of the language type. Each argument passed to the procedure may
 be an expression, a register pair, or an address expression (an expression
 preceded by  ADDR).

 IRP
 See  FOR.

 IRPC
 See  FORC.
  name  LABEL  type
 Creates a new label by assigning the current location-counter value and the
 given  type to  name.
  name  LABEL [ NEAR |  FAR |  PROC]  PTR [ type]

 Creates a new label by assigning the current location-counter value and the
 given  type to  name.

 .LALL
 See  .LISTMACROALL.

 .LFCOND
 See  .LISTIF.

 .LIST
 Starts listing of statements. This is the default.

 .LISTALL
 Starts listing of all statements. Equivalent to the combination of  .LIST,

 .LISTIF, and  .LISTMACROALL.
 .LISTIF
 Starts listing of statements in false conditional blocks. Same as  .LFCOND.

 .LISTMACRO
 Starts listing of macro expansion statements that generate code or data.
 This is the default. Same as  .XALL.

 .LISTMACROALL
 Starts listing of all statements in macros. Same as  .LALL.

 LOCAL  localname [ ,  localname]...
 Within a macro,  LOCAL defines labels that are unique to each instance of
 the macro.

 LOCAL  label [  [ count ] ] [ : type] [ ,  label [  [ count ] ] [ type]
 ]...
 Within a procedure definition ( PROC),  LOCAL creates stack-based variables
 that exist for the duration of the procedure. The  label may be a simple
 variable or an array containing  count elements.
  name  MACRO [ parameter [ :REQ |  := default |  :VARARG] ]...
       statements


 ENDM [ value]
 Marks a macro block called  name and establishes  parameter placeholders for
 arguments passed when the macro is called. A macro function returns  value
 to the calling statement.

 .MODEL  memorymodel  [ ,  langtype] [ ,  ostype] [ ,  stackoption]
 Initializes the program memory model. The  memorymodel may be  TINY,  SMALL,

 COMPACT,  MEDIUM,  LARGE,  HUGE, or  FLAT. The  langtype may be  C,  BASIC,

 FORTRAN,  PASCAL,  SYSCALL, or  STDCALL. The  ostype may be  OS_DOS or

 OS_OS2. The  stackoption may be  NEARSTACK or  FARSTACK.

 NAME  modulename
 Ignored in version 6.0.

 .NO87
 Disallows assembly of all floating-point instructions.

 .NOCREF [ name[ ,  name]...]
 Suppresses listing of symbols in the symbol table and browser file. If names
 are specified, only the given names are suppressed. Same as  .XCREF.

 .NOLIST
 Suppresses program listing. Same as  .XLIST.

 .NOLISTIF
 Suppresses listing of conditional blocks whose condition evaluates to false
 (0). This is the default. Same as  .SFCOND.

 .NOLISTMACRO
 Suppresses listing of macro expansions. Same as  .SALL.

 OPTION  optionlist
 Enables and disables features of the assembler. Available options include

 CASEMAP, DODD DOTNAME,  NODOTNAME, EPILOGUEEE EMULATOR,  NOEMULATOR,
 EPILOGUE,  EXPR16,  EXPR32,  LANGUAGE,  LJMP,  NOLJMP,  M510,  NOM510,
 NOKEYWORD,  NOSIGNEXTEND,  OFFSET,  OLDMACROS,  NOOLDMACROS,  OLDSTRUCTS,
 NOOLDSTRUCTS,  PROC,  PROLOGUE,  READONLY,  NOREADONLY,  SCOPED,  NOSCOPED,
 and  SEGMENT.

 ORG  expression
 Sets the location counter to  expression.

 %OUT
 See  ECHO.

 PAGE [ [ length] ,  width]
 Sets line  length and character  width of the program listing. If no
 arguments are given, generates a page break.

 PAGE +
 Increments the section number and resets the page number to 1.

 POPCONTEXT  context
 Restores part or all of the current  context (saved by the  PUSHCONTEXT
 directive). The  context can be  ASSUMES,  RADIX,  LISTING,  CPU, or  ALL.

  label  PROC [ distance] [ langtype] [ visibility] [ < prologuearg >]
 [ USES  reglist] [ ,  parameter [ : tag] ]...
      statements
  label  ENDP
 Marks start and end of a procedure block called  label. The statements in
 the block can be called with the  CALL instruction or  INVOKE directive.

  label  PROTO [ distance] [ langtype] [ ,  [ parameter] : tag]...
 Prototypes a function.

 PUBLIC [ langtype]  name [ , [ langtype]  name]...
 Makes each variable, label, or absolute symbol specified as  name available
 to all other modules in the program.

 PURGE  macroname [ ,  macroname]...
 Deletes the specified macros from memory.

 PUSHCONTEXT  context
 Saves part or all of the current  context: segment register assumes, radix
 value, listing and cref flags, or processor/coprocessor values. The  context
 can be  ASSUMES,  RADIX,  LISTING,  CPU, or  ALL.

 [ name]  QWORD  initializer [ ,  initializer]...
 Allocates and optionally initializes 8 bytes of storage for each
 initializer. Can also be used as a type specifier anywhere a type is legal.

 .RADIX  expression
 Sets the default radix, in the range 2 to 16, to the value of  expression.

  name  REAL4  initializer [ ,  initializer]...
 Allocates and optionally initializes a single-precision (4-byte)
 floating-point number for each  initializer.

  name  REAL8  initializer [ ,  initializer]...
 Allocates and optionally initializes a double-precision (8-byte)
 floating-point number for each  initializer.

  name  REAL10  initializer [ ,  initializer]...
 Allocates and optionally initializes a 10-byte floating-point number for
 each  initializer.

  recordname  RECORD  fieldname : width [ =  expression]
 [ ,  fieldname : width [ =  expression] ]...
 Declares a record type consisting of the specified fields. The  fieldname
 names the field,  width specifies the number of bits, and  expression gives
 its initial value.

 .REPEAT
       statements
 .UNTIL  condition
 Generates code that repeats execution of the block of  statements until
 condition becomes true.  .UNTILCXZ, which becomes true when CX is zero, may
 be substituted for  .UNTIL. The  condition is optional with  .UNTILCXZ.

 REPEAT  expression
  statements
  ENDM
 Marks a block that is to be repeated  expression times. Same as  REPT.

 REPT
 See  REPEAT.

 .SALL
 See  .NOLISTMACRO.
  name  SBYTE  initializer [ ,  initializer]...
 Allocates and optionally initializes a signed byte of storage for each
 initializer. Can also be used as a type specifier anywhere a type is legal.

  name  SDWORD  initializer [ ,  initializer]...
 Allocates and optionally initializes a signed doubleword
 (4 bytes) of storage for each  initializer. Can also be used as a type
 specifier anywhere a type is legal.

  name  SEGMENT [ READONLY] [ align] [ combine] [ use] [ ' class ']
       statements
 name  ENDS
 Defines a program segment called  name having segment attributes  align (BYTE
 AT  address,  PRIVATE),  use ( USE16,  USE32,  FLAT),  and  class.

 .SEQ
 Orders segments sequentially (the default order).

 .SFCOND
 See  .NOLISTIF.

  name  SIZESTR  textitem
 Finds the size of a text item.

 .STACK [ size]
 When used with  .MODEL, defines a stack segment (with segment name STACK).
 The optional  size specifies the number of bytes for the stack (default
 1,024). The  .STACK directive automatically closes the stack statement.

 .STARTUP
 Generates program start-up code.

 STRUC
 See  STRUCT.

  name  STRUCT [ alignment] [ ,  NONUNIQUE]
       fielddeclarations
 name  ENDS
 Declares a structure type having the specified  fielddeclarations. Each
 field must be a valid data definition. Same as  STRUC.


 STRUC
 STRUCT

  name  SUBSTR  textitem ,  position  [ ,  length]
 Returns a substring of  textitem, starting at  position. The  textitem can
 be a literal string, a constant preceded by a  %, or the string returned by
 a macro function.

 SUBTITLE  text
 Defines the listing subtitle. Same as  SUBTTL.

 SUBTTL
 See  SUBTITLE.
  name  SWORD  initializer [ ,  initializer]...

 Allocates and optionally initializes a signed word (2 bytes) of storage for
 each  initializer. Can also be used as a type specifier anywhere a type is
 legal.
 [ name]  TBYTE  initializer [ ,  initializer]...
 Allocates and optionally initializes 10 bytes of storage for each
 initializer. Can also be used as a type specifier anywhere a type is legal.
  name  TEXTEQU [ textitem]

 Assigns  textitem to  name. The  textitem can be a literal string, a
 constant preceded by a  %, or the string returned by a macro function.

 .TFCOND
 Toggles listing of false conditional blocks.

 TITLE  text
 Defines the program listing title.

  name  TYPEDEF  type
 Defines a new type called  name, which is equivalent to  type.

  name  UNION [ alignment] [ , NONUNIQUE]
  fielddeclarations
 [ name]   ENDS
 Declares a union of one or more data types. The  fielddeclarations must be
 valid data definitions. Omit the  ENDS  name label on nested  UNION
 definitions.

 .UNTIL
 See  .REPEAT.

 .UNTILCXZ
 See  .REPEAT.

 .WHILE  condition
       statements
 .ENDW
 Generates code that executes the block of  statements while  condition
 remains true.

 WHILE  expression
       statements
 ENDM
 Repeats assembly of block  statements as long as  expression remains true.

 [ name]  WORD  initializer [ ,  initializer]...
 Allocates and optionally initializes a word (2 bytes) of storage for each

 initializer. Can also be used as a type specifier anywhere a type is legal.

 .XALL
 See  .LISTMACRO.

 .XCREF
 See  .NOCREF.

 .XLIST
 See  .NOLIST.




 Predefined Symbols

 $
 The current value of the location counter.

 ?
 In data declarations, a value that the assembler allocates but does not
 initialize.

 @@:
 Defines a local code label. Overrides any previous  @@: labels. See  @B and

 @F.
 The location of the previous  @@: label.
 @CatStr(  string1 [ ,  string2...]  )

 Macro function that concatenates one or more strings. Returns a string.


 @code
 The name of the code segment (text macro).

 @CodeSize
 0 for  TINY,  SMALL,  COMPACT, and  FLAT models, and 1 for  MEDIUM,  LARGE,
 and  HUGE models (numeric equate).

 @Cpu
 A bit mask specifying the processor mode (numeric equate).

 @CurSeg
 The name of the current segment (text macro).

 @data
 The name of the default data group. Evaluates to DGROUP for all models
 except  FLAT. Evaluates to  FLAT under the  FLAT memory model (text macro).


 @DataSize
 0 for  TINY,  SMALL,  MEDIUM, and  FLAT models, 1 for  COMPACT and  LARGE
 models, and 2 for  HUGE model (numeric equate).

 @Date
 The system date in the format mm/dd/yy (text macro).

 @Environ(  envvar  )
 Value of environment variable  envvar (macro function).


 @F
 The location of the next  @@: label.

 @fardata
 The name of the segment defined by the  .FARDATA directive (text macro).

 @fardata?
 The name of the segment defined by the  .FARDATA? directive (text macro).

 @FileCur
 The name of the current file (text macro).

 @FileName
 The base name of the main file being assembled (text macro).

 @InStr( [ position] ,  string1 ,  string2  )

 Macro function that finds the first occurrence of  string2 in  string1. The
 starting position within  string1 is optional. Returns an integer (0 if
 string2 is not found).


 @Interface
 Information about the language parameters (numeric equate).

 @Line
 The source line number in the current file (numeric equate).

 @Model
 1 for  TINY model, 2 for  SMALL model, 3 for  COMPACT model, 4 for  MEDIUM
 model, 5 for  LARGE model, 6 for  HUGE model, and 7 for  FLAT model (numeric
 equate).

 @SizeStr(  string  )
 Macro function that returns the length of the given string. Returns an
 integer.

 @SubStr(  string ,  position [ ,  length]  )
 Macro function that returns a substring starting at  position.

 @stack
 DGROUP for near stacks or STACK for far stacks (text macro).

 @Time
 The system time in 24-hour hh:mm:ss format (text macro).

 @Version
 600 in MASM 6.0 (text macro).

 @WordSize
 2 for a 16-bit segment or 4 for a 32-bit segment (numeric equate).



 Operators


 expression1  + expression2
 Returns expression1 plus expression2.

 expression1 - expression2
 Returns expression1 minus expression2.

 expression1 * expression2
 Returns expression1 times expression2.

 expression1  / expression2
 Returns expression1 divided by expression2.

 -expression
 Reverses the sign of expression.

 [expression1]  [expression2 ]
 Returns expression1 plus  [expression2 ].

 segment : expression
 Overrides the default segment of expression with segment. The segment can
 be a segment register, group name, segment name, or segment expression. The e

 expression . field [ . field]...
 Returns expression plus the offset of field within its structure or union.

  [register ]. field [ . field]...
 Returns value at the location pointed to by register plus the offset of
 field within its structure or union.

  <text >
 Treats text as a single literal element.

 "text"
 Treats "text" as a string.

 'text'
 Treats 'text' as a string.

  !character
 Treats character as a literal character rather than as an operator or
 symbol.

  ;text
 Treats text as a comment.

  ;;text
 Treats text as a comment that will not be listed in expanded macros.

  %expression
 Treats the value of expression in a macro argument as text.

  &parameter &
 Replaces parameter with its corresponding argument value.

  ABS
 See the  EXTERNDEF directive.

  ADDR
 See the  INVOKE directive.

 expression1  AND expression2
 Returns the result of a bitwise Boolean AND done on expression1 and expressio

 count  DUP (initialvalue [ , initialvalue]...)
 Specifies count number of declarations of initialvalue.

 expression1  EQ expression2
 Returns true (-1) if expression1 equals expression2, or returns false (0)
 if it does not.

 expression1  GE expression2
 Returns true (-1) if expression1 is greater than or equal to expression2,
 or returns false (0) if it is not.

 expression1  GT expression2
 Returns true (-1) if expression1 is greater than expression2, or returns
 false (0) if it is not.

  HIGH expression
 Returns the high byte of expression.

  HIGHWORD expression
 Returns the high word of expression.

 expression1  LE expression2
 Returns true (-1) if expression1 is less than or equal to expression2, or
 returns false (0) if it is not.

  LENGTH variable
 Returns the number of data items in variable created by the first
 initializer.

  LENGTHOF variable
 Returns the number of data objects in variable.

  LOW expression
 Returns the low byte of expression.

  LOWWORD expression
 Returns the low word of expression.

  LROFFSET expression
 Returns the offset of expression. Same as  OFFSET, but it generates a
 loader resolved offset, which allows Windows to relocate code segments.

 expression1  LT expression2
 Returns true (-1) if expression1 is less than expression2, or returns
 false (0) if it is not.

  MASK {recordfieldname | record}
 Returns a bit mask in which the bits in recordfieldname or record are set
 and all other bits are cleared.

 expression1  MOD expression2
 Returns the remainder of dividing expression1 by expression2.

 expression1  NE expression2
 Returns true (-1) if expression1 does not equal expression2, or returns
 false (0) if it does.

  NOT expression
 Returns expression with all bits reversed.

  OFFSET expression
 Returns the offset of expression.

  OPATTR expression

 Returns a word defining the mode and scope of expression. The low byte is
 identical to the byte returned by  .TYPE. The high byte contains additional
 information.

 expression1  OR expression2
 Returns the result of a bitwise OR done on expression1 and expression2.

 type  PTR expression
 Forces the expression to be treated as having the specified type.

 [distance]  PTR type

 Specifies a pointer to type.

  SEG expression
 Returns the segment of expression.

 expression  SHL count
 Returns the result of shifting the bits of expression left count number of
 bits.

  SHORT label
 Sets the type of label to short. All jumps to
 label must be short (within
 the range -128 to +127 bytes from the jump instruction to label).

 expression  SHR count
 Returns the result of shifting the bits of expression right count number
 of bits.

  SIZE variable
 Returns the number of bytes in variable allocated by the first initializer.

  SIZEOF {variable | type}
 Returns the number of bytes in variable or type.

  THIS type
 Returns an operand of specified type whose offset and segment values are
 equal to the current location-counter value.

  .TYPE expression
 See  OPATTR.

  TYPE expression
 Returns the type of expression.

  WIDTH {recordfieldname | record}
 Returns the width in bits of the current recordfieldname or record.

 expression1  XOR expression2
 Returns the result of a bitwise Boolean XOR done on expression1 and
 expression2.





 Run-Time Operators

 The following operators are used only within  .IF,  .WHILE, or  .REPEAT
 blocks and are evaluated at run time, not at assembly time:

 expression1  ==  expression2
 Is equal to.

 expression1  !=  expression2
 Is not equal to.

 expression1  >  expression2
 Is greater than.

 expression1  >=  expression2
 Is greater than or equal to.

 expression1  <  expression2
 Is less than.

 expression1  <=  expression2
 Is less than or equal to.

 expression1  ||  expression2
 Logical OR.

 expression1  &&  expression2
 Logical AND.

 expression1  &  expression2
 Bitwise AND.

 ! expression
 Logical negation.

 CARRY?
 Carry (C) processor flag.

 OVERFLOW?
 Overflow (O) processor flag.

 PARITY?
 Parity (P) processor flag.

 SIGN?
 Sign (S) processor flag.

 ZERO?
 Zero (Z) processor flag.


 Processor



 Topical Cross-Reference for Processor


 Data Transfer
 MOV
 MOVS
 MOVSX
 MOVZX
 XCHG
 LODS
 STOS
 LEA
 LDS/LES
 LFS/LGS/LSS
 XLAT/XLATB
 BSWAP#
 CMPXCHG#
 XADD#


 Stack
 PUSH
 PUSHF
 PUSHA*
 POP
 POPF
 POPA*
 ENTER*
 LEAVE*


 Input/Output
 IN
 INS*
 OUT
 OUTS*


 Type Conversion
 CBW
 CWD
 CWDE
 CDQ
 BSWAP#


 Flag
 CLC
 CLD
 CLI
 CMC
 STC
 STD
 STI
 POPF
 PUSHF
 LAHF
 SAHF


 String
 MOVS
 LODS
 STOS
 SCAS
 CMPS
 INS*
 OUTS*
 REP
 REPE/REPZ
 REPNE/REPNZ


 Arithmetic
 ADD
 ADC
 INC
 SUB
 SBB
 DEC
 NEG
 IMUL
 MUL
 DIV
 IDIV
 XADD#


 Bit Operations
 AND
 OR
 XOR
 NOT
 ROL
 ROR
 RCL
 RCR
 SHL/SAL
 SHR
 SAR
 SHLD
 SHRD
 BSF
 BSR
 BT
 BTC
 BTR
 BTS


 Compare
 CMP
 CMPS
 TEST
 BT
 BTC
 BTR
 BTS
 CMPXCHG#


 Unconditional Transfer
 CALL
 INT
 IRET
 RET
 RETN/RETF
 JMP


 Loop
 LOOP
 LOOPE/LOOPZ
 LOOPNE/LOOPNZ
 JCXZ/JECXZ


 Conditional Transfer
 JB/JNAE
 JAE/JNB
 JBE/JNA
 JA/JNBE
 JE/JZ
 JNE/JNZ
 JL/JNGE
 JGE/JNL
 JLE/JNG
 JG/JNLE
 JS
 JNS
 JC
 JNC
 JO
 JNO
 JP/JPE
 JNP/JPO
 JCXZ/JECXZ
 INTO
 BOUND*


 Conditional Set
 SETB/SETNAE
 SETAE/SETNB
 SETBE/SETNA
 SETA/SETNBE
 SETE/SETZ
 SETNE/SETNZ
 SETL/SETNGE
 SETGE/SETNL
 SETLE/SETNG
 SETG/SETNLE
 SETS
 SETNS
 SETC
 SETNC
 SETO
 SETNO
 SETP/SETPE
 SETNP/SETPO


 BCD Conversion
 AAA
 AAS
 AAM
 AAD
 DAA
 DAS


 Processor Control
 NOP
 WAIT
 LOCK
 HLT


 Process Control
 ARPL
 CLTS
 LAR
 LGDT/LIDT/LLDT
 LMSW
 LSL
 LTR
 SGDT/SIDT/SLDT
 SMSW
 STR
 VERR
 VERW
 MOV special
 INVD#
 INVLPG#
 WBINVD#



 Interpreting Processor Instructions

 This section provides an alphabetical reference to the instructions for the
 8086, 8088, 80286, 80386, and 80486 processors. Figure 1 gives a key to each
 element of the reference.


 Flags
 The first row of the display has a one-character abbreviation for the flag
 name. Only the flags common to all processors are shown.

 O  Overflow       T  Trap       A  Auxiliary carry
 D  Direction      S  Sign       P  Parity
 I  Interrupt      Z  Zero       C  Carry


 The second line has codes indicating how the flag can be affected.
 1    Sets the flag
 0    Clears the flag
 ?    May change the flag, but the value is not predictable
 blank    No effect on the flag
 +-   Modifies according to the rules associated with the flag

 Syntax
 Each encoding variation may have different syntaxes corresponding to
 different addressing modes. The following abbreviations are used:
 reg
 A general-purpose register of any size
 segreg
 One of the segment registers: DS, ES, SS, or CS (also FS or GS on the
 80386/486)
 accum
 An accumulator register of any size: AL or AX (also EAX on the 80386/486)
 mem
 A direct or indirect memory operand of any size
 label
 A labeled memory location in the code segment
 src,dest
 A source or destination memory operand used in a string operation
 immed
 A constant operand
 In some cases abbreviations have numeric suffixes to specify that the
 operand must be a particular size. For example, reg16 means that only a
 16-bit (word) register is accepted.


 Examples
 One or more examples are shown for each syntax. Their position is not
 related to the clock speeds in the right column.

 Clock Speeds
 Column 3 shows the clock speeds for each processor. Sometimes an instruction
 may have more than one clock speed. Multiple speeds are separated by commas.
 If several speeds are part of an expression, they are enclosed in
 parentheses. The following abbreviations are used to specify variations:
 EA      Effective address. This applies only to the 8088 and 8086 processors,
 described in the next section.
 b,w,d   Byte, word, or doubleword operands.
 pm      Protected mode.
 n       Iterations. Repeated instructions may have a base number of clocks pl
 number of clocks for each iteration. For example, 8+4n means eight clocks
 plus four clocks for each iteration.
 noj     No jump. For conditional jump instructions, noj indicates the speed i
 condition is false and the jump is not taken.
 m       Next instruction components. Some control transfer instructions take
 different times depending on the length of the next instruction executed. On
 the 8088 and 8086, m is never a factor. On the 80286, m is the number of
 bytes in the instruction. On the 80386/486, m is the number of components.
 Each byte of encoding is a component, and the displacement and data are
 separate components.
 W88,88  8088 exceptions. See "Timings on the 8088 and 8086 Processors."

 Clocks can be converted to nanoseconds by dividing one microsecond by the
 number of megahertz (MHz) at which the processor is running. For example, on
 a processor running at 8 MHz, one clock takes 125 nanoseconds (1000 MHz per
 nanosecond / 8 MHz).

 The clock counts are for best-case timings. Actual timings vary depending on
 wait states, alignment of the instruction, the status of the prefetch queue,
 and other factors.


 Timings on the 8088 and 8086 Processors
 Because of its 8-bit data bus, the 8088 always requires two fetches to get a
 16-bit operand. Instructions that work on 16-bit memory operands therefore
 take longer on the 8088 than on the 8086. Separate 8088 timings are shown in
 parentheses following the main timing. For example, 9 (W88=13) means that
 the 8086 with any operands or the 8088 with byte operands take 9 clocks, but
 the 8088 with word operands takes 13 clocks. Similarly, 16 (88=24) means
 that the 8086 takes 16 clocks, but the 8088 takes 24 clocks.
 On the 8088 and 8086, the effective address (EA) value must be added for
 instructions that operate on memory operands. A displacement is any direct
 memory or constant operand, or any combination of the two. Below are the
 number of clocks to add for the effective address.
露컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴코컴컴컴컴컴旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴캠
 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
 Components                      EA Clocks  Examples

 Displacement                    6          mov   ax,stuffmov   ax,stuff+2

 Base or index                   5          mov   ax,[bx]mov   ax,[di]

 컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

 Displacementplus base or index  9          mov   ax,[bp+8]mov
                                            ax,stuff[di]

 Base plus index (BP+DI,BX+SI)   7          mov   ax,[bx+si]mov   ax,[bp+di]

 Base plus index (BP+SI,BX+DI)   8          mov   ax,[bx+di]mov   ax,[bp+si]

 Base plus indexplus             11         mov   ax,stuff[bx+si]mov
 displacement (BP+DI+disp                   ax,[bp+di+8]
 ,BX+SI+disp)

 Base plus indexplus             12         mov   ax,stuff[bx+di]mov
 displacement  (BP+SI+disp                  ax,[bp+si+20]
 ,BX+DI+disp)

 Segment override                EA+2       mov   ax,es:stuffmov
                                            ax,ds:[bp+10]





 Timings on the 80286-80486 Processors
 On the 80286-80486 processors, the effective address calculation is handled
 by hardware and is therefore not a factor in clock calculations except in
 one case. If a memory operand includes all three possible elements--a
 displacement, a base register, and an index register--then add one clock. On
 the 80486, the extra clock is not always used. Examples are shown below.

 mov    ax,[bx+di]         ;No extra
 mov    ax,array[bx+di]    ;One extra
 mov    ax,[bx+di+6]       ;One extra


 Note: 80186 and 80188 timings are different from 8088, 8086, and 80286
 timings. They are not shown in this manual. Timings are also not shown for
 protected-mode transfers through gates or for the virtual 8086 mode
 available on the 80386/486 processors.

 Interpreting Encodings
 Encodings are shown for each variation of the instruction. This section
 describes encoding for all processors except the 80386/486. The encodings
 take the form of boxes filled with 0s and 1s for bits that are constant for
 the instruction variation, and abbreviations (in italics) for the following
 variable bits or bitfields:
 d
 Direction bit. If set, do memory to register or register to register; the
 reg field is the destination. If cleared, do register to memory; the reg
 field is the source.

 w
 Word/byte bit. If set, use 16-bit or 32-bit operands. If cleared, use 8-bit
 operands.

 s
 Sign bit. If set, sign-extend 8-bit immediate data to 16 bits.

 mod
 Mode. This two-bit field gives the register/memory mode with displacement.
 The possible values are shown below.

 mod    Meaning
 00    This value can have two meanings:
     If r/m is 110, a direct memory operand is used.
 If r/m is not 110, the displacement is 0 and an indirect memory operand is
 used. The operand must be based, indexed, or based indexed.
 01    An indirect memory operand is used with an 8-bit displacement.
 10    An indirect memory operand is used with a 16-bit displacement.
 11    A two-register instruction is used; the reg field specifies the
 destination and the r/m field specifies the source.


 reg
 Register. This three-bit field specifies one of the general-purpose
 registers:

 reg    16/32 biut if w=1   8-bit if w=0
 000       AX/EAX              AL
 001       CX/ECX              CL
 010       DX/EDX              DL
 011       BX/EBX              BL
 100       SP/ESP              AH
 101       BP/EBP              CH
 110       SI/ESI              DH
 111       DI/EDI              BH

 The reg field is sometimes used to specify encoding information rather than
 a register.
 sreg
 Segment register. This field specifies one of the segment registers.
 sreg    Register
 000    ES
 001    CS
 010    SS
 011    DS
 100    FS
 101    GS


 r/m
 Register/memory. This three-bit field specifies a register or memory r/m
 operand.
 If the mod field is 11, r/m specifies the source register using the reg
 field codes. Otherwise, the field has one of the following values:

 r/m    Operand Address

 000    DS:[BX+SI+disp]
 001    DS:[BX+DI+disp]
 010    SS:[BP+SI+disp]
 011    SS:[BP+DI+disp]
 100    DS:[SI+disp]
 101    DS:[DI+disp]
 110    SS:[BP+disp]*

 * If mod is 00 and r/m is 110, then the operand is treated as a direct
 memory operand. This means that the operand [BP] is encoded as [BP+0] rather
 than having a short-form like other register indirect operands. Encoding
 [BX] takes one byte, but encoding [BP] takes two.
 111    DS:[BX+disp]


 disp
 Displacement. These bytes give the offset for memory operands. The possible
 lengths (in bytes) are shown in parentheses.

 data
 Data. These bytes gives the actual value for constant values. The possible
 lengths (in bytes) are shown in parentheses.

 If a memory operand has a segment override, the entire instruction has one
 of the following bytes as a prefix:

 Prefix                 Segment
 00101110    (2Eh)        CS
 00111110    (3Eh)        DS
 00100110    (26h)        ES
 00110110    (36h)        SS
 01100100    (64h)        FS
 01100101    (65h)        GS

 Example
 As an example, assume you want to calculate the encoding for the following
 statement (where  warray  is a 16-bit variable):
 add    warray[bx+di],-3

 First look up the encoding for the immediate to memory syntax of the ADD
 instruction:
 100000sw
 mod,000,r/m

 data (0, 1, or 2)


 Since the destination is a word operand, the w bit is set. The 8-bit
 immediate data must be sign-extended to 16 bits in order to fit into the
 operand, so the s bit is also set. The first byte of the instruction is
 therefore 10000011 (83h).
 Since the memory operand can be anywhere in the segment, it must have a
 16-bit offset (displacement). Therefore the mod field is 10. The reg field
 is 000, as shown in the encoding. The r/m coding for [bx+di+disp] is 001.
 The second byte is 10000001 (81h).
 The next two bytes are the offset of  warray. The low byte of the offset is
 stored first and the high byte second. For this example, assume that  warray
 is located at offset 10EFh.
 The last byte of the instruction is used to store the 8-bit immediate value
 -3 (FDh). This value is encoded as 8 bits (but sign-extended to 16 bits by
 the processor).

 83 81 EF 10 FD

 You can confirm this by assembling the instruction and looking at the
 resulting assembly listing.

 Interpreting 80386/486 Encoding Extensions
 This book shows 80386/486 encodings for instructions that are available only
 on the 80386/486 processors. For other instructions, encodings are shown
 only for the 16-bit subset available on all processors. This section tells
 how to convert the 80286 encodings shown in the book to 80386/486 encodings
 that use extensions such as 32-bit registers and memory operands.
 The extended 80386/486 encodings differ in that they can have additional
 prefix bytes, a Scaled Index Base (SIB) byte, and 32-bit displacement and
 immediate bytes. Use of these elements is closely tied to the segment word
 size. The use type of the code segment determines whether the instructions
 are processed in 32-bit mode (USE32) or
 16-bit mode (USE16). Current versions of MS-DOS(R) and Microsoft Windows and
 version 1.x of OS/2 use 16-bit mode only. Version 2.0 of OS/2 uses 32-bit
 mode.

 Additional bytes may be added for a segment prefix, a repeat prefix, or the
 LOCK prefix.



 Address-Size Prefix
 The address-size prefix determines the segment word size of the operation.
 It can override the default size for calculating the displacement of memory
 addresses. The address prefix byte is 67h. The assembler automatically
 inserts this byte where appropriate.
 In 32-bit mode (USE32 or FLAT code segment), displacements are calculated as
 32-bit addresses. The effective address-size prefix must be used for any
 instructions that must calculate addresses as 16-bit displacements. In
 16-bit mode the defaults are reversed. The prefix must be used to specify
 calculation of 32-bit displacements.


 Operand-Size Prefix
 The operand-size prefix determines the size of operands. It can override the
 default size of registers or memory operands. The operand-size prefix byte
 is 66h. The assembler automatically inserts this byte where appropriate.
 In 32-bit mode, the default sizes for operands are 8 bits and 32 bits
 (depending on the w bit). For most instructions, the operand-size prefix
 must be used for any instructions that use 16-bit operands. In 16-bit mode,
 the default sizes are 8 bits and 16 bits. The prefix must be used for any
 instructions that use 32-bit  operands. Some instructions use 16-bit
 operands, regardless of mode.


 Encoding Differences for 32-Bit Operations
 When 32-bit operations are performed, the meaning of certain bits or fields
 are different than for 16-bit operations. The changes may affect default
 operations in 32-bit mode, or 16-bit mode operations in which the
 address-size prefix or the operand-size prefix is used. The following fields
 may have a different meaning for 32-bit operations than the meaning
 described in the "Interpreting Encodings" section:

 w
 Word/byte bit.  If set, use 32-bit operands. If cleared, use
 8-bit operands.

 s
 Sign bit.  If set, sign-extend 8-bit or 16-bit immediate data to 32 bits.

 mod
 Mode. This field indicates the register/memory mode. The value 11 still
 indicates a register-to-register operation with r/m containing the code for
 a 32-bit source register. However, other codes have different meanings as
 shown in the tables in the next section.

 reg
 Register. The codes for 16-bit registers are extended to
 32-bit registers. For example, if the reg field is 000, EAX
 is used instead of AX. Use of 8-bit registers is unchanged.

 sreg
 Segment register. The 80386 has the following additional segment registers:
              sreg     Register
              100         FS
              101         GS

 r/m
 Register/memory. If the r/m field is used for the source register, 32-bit
 registers are used as for the reg field. If the field is used for memory
 operands, the meaning is completely different than for 16-bit operations, as
 shown in the tables in the next section.

 disp
 Displacement. This field is four bytes for 32-bit addresses.

 data
 Data. Immediate data can be up to four bytes.


 Scaled Index Base Byte
 Many 80386/486 extended memory operands are too complex to be represented by
 a single mod-reg-r/m byte. For these operands, a value of 100 in the r/m
 field signals the presence of a second encoding byte called the Scaled Index
 Base (SIB) byte. The SIB byte is made up of the following fields:

 ss
 Scaling Field. This two-bit field specifies one of the following scaling
 factors:
       ss   Scale
       00    1
       01    2
       10    4
       11    8

 index
 Index Register. This three-bit field specifies one of the following index
 registers:
      index    Register
        000    EAX
        001    ECX
        010    EDX
        011    EBX
        100    no index
        101    EBP
        110    ESI
        111    EDI

 Note that ESP cannot be an index register. If the index field is 100, then
 the ss field must be 00.

 base
 Base Register. This three-bit field combines with the mod field to specify
 the base register and the displacement. Note that the base field only
 specifies the base when the r/m field is 100. Otherwise, the r/m field
 specifies the base.

 If a memory operand has a segment override, the entire instruction has one
 of the prefixes discussed earlier in the "Interpreting Encodings" section or
 one of the following prefixes for the segment registers available only on
 the 80386/486:
      Prefix                 Segment
      01100100    (64h)        FS
      01100101    (65h)        GS


 Example
 Assume you want to calculate the encoding for the following statement (where
 warray  is a 16-bit variable). Assume also that the instruction is used in
 16-bit mode.
 add   warray[eax+ecx*2],-3

 First look up the encoding for the immediate to memory syntax of the ADD
 instruction:
 100000sw
 mod,000,r/m

 This encoding must be expanded to account for 80386/486 extensions. Note
 that the instruction operates on 16-bit data in a 16-bit mode program.
 Therefore, the operand-size prefix is not needed. However, the instruction
 does use 32-bit registers to calculate a 32-bit effective address. Thus the
 first byte of the encoding must be the effective address-size prefix,
 01100111 (67h).

 The opcode byte is the same (83h) as for the 80286 example described in the
 "Interpreting Encodings" section.

 The mod-reg-r/m byte must specify a based indexed operand with a scaling
 factor of two. This operand cannot be specified with a single byte, so the
 encoding must also use the SIB byte. The value 100 in the r/m field
 specifies an SIB byte. The reg field is 000, as shown in the encoding. The
 mod field is 10 for operands that have base and scaled index registers and a
 32-bit displacement. The combined mod, reg, and r/m fields for the second
 byte are 10000100 (84h).

 The SIB byte is next. The scaling factor is 2, so the ss field is 01. The
 index register is ECX, so the index field is 001. The base register is EAX,
 so the base field is 000. The SIB byte is 01001000 (48h).

 The next four bytes are the offset of  warray. The low bytes are stored
 first. For this example, assume that  warray  is located at offset 10EFh.
 This offset only requires two bytes, but four must be supplied because of
 the addressing mode. A 32-bit address can be safely used in 16-bit mode as
 long as the upper word is 0.

 The last byte of the instruction is used to store the 8-bit immediate value
 -3 (FDh).

 The encoding is shown below in hexadecimal:
 67 83 84 48 00 00 EF 10 FD



 Processor Instructions



 AAA
 ASCII Adjust after Addition

 Adjusts the result of an addition to a decimal digit (0-9). The previous
 addition instruction should place its 8-bit sum in AL. If the sum is greater
 than 9h, AH is incremented and the carry and auxiliary carry flags are set.
 Otherwise, the carry and auxiliary carry flags are cleared.



 AAD
 ASCII Adjust before Division

 Converts unpacked BCD digits in AH (most significant digit) and AL (least
 significant digit) to a binary number in AX. This instruction is often used
 to prepare an unpacked BCD number in AX for division by an unpacked BCD
 digit in an 8-bit register.



 AAM
 ASCII Adjust after Multiply

 Converts an 8-bit binary number less than 100 decimal in AL to an unpacked
 BCD number in AX. The most significant digit goes in AH and the least
 significant in AL. This instruction is often used to adjust the product
 after a MUL instruction that multiplies unpacked BCD digits in AH and AL. It
 is also used to adjust the quotient after a DIV instruction that divides a
 binary number less than 100 decimal in AX by an unpacked BCD number.




 AAS
 ASCII Adjust after Subtraction

 Adjusts the result of a subtraction to a decimal digit (0-9). The previous
 subtraction instruction should place its 8-bit result in AL. If the result
 is greater than 9h, AH is decremented and the carry and auxiliary carry
 flags are set. Otherwise, the carry and auxiliary carry flags are cleared.



 ADC
 Add with Carry

 Adds the source operand, the destination operand, and the value of the carry
 flag. The result is assigned to the destination operand. This instruction is
 used to add the more significant portions of numbers that must be added in
 multiple registers.



 ADD
 Add

 Adds the source and destination operands and puts the sum in the destination
 operand.



 AND
 Logical AND

 Performs a bitwise AND operation on the source and destination operands and
 stores the result in the destination operand. For each bit position in the
 operands, if both bits are set, the corresponding bit of the result is set.
 Otherwise, the corresponding bit of the result is cleared.



 ARPL
 Adjust Requested Privilege Level
 80286-80486 Protected Only

 Verifies that the destination Requested Privilege Level (RPL) field (bits 0
 and 1 of a selector value) is less than the source RPL field. If it is not,
 ARPL adjusts the destination RPL up to match the source RPL. The destination
 operand should be a 16-bit memory or register operand containing the value
 of a selector. The source operand should be a
 16-bit register containing the test value. The zero flag is set if the
 destination is adjusted; otherwise, the flag is cleared. ARPL is useful only
 in 80286-80486 protected mode. See Intel documentation for details on
 selectors and privilege levels.



 BOUND
 Check Array Bounds
 80186-80486 Only

 Verifies that a signed index value is within the bounds of an array. The
 destination operand can be any 16-bit register containing the index to be
 checked. The source operand must then be a 32-bit memory operand in which
 the low and high words contain the starting and ending values, respectively,
 of the array. (On the 80386/486 processors, the destination operand can be a
 32-bit register; in this case, the source operand must be a 64-bit operand
 made up of 32-bit bounds.) If the source operand is less than the first
 bound or greater than the last bound, an interrupt 5 is generated. The
 instruction pointer pushed by the interrupt (and returned by IRET) points to
 the BOUND instruction rather than to the next instruction.



 BSF/BSR
 Bit Scan
 80386/486 Only

 Scans an operand to find the first set bit. If a set bit is found, the zero
 flag is set and the destination operand is loaded with the bit index of the
 first set bit encountered. If no set bit is found, the zero flag is cleared.
 BSF (Bit Scan Forward) scans from bit 0 to the most significant bit. BSR
 (Bit Scan Reverse) scans from the most significant bit of an operand to bit
 0.



 BSWAP
 Byte Swap
 80486 Only

 Takes a single 32-bit register as operand and exchanges the first byte with
 the fourth and the second byte with the third. This instruction does not
 alter any bit values within the bytes and is useful for quickly translating
 between 8086-family byte storage and storage schemes in which the high byte
 is stored first.



 BT/BTC/BTR/BTS
 Bit Tests
 80386/486 Only

 Copies the value of a specified bit into the carry flag, where it can be
 tested by a JC or JNC instruction. The destination operand specifies the
 value in which the bit is located; the source operand specifies the bit
 position. BT simply copies the bit to the flag. BTC copies the bit and
 complements (toggles) it in the destination. BTR copies the bit and resets
 (clears) it in the destination. BTS copies the bit and sets it in the
 destination.



 CALL
 Call Procedure

 Calls a procedure. The instruction pushes the address of the next
 instruction onto the stack and jumps to the address specified by the
 operand. For NEAR calls, SP is decreased by 2, the offset (IP) is pushed,
 and the new offset is loaded into IP.
 For FAR calls, SP is decreased by 2, the segment (CS) is pushed, and the new
 segment is loaded into CS. Then SP is decreased by 2 again, the offset (IP)
 is pushed, and the new offset is loaded into IP. A subsequent RET
 instruction can pop the address so that execution continues with the
 instruction following the call.



 CBW
 Convert Byte to Word

 Converts a signed byte in AL to a signed word in AX by extending the sign
 bit of AL into all bits of AH.



 CDQ
 Convert Double to Quad
 80386/486 Only

 Converts the signed doubleword in EAX to a signed quadword in the EDX:EAX
 register pair by extending the sign bit of EAX into all bits of EDX.



 CLC
 Clear Carry Flag

 Clears the carry flag.



 CLD
 Clear Direction Flag

 Clears the direction flag. All subsequent string instructions will process
 up (from low addresses to high addresses) by increasing the appropriate
 index registers.



 CLI
 Clear Interrupt Flag

 Clears the interrupt flag. When the interrupt flag is cleared, maskable
 interrupts are not recognized until the flag is set again with the STI
 instruction. In protected mode, CLI only clears the flag if the current
 task's privilege level is less than or equal to the value of the IOPL flag.
 Otherwise, a general-protection fault occurs.



 CLTS
 Clear Task Switched Flag
 80286-80486 Privileged Only

 Clears the task switched flag in the Machine Status Word (MSW) of the 80286
 or the CR0 register of the 80386/486. This instruction can be used only in
 systems software executing at privilege level 0. See Intel documentation for
 details on the task-switched flag and other privileged-mode concepts.



 CMC
 Complement Carry Flag

 Complements (toggles) the carry flag.



 CMP
 Compare Two Operands

 Compares two operands as a test for a subsequent conditional-jump or set
 instruction. CMP does this by subtracting the source operand from the
 destination operand and setting the flags according to the result. CMP is
 the same as the SUB instruction, except that the result is not stored.



 CMPS/CMPSB/
 CMPSW/CMPSD
 Compare String

 Compares two strings. DS:SI must point to the source string and ES:DI must
 point to the destination string (even if operands are given). For each
 comparison, the destination element is subtracted from the source element
 and the flags are updated to reflect the result (although the result is not
 stored). DI and SI are adjusted according to the size of the operands and
 the status of the direction flag. They are increased if the direction flag
 has been cleared with CLD or decreased if the direction flag has been set
 with STD.
 If the CMPS form of the instruction is used, operands must be provided to
 indicate the size of the data elements to be processed. A segment override
 can be given for the source (but not for the destination). If CMPSB (bytes),
 CMPSW (words), or CMPSD (doublewords on the 80386/486 only) is used, the
 instruction determines the size of the data elements to be processed.

 CMPS and its variations are normally used with repeat prefixes. REPNE (or
 REPNZ) is used to find the first match between two strings. REPE (or REPZ)
 is used to find the first nonmatch. Before the comparison, CX should contain
 the maximum number of elements to compare. After a REPNE CMPS, the zero flag
 will be cleared if no match was found. After a REPE CMPS, the zero flag will
 be set if no nonmatch was found. Otherwise, SI and DI will point to the
 element after the first match or nonmatch.



 CMPXCHG
 Compare and Exchange
 80486 Only

 Compares the destination operand to the accumulator (AL, AX, or EAX). If
 equal, the source operand is copied to the destination. Otherwise, the
 destination is copied to the accumulator. The instruction sets flags
 according to the result of the comparison.



 CWD
 Convert Word to Double

 Converts the signed word in AX to a signed doubleword in the DX:AX register
 pair by extending the sign bit of AX into all bits of DX.



 CWDE
 Convert Word to  Extended Double
 80386/486 Only

 Converts a signed word in AX to a signed doubleword in EAX by extending the
 sign bit of AX into all bits of EAX.



 DAA
 Decimal Adjust after Addition

 Adjusts the result of an addition to a packed BCD number (less than 100
 decimal). The previous addition instruction should place its 8-bit binary
 sum in AL. DAA converts this binary sum to packed BCD format with the least
 significant decimal digit in the lower four bits and the most significant
 digit in the upper four bits. If the sum is greater than 99h after
 adjustment, the carry and auxiliary carry flags are set. Otherwise, the
 carry and auxiliary carry flags are cleared.



 DAS
 Decimal Adjust after Subtraction

 Adjusts the result of a subtraction to a packed BCD number (less than 100
 decimal). The previous subtraction instruction should place its
 8-bit binary result in AL. DAS converts this binary sum to packed BCD format
 with the least significant decimal digit in the lower four bits and the most
 significant digit in the upper four bits. If the sum is greater than 99h
 after adjustment, the carry and auxiliary carry flags are set. Otherwise,
 the carry and auxiliary carry flags are cleared.



 DEC
 Decrement

 Subtracts 1 from the destination operand. Because the operand is treated as
 an unsigned integer, the DEC instruction does not affect the carry flag. To
 detect any effects on the carry flag, use the SUB instruction.



 DIV
 Unsigned Divide

 Divides an implied destination operand by a specified source operand. Both
 operands are treated as unsigned numbers. If the source (divisor) is 16 bits
 wide, the implied destination (dividend) is the DX:AX register pair. The
 quotient goes into AX and the remainder into DX. If the source is 8 bits
 wide, the implied destination operand is AX. The quotient goes into AL and
 the remainder into AH. On the 80386/486, if the source is EAX, the quotient
 goes into EAX and the divisor into EDX.



 ENTER
 Make Stack Frame
 80186-80486 Only

 Creates a stack frame for a procedure that receives parameters passed on the
 stack. When immed16 is 0, ENTER is equivalent to push bp, followed by mov
 bp,sp. The first operand of the ENTER instruction specifies the number of
 bytes to reserve for local variables. The second operand specifies the
 nesting level for the procedure. The nesting level should be 0 for languages
 that do not allow access to local variables of higher-level procedures (such
 as C, Basic, and FORTRAN). See the complementary instruction LEAVE for a
 method of exiting from a procedure.



 HLT@EH@%
 Halt

 Stops CPU execution until an interrupt restarts execution at the instruction
 following HLT. In protected mode, this instruction works only in privileged
 mode.



 IDIV
 Signed Divide

 Divides an implied destination operand by a specified source operand. Both
 operands are treated as signed numbers. If the source (divisor) is 16 bits
 wide, the implied destination (dividend) is the DX:AX register pair. The
 quotient goes into AX and the remainder into DX. If the source is 8 bits
 wide, the implied destination is AX. The quotient goes into AL and the
 remainder into AH. On the 80386/486, if the source is EAX, the quotient goes
 into EAX and the divisor into EDX.



 IMUL
 Signed Multiply

 Multiplies an implied destination operand by a specified source operand.
 Both operands are treated as signed numbers. If a single 16-bit operand is
 given, the implied destination is AX and the product goes into the DX:AX
 register pair. If a single 8-bit operand is given, the implied destination
 is AL and the product goes into AX. On the 80386/486, if the operand is EAX,
 the product goes into the EDX:EAX register pair. The carry and overflow
 flags are set if the product is sign-extended into DX for 16-bit operands,
 into AH for 8-bit operands, or into EDX for 32-bit operands.

 Two additional syntaxes are available on the 80186-80486 processors. In the
 two-operand form, a 16-bit register gives one of the factors and serves as
 the destination for the result; a source constant specifies the other
 factor. In the three-operand form, the first operand is a 16-bit register
 where the result will be stored, the second is a 16-bit register or memory
 operand containing one of the factors, and the third is a constant
 representing the other factor. With both variations, the overflow and carry
 flags are set if the result is too large to fit into the 16-bit destination
 register. Since the low 16 bits of the product are the same for both signed
 and unsigned multiplication, these syntaxes can be used for either signed or
 unsigned numbers. On the 80386/486, the operands can be either 16 or 32 bits
 wide.

 A fourth syntax is available on the 80386/486. Both the source and
 destination operands can be given specifically. The source can be any 16- or
 32-bit memory operand or general-purpose register. The destination can be
 any general-purpose register of the same size. The overflow and carry flags
 are set if the product does not fit in the destination.



 IN
 Input from Port

 Transfers a byte or word (or doubleword on the 80386/486) from a port to the
 accumulator register. The port address is specified by the source operand,
 which can be DX or an 8-bit constant. Constants can only be used for port
 numbers less than 255; use DX for higher port numbers. In protected mode, a
 general-protection fault occurs if IN is used when the current privilege
 level is greater than the value of the IOPL flag.



 INC
 Increment

 Adds 1 to the destination operand. Because the operand is treated as an
 unsigned integer, the INC instruction does not affect the carry flag. If a
 signed carry requires detection, use the ADD instruction.



 INS/INSB/INSW/INSD
 Input from Port to String
 80186-80486 Only

 Receives a string from a port. The string is considered the destination and
 must be pointed to by ES:DI (even if an operand is given). The input port is
 specified in DX. For each element received, DI is adjusted according to the
 size of the operand and the status of the direction flag. DI is increased if
 the direction flag has been cleared with CLD or decreased if the direction
 flag has been set with STD.

 If the INS form of the instruction is used, a destination operand must be
 provided to indicate the size of the data elements to be processed and DX
 must be specified as the source operand containing the port number. A
 segment override is not allowed. If INSB (bytes), INSW (words), or INSD
 (doublewords on the 80386/486 only) is used, the instruction determines the
 size of the data elements to be received.

 INS and its variations are normally used with the REP prefix. Before the
 repeated instruction is executed, CX should contain the number of elements
 to be received. In protected mode, a general-protection fault occurs if INS
 is used when the current privilege level is greater than the value of the
 IOPL flag.



 INT
 Interrupt

 Generates a software interrupt. An 8-bit constant operand (0 to 255)
 specifies the interrupt procedure to be called. The call is made by indexing
 the interrupt number into the Interrupt Descriptor Table (IDT) starting at
 segment 0, offset 0. In real mode, the IDT contains 4-byte pointers to
 interrupt procedures. In privileged mode, the IDT contains 8-byte pointers.

 When an interrupt is called in real mode, the flags, CS, and IP are pushed
 onto the stack (in that order) and the trap and interrupt flags are cleared.
 STI can be used to restore interrupts. See Intel documentation and the
 documentation for your operating system for details on using and defining
 interrupts in privileged mode. To return from an interrupt, use the IRET
 instruction.



 INTO
 Interrupt on Overflow

 Generates interrupt 4 if the overflow flag is set. The default DOS behavior
 for interrupt 4 is to return without taking any action. You must define an
 interrupt procedure for interrupt 4 in order for INTO to have any effect.



 INVD
 Invalidate Data Cache
 80486 Only

 Empties contents of the current data cache without writing changes to
 memory. Proper use of this instruction requires knowledge of how contents
 are placed in the cache. INVD is intended primarily for systems programming.
 See Intel documentation for details.



 INVLPG
 Invalidate TLB Entry
 80486 Only

 Invalidates an entry in the Translation Lookaside Buffer (TLB), used by the
 demand-paging mechanism for OS/2 and other virtual-memory systems. The
 instruction takes a single memory operand and calculates the effective
 address of the operand, including the segment address. If the resulting
 address is mapped by any entry in the TLB, this entry is removed. Proper use
 of INVLPG requires understanding the hardware-supported demand-paging
 mechanism. INVLPG is intended primarily for systems programming. See Intel
 documentation for details.



 IRET/IRETD
 Interrupt Return

 Returns control from an interrupt procedure to the interrupted code. In real
 mode, the IRET instruction pops IP, CS, and the flags (in that order) and
 resumes execution. See Intel documentation for details on IRET operation in
 privileged mode. On the 80386/486, the IRETD instruction should be used to
 pop a 32-bit instruction pointer when returning from an interrupt called
 from a 32-bit segment. The F suffix prevents epilogue code from being
 generated when ending a PROC block. Use it to terminate interrupt service
 procedures.



 Jcondition
 Jump Conditionally

 Transfers execution to the specified label if the flags condition is true.
 The condition is tested by checking the flags shown in the table on the
 following page. If the condition is false, no jump is taken and program
 execution continues at the next instruction. On the 8086-80286 processors,
 the label given as the operand must be short (between -128 and +127 bytes
 from the instruction following the jump).* The 80386/486 processors allow
 near jumps (-32,768 to +32,767 bytes). On the 80386/486, the assembler
 generates the shortest jump possible, unless the jump size is explicitly
 specified.

 When the 80386/486 processors are in FLAT memory model, short jumps range
 from -128 to +127 bytes and near jumps range from -2 to +2 gigabytes. There
 are no far jumps.



 JMP
 Jump Unconditionally

 Transfers program execution to the address specified by the destination
 operand. Jumps are near (between -32,768 and +32,767 bytes from the
 instruction following the jump), or short (between -128 and +127 bytes), or
 far (in a different code segment). Unless a distance is explicitly
 specified, the assembler selects the shortest possible jump. With near and
 short jumps, the operand specifies a new IP address. With far jumps, the
 operand specifies new IP and CS addresses.

 When the 80386/486 processors are in FLAT memory model, short jumps range
 from -128 to +127 bytes and near jumps range from -2 to +2 gigabytes.



 LAHF
 Load Flags into AH Register

 Transfers bits 0 to 7 of the flags register to AH. This includes the carry,
 parity, auxiliary carry, zero, and sign flags, but not the trap, interrupt,
 direction, or overflow flags.



 LAR
 Load Access Rights
 80286-80486 Protected Only

 Loads the access rights of a selector into a specified register. The source
 operand must be a register or memory operand containing a selector. The
 destination operand must be a register that will receive the access rights
 if the selector is valid and visible at the current privilege level. The
 zero flag is set if the access rights are transferred, or cleared if they
 are not. See Intel documentation for details on selectors, access rights,
 and other privileged-mode concepts.



 LDS/LES/LFS/LGS/LSS
 Load Far Pointer

 Reads and stores the far pointer specified by the source memory operand. The
 instruction moves the pointer's segment value into DS, ES, FS, GS, or SS
 (depending on the instruction). Then it moves the pointer's offset value
 into the destination operand. The LDS and LES instructions are available on
 all processors. The LFS, LGS, and LSS instructions are available only on the
 80386/486.



 LEA
 Load Effective Address

 Calculates the effective address (offset) of the source memory operand and
 stores the result in the destination register.

 If the source operand is a direct memory address, the assembler encodes the
 instruction in the more efficient  MOV reg,immediate  form (equivalent to
 MOV reg, OFFSET mem).



 LEAVE
 High Level Procedure Exit
 80186-80486 Only

 Terminates the stack frame of a procedure. LEAVE reverses the action of a
 previous ENTER instruction by restoring SP and BP to the values they had
 before the procedure stack frame was initialized. LEAVE is equivalent to mov
 sp,bp, followed by pop bp.



 LES/LFS/LGS
 Load Far Pointer to Extra Segment
 See LDS.



 LGDT/LIDT/LLDT
 Load Descriptor Table
 80286-80486 Privileged Only

 Loads a value from an operand into a descriptor table register. LGDT loads
 into the Global Descriptor Table, LIDT into the Interrupt Descriptor Table,
 and LLDT into the Local Descriptor Table. These instructions are available
 only in privileged mode. See Intel documentation for details on descriptor
 tables and other protected-mode concepts.



 LMSW
 Load Machine Status Word
 80286-80486 Privileged Only

 Loads a value from a memory operand into the Machine Status Word (MSW). This
 instruction is available only in privileged mode. See Intel documentation
 for details on the MSW and other protected-mode concepts.



 LOCK
 Lock the Bus

 Locks out other processors during execution of the next instruction. This
 instruction is a prefix. It must precede an instruction that accesses a
 memory location that another processor might attempt to access at the same
 time. See Intel documentation for details on multiprocessor environments.



 LODS/LODSB/
 LODSW/LODSD
 Load String Operand

 Loads a string from memory into the accumulator register. The string to be
 loaded is the source and must be pointed to by DS:SI (even if an operand is
 given). For each source element loaded, SI is adjusted according to the size
 of the operands and the status of the direction flag. SI is increased if the
 direction flag has been cleared with CLD or decreased if the direction flag
 has been set with STD.

 If the LODS form of the instruction is used, an operand must be provided to
 indicate the size of the data elements to be processed. A segment override
 can be given. If LODSB (bytes), LODSW (words), or LODSD (doublewords on the
 80386/486 only) is used, the instruction determines the size of the data
 elements to be processed and whether the element will be loaded to AL, AX,
 or EAX.

 LODS and its variations are not normally used with repeat prefixes, since
 there is no reason to repeatedly load memory values to a register.



 LOOP/LOOPW/LOOPD
 Loop

 Loops repeatedly to a specified label. LOOP decrements CX (without changing
 any flags) and, if the result is not 0, transfers execution to the address
 specified by the operand. On the 80386/486, LOOP uses the 16-bit CX in
 16-bit mode and the 32-bit ECX in 32-bit mode. The default can be overridden
 with LOOPW (CX) or LOOPD (ECX). If CX is 0 after being decremented,
 execution continues at the next instruction. The operand must specify a
 short label (between -128 and +127 bytes from the instruction following the
 LOOP instruction).



 LOOPcondition
 LOOPconditionW
 LOOPcondition
 Loop Conditionally

 Loops repeatedly to a specified label if condition is met and if CX is not
 0. On the 80386/486, these instructions use the 16-bit CX in
 16-bit mode and the 32-bit ECX in 32-bit mode. This default can be
 overridden with the W (CX) or D (ECX) forms of the instruction. The
 instruction decrements CX (without changing any flags) and tests whether the
 zero flag was set by a previous instruction (such as CMP). With LOOPE and
 LOOPZ (they are synonyms), execution is transferred to the label if the zero
 flag is set and CX is not 0. With LOOPNE and LOOPNZ (they are synonyms),
 execution is transferred to the label if the zero flag is cleared and CX is
 not 0. Execution continues at the next instruction if the condition is not
 met. Before entering the loop, CX should be set to the maximum number of
 repetitions desired.



 LSL
 Load Segment Limit
 80286-80486 Protected Only

 Loads the segment limit of a selector into a specified register. The source
 operand must be a register or memory operand containing a selector. The
 destination operand must be a register that will receive the segment limit
 if the selector is valid and visible at the current privilege level. The
 zero flag is set if the segment limit is transferred, or cleared if it is
 not. See Intel documentation for details on selectors, segment limits, and
 other protected-mode concepts.



 LSS
 Load Far Pointer to Stack Segment

 See LDS.



 LTR
 Load Task Register
 80286-80486 Privileged Only

 Loads a value from the specified operand to the current task register. LTR
 is available only in privileged mode. See Intel documentation for details on
 task registers and other protected-mode concepts.



 MOV
 Move Data

 Moves the value in the source operand to the destination operand. If the
 destination operand is SS, interrupts are disabled until the next
 instruction is executed (except on early versions of the 8088 and 8086).



 MOV
 Move to/from Special Registers
 80386/486 Only

 Moves a value from a special register to or from a 32-bit general-purpose
 register. The special registers include the control registers CR0, CR2, and
 CR3; the debug registers DR0, DR1, DR2, DR3, DR6, and DR7; and the test
 registers TR6 and TR7. On the 80486, the test registers TR4, TR5, and TR7
 are also available. See Intel documentation for details on special
 registers.



 MOVS/MOVSB/
 MOVSW/MOVSD
 Move String Data

 Moves a string from one area of memory to another. The source string must be
 pointed to by DS:SI, and the destination address must be pointed to by ES:DI
 (even if operands are given). For each element moved, DI and SI are adjusted
 according to the size of the operands and the status of the direction flag.
 They are increased if the direction flag has been cleared with CLD, or
 decreased if the direction flag has been set with STD.

 If the MOVS form of the instruction is used, operands must be provided to
 indicate the size of the data elements to be processed. A segment override
 can be given for the source operand (but not for the destination). If MOVSB
 (bytes), MOVSW (words), or MOVSD (doublewords on the 80386/486 only) is
 used, the instruction determines the size of the data elements to be
 processed.

 MOVS and its variations are normally used with the REP prefix.



 MOVSX
 Move with Sign-Extend
 80386/486 Only

 Moves and sign-extends the value of the source operand to the destination
 register. MOVSX is used to copy a signed 8-bit or 16-bit source operand to a
 larger 16-bit or 32-bit destination register.



 MOVZX
 Move with Zero-Extend
 80386/486 Only

 Moves and zero-extends the value of the source operand to the destination
 register. MOVZX is used to copy an unsigned 8-bit or
 16-bit source operand to a larger 16-bit or 32-bit destination register.



 MUL
 Unsigned Multiply

 Multiplies an implied destination operand by a specified source operand.
 Both operands are treated as unsigned numbers. If a single
 16-bit operand is given, the implied destination is AX and the product goes
 into the DX:AX register pair. If a single 8-bit operand is given, the
 implied destination is AL and the product goes into AX. On the 80386/486, if
 the operand is EAX, the product goes into the EDX:EAX register pair. The
 carry and overflow flags are set if DX is not 0 for 16-bit operands or if AH
 is not 0 for 8-bit operands.



 NEG
 Two's Complement Negation

 Replaces the operand with its two's complement. NEG does this by subtracting
 the operand from 0. If the operand is 0, the carry flag is cleared.
 Otherwise, the carry flag is set. If the operand contains the maximum
 possible negative value (-128 for 8-bit operands or -32,768 for 16-bit
 operands), the value does not change, but the overflow and carry flags are
 set.



 NOP
 No Operation

 Performs no operation. NOP can be used for timing delays or alignment.



 NOT
 One's Complement Negation

 Toggles each bit of the operand by clearing set bits and setting cleared
 bits.



 OR
 Inclusive OR

 Performs a bitwise OR operation on the source and destination operands and
 stores the result to the destination operand. For each
 bit position in the operands, if either or both bits are set, the
 corresponding bit of the result it set. Otherwise, the corresponding
 bit of the result is cleared.



 OUT
 Output to Port

 Transfers a byte or word (or a doubleword on the 80386/486) to a port from
 the accumulator register. The port address is specified by the destination
 operand, which can be DX or an 8-bit constant. In protected mode, a
 general-protection fault occurs if OUT is used when the current privilege
 level is greater than the value of the IOPL flag.



 OUTS/OUTSB/
 OUTSW/OUTSD
 Output String to Port
 80186-80486 Only

 Sends a string to a port. The string is considered the source and must be
 pointed to by DS:SI (even if an operand is given). The output port is
 specified in DX. For each element sent, SI is adjusted according to the size
 of the operand and the status of the direction flag. SI is increased if the
 direction flag has been cleared with CLD or decreased if the direction flag
 has been set with STD.

 If the OUTS form of the instruction is used, an operand must be provided to
 indicate the size of data elements to be sent. A segment override can be
 given. If OUTSB (bytes), OUTSW (words), or OUTSD (doublewords on the
 80386/486 only) is used, the instruction determines the size of the data
 elements to be sent.

 OUTS and its variations are normally used with the REP prefix. Before the
 instruction is executed, CX should contain the number of elements to send.
 In protected mode, a general-protection fault occurs if OUTS is used when
 the current privilege level is greater than the value of the IOPL flag.



 POP
 Pop

 Pops the top of the stack into the destination operand. The value at SS:SP
 is copied to the destination operand and SP is increased by 2. The
 destination operand can be a memory location, a general-purpose 16-bit
 register, or any segment register except CS. Use RET to pop CS. On the
 80386/486, 32-bit values can be popped by giving a 32-bit operand. ESP is
 increased by 4 for 32-bit pops.



 POPA/POPAD
 Pop All
 80186-80486 Only

 Pops the top 16 bytes on the stack into the 8 general-purpose registers. The
 registers are popped in the following order: DI, SI, BP, SP, BX, DX, CX, AX.
 The value for the SP register is actually discarded rather than copied to
 SP. POPA always pops into 16-bit registers. On the 80386/486, use POPAD to
 pop into 32-bit registers.



 POPF/POPFD
 Pop Flags

 Pops the value on the top of the stack into the flags register. POPF always
 pops into the 16-bit flags register. On the 80386/486, use POPFD to pop into
 the 32-bit flags register.



 PUSH/PUSHW/PUSHD
 Push

 Pushes the source operand onto the stack. SP is decreased by 2 and the
 source value is copied to SS:SP. The operand can be a memory location, a
 general-purpose 16-bit register, or a segment register. On the 80186-80486
 processors, the operand can also be a constant. On the 80386/486, 32-bit
 values can be pushed by specifying a 32-bit operand. ESP is decreased by 4
 for 32-bit pushes. On the 8088 and 8086, PUSH SP saves the value of SP after
 the push. On the 80186-80486 processors, PUSH SP saves the value of SP
 before the push. The PUSHW and PUSHD instructions push a word (2 bytes) and
 a doubleword (4 bytes), respectively.



 PUSHA/PUSHAD
 Push All
 80186-80486 Only

 Pushes the eight general-purpose registers onto the stack. The registers are
 pushed in the following order: AX, CX, DX, BX, SP, BP, SI, DI. The value
 pushed for SP is the value before the instruction. PUSHA always pushes
 16-bit registers. On the 80386/486, use PUSHAD to push 32-bit registers.



 PUSHF/PUSHFD
 Push Flags

 Pushes the flags register onto the stack. PUSHF always pushes the 16-bit
 flags register. On the 80386/486, use PUSHFD to push the 32-bit flags
 register.



 RCL/RCR/ROL/ROR
 Rotate

 Rotates the bits in the destination operand the number of times specified in
 the source operand. RCL and ROL rotate the bits left; RCR and ROR rotate
 right.

 ROL and ROR rotate the number of bits in the operand. For each rotation, the
 leftmost or rightmost bit is copied to the carry flag as well as rotated.
 RCL and RCR rotate through the carry flag. The carry flag becomes an
 extension of the operand so that a 9-bit rotation is done for 8-bit
 operands, or a 17-bit rotation for 16-bit operands.

 On the 8088 and 8086, the source operand can be either CL or 1. On the
 80186-80486, the source operand can be CL or an 8-bit constant. On the
 80186-80486, rotate counts larger than 31 are masked off, but on the 8088
 and 8086, larger rotate counts are performed despite the inefficiency
 involved. The overflow flag is only modified by single-bit variations of the
 instruction; for multiple-bit variations, it is undefined.



 REP
 Repeat String

 Repeats a string instruction the number of times indicated by CX. First, CX
 is compared to zero; if it equals zero, execution proceeds to the next
 instruction. Otherwise, CX is decremented, the string instruction is
 performed, and the loop continues with CX being compared to zero. REP is
 used with MOVS and STOS. REP can also be used with INS and OUTS on the
 80186-80486 processors. On all processors except the 80386/486, combining a
 repeat prefix with a segment override can cause errors if an interrupt
 occurs.



 REPcondition
 Repeat String Conditionally

 Repeats a string instruction as long as condition is true and the maximum
 count has not been reached. REPE and REPZ (they are synonyms) repeat while
 the zero flag is set. REPNE and REPNZ (they are synonyms) repeat while the
 zero flag is cleared. The conditional-repeat prefixes should only be used
 with SCAS and CMPS, since these are the only string instructions that modify
 the zero flag. Before executing the instruction, CX should be set to the
 maximum allowable number of repetitions. First, CX is compared to zero; if
 it equals zero, execution proceeds to the next instruction. Otherwise, CX is
 decremented, the string instruction is performed, and the loop continues
 with CX being compared to zero. On all processors except the 80386/486,
 combining a repeat prefix with a segment override may cause errors if an
 interrupt occurs during a string operation.



 RET/RETN/RETF
 Return from Procedure

 Returns from a procedure by transferring control to an address popped from
 the top of the stack. A constant operand can be given indicating the number
 of additional bytes to release. The constant is normally used to adjust the
 stack for arguments pushed before the procedure was called. The size of a
 return (near or far) is the size of the procedure in which the RET is
 defined with the PROC directive. RETN can be used to specify a near return;
 RETF can specify a far return. A near return pops a word into IP. A far
 return pops a word into IP and then pops a word into CS. After the return,
 the number of bytes given in the operand (if any) is added to SP.



 ROL/ROR
 Rotate

 See RCL/RCR.



 SAHF
 Store AH into Flags

 Transfers AH into bits 0 to 7 of the flags register. This includes the
 carry, parity, auxiliary carry, zero, and sign flags, but not the trap,
 interrupt, direction, or overflow flags.



 SAL/SAR
 Shift

 See SHL/SHR/SAL/SAR.



 SBB
 Subtract with Borrow

 Adds the carry flag to the second operand, then subtracts that value from
 the first operand. This result is assigned to the first operand. SBB is used
 to subtract the least significant portions of numbers that must be processed
 in multiple registers.



 SCAS/SCASB/
 SCASW/SCASD
 Scan String Flags

 Scans a string to find a value specified in the accumulator register. The
 string to be scanned is considered the destination and must be pointed to by
 ES:DI (even if an operand is specified). For each element, the destination
 element is subtracted from the accumulator value and the flags are updated
 to reflect the result (although the result is not stored). DI is adjusted
 according to the size of the operands and the status of the direction flag.
 DI is increased if the direction flag has been cleared with CLD or decreased
 if the direction flag has been set with STD.

 If the SCAS form of the instruction is used, an operand must be provided to
 indicate the size of the data elements to be processed. No segment override
 is allowed. If SCASB (bytes), SCASW (words), or SCASD (doublewords on the
 80386/486 only) is used, the instruction determines the size of the data
 elements to be processed and whether the element scanned for is in AL, AX,
 or EAX.

 SCAS and its variations are normally used with repeat prefixes. REPNE (or
 REPNZ) is used to find the first match of the accumulator value. REPE (or
 REPZ) is used to find the first nonmatch. Before the comparison, CX should
 contain the maximum number of elements to compare. After a REPNE SCAS, the
 zero flag will be cleared if no match was found. After a REPE SCAS, the zero
 flag will be set if no nonmatch was found. Otherwise, ES:DI will point to
 the element past the first match or nonmatch.



 SETcondition
 Set Conditionally
 80386/486 Only

 Sets the byte specified in the operand to 1 if condition is true or to 0 if
 condition is false. The condition is tested by checking the flags shown in
 the table on the following page. The instruction is used to set Boolean
 flags conditionally.



 SGDT/SIDT/SLDT
 Store Descriptor Table
 80286-80486 Only

 Stores a descriptor table register into a specified operand. SGDT stores the
 Global Descriptor Table; SIDT, the Interrupt Descriptor Table; and SLDT, the
 Local Descriptor Table. These instructions are generally useful only in
 privileged mode. See Intel documentation for details on descriptor tables
 and other protected-mode concepts.


 SHL/SHR/SAL/SAR
 Shift

 Shifts the bits in the destination operand the number of times specified by
 the source operand. SAL and SHL shift the bits left; SAR and SHR shift
 right.

 With SHL, SAL, and SHR, the bit shifted off the end of the operand is copied
 into the carry flag and the leftmost or rightmost bit opened by the shift is
 set to 0. With SAR, the bit shifted off the end of the operand is copied
 into the carry flag and the leftmost bit opened by
 the shift retains its previous value (thus preserving the sign of the
 operand). SAL and SHL are synonyms.

 On the 8088 and 8086, the source operand can be either CL or 1. On the
 80186-80486 processors, the source operand can be CL or an 8-bit constant.
 On the 80186-80486 processors, shift counts larger than 31 are masked off,
 but on the 8088 and 8086, larger shift counts are performed despite the
 inefficiency involved. The overflow flag is only modified by single-bit
 variations of the instruction; for multiple-bit variations, it is undefined.



 SHLD/SHRD
 Double Precision Shift
 80386/486 Only

 Shifts the bits of the second operand into the first operand. The number of
 bits shifted is specified by the third operand. SHLD shifts the first
 operand to the left by the number of positions specified in the count. The
 positions opened by the shift are filled by the most significant bits of the
 second operand. SHRD shifts the first operand to the right by the number of
 positions specified in the count. The positions opened by the shift are
 filled by the least significant bits of the second operand. The count
 operand can be either CL or an 8-bit constant. If a shift count larger than
 31 is given, it is adjusted by using the remainder (modulus) of a division
 by 32.



 SMSW
 Store Machine Status Word
 80286-80486 Only

 Stores the Machine Status Word (MSW) into a specified memory operand. SMSW
 is generally useful only in protected mode. See Intel documentation for
 details on the MSW and other protected-mode concepts.



 STC
 Set Carry Flag

 Sets the carry flag.



 STD
 Set Direction Flag

 Sets the direction flag. All subsequent string instructions will process
 down (from high addresses to low addresses).



 STI
 Set Interrupt Flag

 Sets the interrupt flag. When the interrupt flag is set, maskable interrupts
 are recognized. If interrupts were disabled by a previous CLI instruction,
 pending interrupts will not be executed immediately; they will be executed
 after the instruction following STI.



 STOS/STOSB/
 STOSW/STOSD
 Store String Data

 Stores the value in the accumulator in a string. The string to be filled is
 the destination and must be pointed to by ES:DI (even if an operand is
 given). For each source element loaded, DI is adjusted according to the size
 of the operands and the status of the direction flag. DI is increased if the
 direction flag has been cleared with CLD or decreased if the direction flag
 has been set with STD.

 If the STOS form of the instruction is used, an operand must be provided to
 indicate the size of the data elements to be processed. No segment override
 is allowed. If STOSB (bytes), STOSW (words), or STOSD (doublewords on the
 80386/486 only) is used, the instruction determines the size of the data
 elements to be processed and whether the element comes from AL, AX, or EAX.

 STOS and its variations are often used with the REP prefix. Before the
 repeated instruction is executed, CX should contain the number of elements
 to store.



 STR
 Store Task Register
 80286-80486 Only

 Stores the current task register to the specified operand. This instruction
 is generally useful only in privileged mode. See Intel documentation for
 details on task registers and other protected-mode concepts.


 SUB
 Subtract

 Subtracts the source operand from the destination operand and stores the
 result in the destination operand.



 TEST
 Logical Compare

 Tests specified bits of an operand and sets the flags for a subsequent
 conditional jump or set instruction. One of the operands contains the value
 to be tested. The other contains a bit mask indicating the bits to be
 tested. TEST works by doing a bitwise AND operation on the source and
 destination operands. The flags are modified according to the result, but
 the destination operand is not changed. This instruction is the same as the
 AND instruction, except the result is not stored.



 VERR/VERW
 Verify Read or Write
 80286-80486 Protected Only

 Verifies that a specified segment selector is valid and can be read or
 written to at the current privilege level. VERR verifies that the selector
 is readable. VERW verifies that the selector can be written to. If the
 segment is verified, the zero flag is set. Otherwise, the zero flag is
 cleared.



 WAIT
 Wait

 Suspends processor execution until the processor receives a signal that a
 coprocessor has finished a simultaneous operation. It should be used to
 prevent a coprocessor instruction from modifying a memory location that is
 being modified simultaneously by a processor instruction. WAIT is the same
 as the coprocessor FWAIT instruction.



 WBINVD
 Write Back and Invalidate Data Cache
 80486 Only

 Empties the contents of the current data cache but first writes changes to
 memory. Proper use of this instruction requires knowledge of how contents
 are placed in the cache. WBINVD is intended primarily for systems
 programming. See Intel documentation for details.



 XADD
 Exchange and Add
 80486 Only

 Adds the source and destination operands and stores the sum in the
 destination; simultaneously, the original value of the destination is moved
 to the source. The instruction sets flags according to the result of the
 addition.



 XCHG
 Exchange

 Exchanges the values of the source and destination operands.



 XLAT/XLATB
 Translate

 Translates a value from one coding system to another by looking up the value
 to be translated in a table stored in memory. Before the instruction is
 executed, BX should point to a table in memory and AL should contain the
 unsigned position of the value to be translated from the table. After the
 instruction, AL contains the table value with the specified position. No
 operand is required, but one can be given in order to specify a segment
 override. DS is assumed unless a segment override is given. XLATB is a
 synonym for XLAT. Either version allows an operand, but neither requires
 one.



 XOR
 Exclusive OR

 Performs a bitwise exclusive OR operation on the source and destination
 operands and stores the result in the destination. For each bit position in
 the operands, if both bits are set or if both bits are cleared, the
 corresponding bit of the result is cleared. Otherwise, the corresponding bit
 of the result is set.




 Coprocessor


 Topical Cross-Reference for Coprocessor


 Load
 FLD/FILD/FBLD
 FXCH
 FLDCW
 FLDENV
 FRSTOR


 Store Data
 FST/FIST
 FSTP/FISTP/FBSTP
 FSTCW/FNSTCW
 FSTSW/FNSTSW
 FSAVE/FNSAVE
 FSTENV/FNSTENV


 Load Constant
 FLD1
 FLDL2E
 FLDL2T
 FLDLG2
 FLDLN2
 FLDPI
 FLDZ


 Arithmetic
 FADD/FIADD
 FADDP
 FSUB/FISUB
 FSUBP
 FSUBR/FISUBR
 FSUBRP
 FMUL/FIMUL
 FMULP
 FSCALE
 FDIV/FIDIV
 FDIVP
 FDIVR/FIDIVR
 FDIVRP
 FABS
 FCHS
 FRNDINT
 FSQRT
 FPREM
 FPREM1
 FXTRACT


 Transcendental
 FPTAN
 FPATAN
 FSIN
 FCOS
 FSINCOS
 F2XM1
 FYL2X
 FYL2P1
 FPREM
 FPREM1


 Compare
 FCOM/FICOM
 FCOMP/FICOMP
 FCOMPP
 FUCOM
 FUCOMP
 FUCOMPP
 FTST
 FXAM
 FSTSW/FNSTSW


 Processor Control
 FINIT/FNINIT
 FFREE
 FNOP
 FWAIT
 FDECSTP
 FINCSTP
 FCLEX/FNCLEX
 FSETPM
 FDISI/FNDISI*
 FENI/FNENI*
 FSAVE/FNSAVE
 FLDCW
 FRSTOR
 FSTCW/FNSTCW
 FSTSW/FNSTSW
 FSTENV/FNSTENV



 Interpreting  Coprocessor Instructions

 This section provides an alphabetical reference to instructions of the 8087,
 80287, and 80387 coprocessors. The format is the same as the processor
 instructions except that encodings are not provided. Differences are noted
 below.
 The 80486 has the coprocessor built in. This one chip executes all the
 instructions listed in the previous section and this section.


 Syntax
 Syntaxes in Column 1 use the following abbreviations for operand types:

 reg
 A coprocessor stack register

 memreal
 A direct or indirect memory operand storing a real number

 memint
 A direct or indirect memory operand storing a binary integer

 membcd
 A direct or indirect memory operand storing a BCD number


 Examples
 The position of the examples in Column 2 is not related to the clock speeds
 in Column 3.


 Clock Speeds
 Column 3 shows the clock speeds for each processor. Sometimes an instruction
 may have more than one possible clock speed. The following abbreviations are
 used to specify variations:

 EA
 Effective address. This applies only to the 8087. See the Processor Section,
 "Timings on the 8088 and 8086 Processors," for an explanation of effective
 address timings.

 s,l,t
 Short real, long real, and 10-byte temporary real.

 w,d,q
 Word, doubleword, and quadword binary integer.

 to,fr
 To or from stack top. On the 80387 and 80486, the to clocks represent
 timings when ST is the destination. The fr clocks represent timings when ST
 is the source.



 Instruction Size
 The instruction size is always two bytes for instructions that do not access
 memory. For instructions that do access memory, the size is four bytes on
 the 8087 and 80287. On the 80387 and 80486, the size for instructions that
 access memory is four bytes in 16-bit mode or six bytes in 32-bit mode.
 On the 8087, each instruction must be preceded by the WAIT (also called
 FWAIT) instruction, thereby increasing the instruction's size by one byte.
 The assembler inserts WAIT automatically by default, or with the .8087
 directive.


 Architecture
 The 8087, 80287, and 80387 coprocessors, along with the 80486, have several
 elements of architecture in common. All have a register stack made up of
 eight 80-bit data registers. These can contain floating-point numbers in the
 temporary real format. The coprocessors also have 14 bytes of control
 registers. Figure 2 shows the format of registers.

 The most important control registers are the control word and the status
 word. Figure 3 shows the format of these registers.



 Coprocessor Instructions



 F2XM1
 2X-1

 Calculates Y = 2X - 1. X is taken from ST. The result, Y, is returned in ST.
 X must be in the range 0  X  0.5 on the 8087/287, or in the range -1.0  X
 +1.0 on the 80387/486.



 FABS
 Absolute Value

 Converts the element in ST to its absolute value.



 FADD/FADDP/FIADD
 Add

 Adds the source to the destination and returns the sum in the destination.
 If two register operands are specified, one must be ST. If a memory operand
 is specified, the sum replaces the value in ST. Memory operands can be 32-
 or 64-bit real numbers or 16- or 32-bit integers. If no operand is
 specified, ST is added to ST(1) and the stack is popped, returning the sum
 in ST. For FADDP, the source must be ST; the sum is returned in the
 destination and ST is popped.



 FBLD
 Load BCD

 See FLD.



 FBSTP
 Store BCD and Pop

 See FST.



 FCHS
 Change Sign

 Reverses the sign of the value in ST.



 FCLEX/FNCLEX
 Clear Exceptions

 Clears all exception flags, the busy flag, and bit 7 in the status word. Bit
 7 is the interrupt-request flag on the 8087 and the error-status flag on the
 80287, 80387, and 80486. The instruction has wait and no-wait versions.



 FCOM/FCOMP/FCOMPP/
 FICOM/FICOMPCompare

 Compares the specified source operand to ST and sets the condition codes of
 the status word according to the result. The instruction subtracts the
 source operand from ST without changing either operand. Memory operands can
 be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is
 specified or if two pops are specified, ST is compared to ST(1) and the
 stack is popped. If one pop is specified with an operand, the operand is
 compared to ST. If one of the operands is a NAN, an invalid-operation
 exception occurs (see FUCOM for an alternative method of comparing on the
 80387/486).



 FCOS
 Cosine

 80387/486 Only
 Replaces a value in radians in ST with its cosine. If |ST| < 263, the C2 bit
 of the status word is cleared and the cosine is calculated. Otherwise, C2 is
 set and no calculation is performed. ST can be reduced to the required range
 with FPREM or FPREM1.
 * For operands with an absolute value greater than /4, up to 76 additional
 clocks may be required.
  For operands with an absolute value greater than /4, add n clocks where  n
 = operand/(/4).



 FDECSTP
 Decrement Stack Pointer

 Decrements the stack-top pointer in the status word. No tags or registers
 are changed, and no data is transferred. If the stack pointer is 0, FDECSTP
 changes it to 7.



 FDISI/FNDISI
 Disable Interrupts
 8087 Only

 Disables interrupts by setting the interrupt-enable mask in the control
 word. This instruction has wait and no-wait versions. Since the 80287,
 80387, and 80486 do not have an interrupt-enable mask, the instruction is
 recognized but ignored on these coprocessors.



 FDIV/FDIVP/FIDIV
 Divide

 Divides the destination by the source and returns the quotient in the
 destination. If two register operands are specified, one must be ST. If a
 memory operand is specified, the quotient replaces the value in ST. Memory
 operands can be 32- or 64-bit real numbers or 16- or 32-bit
 integers. If no operand is specified, ST(1) is divided by ST and the stack
 is popped, returning the result in ST. For FDIVP, the source must be ST; the
 quotient is returned in the destination register and ST is popped.



 FDIVR/FDIVRP/FIDIVR
 Divide Reversed

 Divides the source by the destination and returns the quotient in the
 destination. If two register operands are specified, one must be ST. If a
 memory operand is specified, the quotient replaces the value in ST. Memory
 operands can be 32- or 64-bit real numbers or 16- or 32-bit
 integers. If no operand is specified, ST is divided by ST(1) and the stack
 is popped, returning the result in ST. For FDIVRP, the source must be ST;
 the quotient is returned in the destination register and ST is popped.



 FENI/FNENI
 Enable Interrupts
 8087 Only

 Enables interrupts by clearing the interrupt-enable mask in the control
 word. This instruction has wait and no-wait versions. Since the 80287,
 80387, and 80486 do not have an interrupt-enable mask, the instruction is
 recognized but ignored on these coprocessors.



 FFREE
 Free Register

 Changes the specified register's tag to empty without changing the contents
 of the register.



 FIADD/FISUB/FISUBR/
 FIMUL/FIDIV/FIDIVR
 Integer Arithmetic

 See FADD, FSUB, FSUBR, FMUL, FDIV, and FDIVR.



 FICOM/FICOMP
 Compare Integer

 See FCOM.



 FILD
 Load Integer

 See FLD.



 FINCSTP
 Increment Stack Pointer

 Increments the stack-top pointer in the status word. No tags or registers
 are changed, and no data is transferred. If the stack pointer is 7, FINCSTP
 changes it to 0.



 FINIT/FNINIT
 Initialize Coprocessor

 Initializes the coprocessor and resets all the registers and flags to their
 default values. The instruction has wait and no-wait versions. On the
 80387/486, the condition codes of the status word are cleared. On the
 8087/287, they are unchanged.



 FIST/FISTP
 Store Integer

 See FST.



 FLD/FILD/FBLD
 Load

 Pushes the specified operand onto the stack. All memory operands are
 automatically converted to temporary-real numbers before being loaded.
 Memory operands can be 32-, 64-, or 80-bit real numbers or 16-, 32-, or
 64-bit integers.



 FLD1/FLDZ/FLDPI/FLDL2E/
 FLDL2T/FLDLG2/FLDLN2
 Load Constant

 Pushes a constant onto the stack.


 FLDCW
 Load Control Word

 Loads the specified word into the coprocessor control word. The format of
 the control word is shown in the "Interpreting Coprocessor Instructions"
 section.



 FLDENV/FLDENVW/FLDENVD
 Load Environment State

 Loads the 14-byte coprocessor environment state from a specified memory
 location. The environment includes the control word, status word, tag word,
 instruction pointer, and operand pointer. On the 80387/486 in 32-bit mode,
 the environment state is 28 bytes.



 FMUL/FMULP/FIMUL
 Multiply

 Multiplies the source by the destination and returns the product in the
 destination. If two register operands are specified, one must be ST. If a
 memory operand is specified, the product replaces the value in ST. Memory
 operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no
 operand is specified, ST(1) is multiplied by ST and the stack is popped,
 returning the product in ST. For FMULP, the source must be ST; the product
 is returned in the destination register and ST is popped.



 FNinstruction
 No-Wait Instructions

 Instructions that have no-wait versions include FCLEX, FDISI, FENI, FINIT,
 FSAVE, FSTCW, FSTENV, and FSTSW. Wait versions of instructions check for
 unmasked numeric errors; no-wait versions do not. When the .8087 directive
 is used, the assembler puts a WAIT instruction before the wait versions and
 a NOP instruction before the no-wait versions.




 FNOP
 No Operation

 Performs no operation. FNOP can be used for timing delays or alignment.



 FPATAN
 Partial Arctangent

 Finds the partial tangent by calculating Z = ARCTAN(Y / X). X is taken from
 ST and Y from ST(1). On the 8087/287, Y and X must be in the range 0  Y < X
 < . On the 80387/486, there is no restriction on X and Y. X is popped from
 the stack and Z replaces Y in ST.



 FPREM
 Partial Remainder

 Calculates the remainder of ST divided by ST(1), returning the result in ST.
 The remainder retains the same sign as the original dividend. The
 calculation uses the following formula:

 Condition Codes for FPREM and FPREM1

 C3    C2    C1    C0    Meaning
  ?     1     ?     ?    Incomplete reduction
  0     0     0     0    quotient MOD 8 = 0
  0     0     0     1    quotient MOD 8 = 4
  0     0     1     0    quotient MOD 8 = 1
  0     0     1     1    quotient MOD 8 = 5
  1     0     0     0    quotient MOD 8 = 2
  1     0     0     1    quotient MOD 8 = 6
  1     0     1     0    quotient MOD 8 = 3
  1     0     1     1    quotient MOD 8 = 7



 FPREM1
 Partial Remainder (IEEE Compatible)
 80387/486 Only

 Calculates the remainder of ST divided by ST(1), returning the result in ST.
 The remainder retains the same sign as the original dividend.



 FPTAN
 Partial Tangent

 Finds the partial tangent by calculating Y / X = TAN(Z). Z is taken from ST.
 Z must be in the range 0  Z   / 4 on the 8087/287. On the 80387/486, |Z|
 must be less than 263. The result is the ratio Y / X. Y replaces Z, and X is
 pushed into ST. Thus, Y is returned in ST(1) and X in ST.



 FRNDINT
 Round to Integer

 Rounds ST from a real number to an integer. The rounding control (RC) field
 of the control word specifies the rounding method, as shown in the
 introduction to this section.



 FRSTOR/FRSTORW/FRSTORD
 Restore Saved State

 Restores the 94-byte coprocessor state to the coprocessor from the specified
 memory location. In 32-bit mode on the 80387/486, the environment state
 takes 108 bytes.



 FSAVE/FSAVEW/FSAVED
 FNSAVE/FNSAVEW/FNSAVED
 Save Coprocessor State

 Stores the 94-byte coprocessor state to the specified memory location. In
 32-bit mode on the 80387/486, the environment state takes 108 bytes. This
 instruction has wait and no-wait versions. After the save, the coprocessor
 is initialized as if FINIT had been executed.



 FSCALE
 Scale

 Scales by powers of 2 by calculating the function Y = Y * 2X. X is the
 scaling factor taken from ST(1), and Y is the value to be scaled from ST.
 The scaled result replaces the value in ST. The scaling factor remains in
 ST(1). If the scaling factor is not an integer, it will be truncated toward
 zero before the scaling.



 FSETPM
 Set Protected Mode
 80287 Only

 Sets the 80287 to protected mode. The instruction and operand pointers are
 in the protected-mode format after this instruction. On the 80387/486,
 FSETPM is recognized but interpreted as FNOP, since the 80386/486 processors
 handle addressing identically in real and protected mode.



 FSIN
 Sine
 80387/486 Only

 Replaces a value in radians in ST with its sine. If |ST| < 263, the C2 bit
 of the status word is cleared and the sine is calculated. Otherwise, C2 is
 set and no calculation is performed. ST can be reduced to the required range
 with FPREM or FPREM1.



 FSINCOS
 Sine and Cosine
 80387/486 Only

 Computes the sine and cosine of a radian value in ST. The sine replaces the
 value in ST, and then the cosine is pushed onto the stack. If |ST| < 263,
 the C2 bit of the status word is cleared and the sine and cosine are
 calculated. Otherwise, C2 is set and no calculation is performed. ST can be
 reduced to the required range with FPREM or FPREM1.



 FSQRT
 Square Root

 Replaces the value of ST with its square root. (The square root of -0
 is -0.)



 FST/FSTP/FIST/FISTP/FBSTP
 Store

 Stores the value in ST to the specified memory location or register.
 Temporary-real values in registers are converted to the appropriate integer,
 BCD, or floating-point format as they are stored. With FSTP, FISTP, and
 FBSTP, the ST register value is popped off the stack. Memory operands can be
 32-, 64-, or 80-bit real numbers for FSTP or 16-, 32-, or 64-bit integers
 for FISTP.



 FSTCW/FNSTCW
 Store Control Word

 Stores the control word to a specified 16-bit memory operand. This
 instruction has wait and no-wait versions.



 FSTENV/FSTENVW/FSTENVD
 FNSTENV/FNSTENVW/FNSTENVD
 Store Environment State

 Stores the 14-byte coprocessor environment state to a specified memory
 location. The environment state includes the control word, status word, tag
 word, instruction pointer, and operand pointer. On the 80387/486 in 32-bit
 mode, the environment state is 28 bytes.



 FSTSW/FNSTSW
 Store Status Word

 Stores the status word to a specified 16-bit memory operand. On the 80287,
 80387, and 80486, the status word can also be stored to the processor's AX
 register. This instruction has wait and no-wait versions.



 FSUB/FSUBP/FISUB
 Subtract

 Subtracts the source operand from the destination operand and returns the
 difference in the destination operand. If two register operands are
 specified, one must be ST. If a memory operand is specified, the result
 replaces the value in ST. Memory operands can be 32- or 64-bit real numbers
 or 16- or 32-bit integers. If no operand is specified, ST is subtracted from
 ST(1) and the stack is popped, returning the difference in ST. For FSUBP,
 the source must be ST; the difference (destination minus source) is returned
 in the destination register and ST is popped.



 FSUBR/FSUBRP/FISUBR
 Subtract Reversed

 Subtracts the destination operand from the source operand and returns the
 result in the destination operand. If two register operands are specified,
 one must be ST. If a memory operand is specified, the result replaces the
 value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or
 32-bit integers. If no operand is specified, ST(1) is subtracted from ST and
 the stack is popped, returning the difference in ST. For FSUBRP, the source
 must be ST; the difference (source minus destination) is returned in the
 destination register and ST is popped.



 FTST
 Test for Zero

 Compares ST with +0.0 and sets the condition of the status word according to
 the result.

 Condition Codes for FTST

 C3    C2    C1    C0    Meaning
  0     0     ?     0    ST is positive
  0     0     ?     1    ST is negative
  1     0     ?     0    ST is 0
  1     1     ?     1    ST is not comparable (NAN or projective
 infinity)



 FUCOM/FUCOMP/FUCOMPP
 Unordered Compare
 80387/486 Only

 Compares the specified source to ST and sets the condition codes of the
 status word according to the result. The instruction subtracts the source
 operand from ST without changing either operand. Memory operands are not
 allowed. If no operand is specified or if two pops are specified, ST is
 compared to ST(1). If one pop is specified with an operand, the given
 register is compared to ST.

 Condition Codes for FUCOM

 C3    C2    C1    C0    Meaning
  0     0     ?     0    ST > source
  0     0     ?     1    ST < source
  1     0     ?     0    ST = source
  1     1     ?     1    Unordered



 FWAIT
 Wait

 Suspends execution of the processor until the coprocessor is finished
 executing. This is an alternate mnemonic for the processor WAIT instruction.



 FXAM
 Examine

 Reports the contents of ST in the condition flags of the status word.

 Condition Codes for FXAM

 C3    C2    C1    C0    Meaning
  0     0     0     0    + Unnormal*
  0     0     0     1    + NAN
  0     0     1     0    - Unnormal*
  0     0     1     1    - NAN
  0     1     0     0    + Normal
  0     1     0     1    + Infinity
  0     1     1     0    - Normal
  0     1     1     1    - Infinity
  1     0     0     0    + 0
  1     0     0     1    Empty
  1     0     1     0    - 0
  1     0     1     1    Empty
  1     1     0     0    + Denormal
  1     1     0     1    Empty*
  1     1     1     0    - Denormal
  1     1     1     1    Empty*


 * Not used on the 80387/486. Unnormals are not supported by the 80387/486.
 Also, the 80387/486 use two codes instead of four to identify empty
 registers.



 FXCH
 Exchange Registers

 Exchanges the specified (destination) register and ST. If no operand is
 specified, ST and ST(1) are exchanged.



 FXTRACT
 Extract Exponent and Significand

 Extracts the exponent and significand (mantissa) fields of ST. The exponent
 replaces the value in ST, and then the significand is pushed onto the stack.



 FYL2X
 Y log2(X)

 Calculates Z = Y log2(X). X is taken from ST and Y from ST(1). The stack is
 popped, and the result, Z, replaces Y in ST. X must be in the range 0 < X <
 and Y in the range - < Y < .



 FYL2XP1
 Y log2(X+1)

 Calculates Z = Y log2(X + 1). X is taken from ST and Y from ST(1). The stack
 is popped once, and the result, Z, replaces Y in ST. X must be in the range
 0  |X| < (1 - (2 / 2)). Y must be in the range
 - < Y < .

