PCjs Machines

Home of the original IBM PC emulator for browsers.

Logo

The MS-DOS Encyclopedia

Section IV: Programming Utilities

INTRODUCTION


    This section of The MS-DOS Encyclopedia describes the Microsoft
    utilities, documentation aids, and debuggers that can be used with the
    Microsoft C, FORTRAN, Pascal, and BASIC compilers and with the
    Microsoft Macro Assembler (MASM). Included are operating instructions
    for MASM, the Macro Assembler; LIB, the Library Manager; LINK, the
    Microsoft Object Linker; the DEBUG, SYMDEB, and CodeView program
    debuggers; MAKE, which automates maintenance of programs; CREF, which
    produces a cross-reference listing of symbols;  and EXE2BIN, EXEMOD,
    and EXEPACK, which modify executable files.

    Entries (except for the program debuggers) are arranged alphabetically
    by the name of the programming utility. The three Microsoft debuggers
    are listed at the end of the section in the following order: DEBUG,
    SYMDEB, CodeView. Individual DEBUG and SYMDEB commands appear
    alphabetically under the headings DEBUG and SYMDEB.

    Each utility entry includes

    ■  Utility name
    ■  Utility purpose
    ■  Prototype command line and summary of options
    ■  Detailed description of utility
    ■  One or more examples of utility use
    ■  Return codes (where applicable)
    ■  Error messages and warnings (where applicable)

    The experienced user can find information with a quick glance at the
    first part of a utility entry; a less experienced user can refer to
    the detailed explanation and examples in a more leisurely fashion. The
    next two pages contain an example of a typical entry from the
    Programming Utilities section, with explanations of each
    component.



EXEPACK

Compress .EXE File


Purpose

    Compresses an executable .EXE program file so that it requires less
    space on the disk. The EXEPACK utility is supplied with the Microsoft
    Macro Assembler (MASM), C Compiler, FORTRAN Compiler, and Pascal
    Compiler. This documentation describes EXEPACK version 4.04.

Syntax

    EXEPACK exe file packed file

    where:

    exe file        is the name of the executable .EXE program file to be
                    compressed.

    packed file     is the name of the compressed program file.

Description

    The EXEPACK utility compresses an executable .EXE program by packing
    sequences of identical bytes and optimizing the relocation table. The
    EXEPACK utility is not compatible with versions of MS-DOS earlier than
    2.0.

    The exe file parameter specifies the name of the program file
    produced by the Microsoft Object Linker (LINK) and must contain the
    extension .EXE. The packed file parameter specifies the name and
    extension of the resulting compressed file. EXEPACK has no default
    extensions.

    The name for packed file must be different from the exe file
    filename. Although it is possible to fool EXEPACK into creating a
    packed file with the same name by specifying a different but
    equivalent pathname for the output file, the resulting packed file
    will probably be damaged. If the packed file is to replace the
    original .EXE file, a different name should be specified for the
    packed file; then the input file should be deleted and the packed file
    renamed with the name of the original file.

    When EXEPACK is used to compress an executable overlay file or a
    program that calls overlays, the packed file should be renamed with
    its original name before use to avoid interruption by the overlay-
    manager prompt.

    The effects of EXEPACK depend on program characteristics. Most
    programs can be processed with EXEPACK to occupy significantly less
    disk space. Programs thus compressed also load for execution more
    quickly. Occasionally programs (particularly small ones) actually
    become larger after processing with EXEPACK; in such cases the file
    produced by EXEPACK should be discarded. Microsoft Windows programs or
    programs to be debugged under DEBUG, SYMDEB, or CodeView should not be
    compressed with EXEPACK.

    Using EXEPACK on a previously linked program is equivalent to
    specifying LINK's /EXEPACK switch while linking that program.

    Note: When using the EXEMOD utility with packed .EXE files created
    with EXEPACK or the /EXEPACK linker switch, use the EXEMOD version
    shipped with LINK or with the EXEPACK utility to ensure
    compatibility.

Return Codes

    0  No error; the EXEPACK operation was successful.
    1  An error was encountered that terminated execution of the EXEPACK
        utility.

Example

    To compress the file BUILD.EXE into a file named BUILDX.EXE,
    type

    C>EXEPACK BUILD.EXE BUILDX.EXE  <Enter>

Messages

    fatal error U1100: out of space on output file
    The destination disk has insufficient space for the output file, or
    the root directory is full.

    fatal error U1101: filename: file not found
    The .EXE file specified in the command line cannot be found.

    fatal error U1102: filename: permission denied
    A file with the same name as the specified output file already exists
    and is read-only.

    fatal error U1103: cannot pack file onto itself
    The file cannot be compressed because the name specified for the
    packed file is the same as the name of the source .EXE file.

    fatal error U1104: usage : exepack <infile> <outfile>
    The command line contained a syntax error, or the output filename was
    not specified.

    fatal error U1105: invalid .EXE file; bad header
    The file is not an executable file or has an invalid file
    header.

    fatal error U1106: cannot change load-high program
    The file cannot be compressed because the minimum allocation value and
    the maximum allocation value are both zero. See also PROGRAMMING
    UTILITIES: EXEMOD.

    fatal error U1107: cannot pack already-packed file
    The file specified has already been packed with EXEPACK.

    fatal error U1108: invalid .EXE file; actual length less than
    reported
    The file size indicated in the .EXE file header does not match the
    size recorded in the disk directory.

    fatal error U1109: out of memory
    The EXEPACK utility did not have enough memory to operate.



CREF
Generate Cross-Reference Listing


Purpose

    Produces a cross-reference listing of all symbols in an assembly
    language program. The CREF utility is supplied with the Microsoft
    Macro Assembler (MASM). This documentation describes CREF version
    4.0.

Syntax

    CREF

    or

    CREF crf_file[;]

    or

    CREF crf_file,ref_file

    where:

    crf_file   is the input file previously produced by MASM (default
                extension = .CRF).

    ref_file   is the output ASCII text file to be created (default
                extension = .REF).

Description

    The CREF utility processes a file produced by MASM and generates an
    ASCII cross-reference listing in a file on disk or directly on a
    character device (such as a printer). The output file contains an
    alphabetic list of the symbols in the assembled program, including the
    line number of each reference to the symbol and the total number of
    symbols in the program. A pound sign (#) follows the line number of
    the reference that defines the symbol.

    The crf_file has the default extension .CRF. It is produced by
    providing MASM with a filename other than NUL in the cross-reference
    position in the command line, by responding to the Cross-reference:
    prompt, or by including the /C switch in the MASM command line or at
    any MASM prompt. An assembly source listing file (.LST) must also be
    requested in the MASM command line or in response to the MASM prompts
    in order to generate a valid .CRF file.

    If a semicolon follows the crf_file parameter in the CREF command,
    the resulting ref_file containing the cross-reference listing is given
    the same drive and pathname as crf_file, with a .REF extension. If the
    optional ref_file parameter is present, it can consist of any
    pathname with an optional extension (default is .REF). The cross-
    reference listing can be sent directly to a character device, rather
    than to a file, by specifying a valid character device name (such as
    PRN) in the ref_file position.

    If the CREF utility is run without any parameters or with some
    parameters missing, the CREF utility prompts the operator for the
    necessary information.

Return Codes

    0     No error; the CREF operation was successful.

    1     An error was encountered that terminated execution of the CREF
        utility.

Examples

    To process the file MENUMGR.CRF (created during assembly of
    MENUMGR.ASM) into the cross-reference file MENUMGR.REF, type

    C>CREF MENUMGR;  <Enter>

    To process the file MENUMGR.CRF and assign the name MENU.REF to the
    resulting cross-reference file, type

    C>CREF MENUMGR,MENU  <Enter>

    To process the file MENUMGR.CRF and send the cross-reference listing
    directly to the printer, type

    C>CREF MENUMGR,PRN  <Enter>

    To run the CREF program in interactive mode, type

    C>CREF  <Enter>

    The following is an example of an interactive CREF session:

C>CREF  <Enter>
Microsoft (R) Cross Reference Utility  Version 4.00
Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved.

Cross-reference [.CRF]: MENUMGR  <Enter>
Listing [MENUMGR.REF]:  <Enter>

9 Symbols

C>

    The following sequence of commands produces the cross-reference
    listing HELLO.REF from the assembly-language source file
    HELLO.ASM:

    C>MASM HELLO,HELLO,HELLO,HELLO  <Enter>
    C>CREF HELLO;  <Enter>

Contents of the file HELLO.ASM:

            name    hello
            page    55,132
            title   HELLO.ASM - print Hello on terminal
    ;
    ; HELLO.COM utility to demonstrate CREF listing
    ;
    cr      equ     0dh             ;ASCII carriage return
    lf      equ     0ah             ;ASCII linefeed

    cseg    segment para public "CODE"

            org     100h

            assume  cs:cseg,ds:cseg,es:cseg,ss:cseg

    print   proc    near
            mov     dx,offset message
            mov     ah,9            ;print the string "Hello"
            int     21h
            mov     ax,4c00h        ;exit to MS-DOS
            int     21h             ;with "return code" of zero
    print   endp

    message db      cr,lf,'Hello!',cr,lf,'$

    cseg    ends

            end     print

    Contents of the file HELLO.REF:

Microsoft Cross-Reference  Version 4.00          Mon Sep 07 23:31:21  1987
HELLO.ASM - print Hello on terminal

    Symbol Cross-Reference           (# is definition)               Cref-1

CODE . . . . . . . . . . . . . .   10
CR . . . . . . . . . . . . . . .    7     7#     24     25
CSEG . . . . . . . . . . . . . .   10    10#     14     14    14   14  27

LF . . . . . . . . . . . . . . .    8     8#     24     25

MESSAGE. . . . . . . . . . . . .    17   24      24#

PRINT. . . . . . . . . . . . . .    16   16#     29


6 Symbols

Messages

    can't open cross-reference file for reading
    The pathname or drive specified for the input .CRF file is invalid or
    does not exist.

    can't open listing file for writing
    A write error has halted the creation of the .REF listing file. This
    indicates that the disk is full or write-protected, that the specified
    output file is read-only, or that the specified device is not
    available.

    cref has no switches
    A switch was specified in the command line; CREF has no optional
    switches.

    DOS 2.0 or later required
    CREF does not work with versions of MS-DOS earlier than 2.0.

    extra file name ignored
    More than two filenames were specified in the command line. The CREF
    utility generates the cross-reference listing using the first two
    filenames specified.

    line invalid, start again
    No .CRF file was specified in the command line or at the prompt.
    Specify a valid .CRF file at the prompt following this message.

    out of heap space
    Memory is insufficient to process the .CRF file. Remove memory
    resident programs and shells or add more memory.

    premature eof
    The input file specified is damaged or is not a valid .CRFfile.

    read error on stdin
    A Control-Z was received from the keyboard or a redirected file and
    has halted CREF.



EXE2BIN
Convert .EXE File to Binary-Image File


Purpose

    Converts an executable file in the .EXE format to a memory-image file
    in binary format. The EXE2BIN utility is supplied with the MS-DOS
    distribution disks.

Syntax

    EXE2BIN exe_file [bin_file]

    where:

    exe_file        is the .EXE-format file to be converted (default
                    extension = .EXE).

    bin_file        is the name to be given to the converted file
                    (default extension = .BIN).

Description

    The .EXE executable program files produced by the Microsoft Object
    Linker (LINK) contain a special header and a relocation table as well
    as the program code and data. The EXE2BIN utility can be used to
    convert a .EXE file to a .COM executable file, which is an absolute
    memory image of the program to be executed and does not contain a
    special header or relocation table. The EXE2BIN utility can also be
    used to convert .EXE files with an origin of zero (such as installable
    MS-DOS device drivers) to pure memory-image files. Files in memory-
    image format (a common format for device drivers and for programs to
    be placed in ROM for execution) usually have a .BIN or .SYS
    extension.

    To convert a .EXE program to a binary-image file, the following are
    required:

    ■  The program must be a valid .EXE file produced by LINK.

    ■  The program can contain only one segment and cannot contain a
        declared stack segment.

    ■  The program code and data portion of the .EXE file must be less
        than 64 KB.

    To convert a .EXE program to an executable .COM file, the following
    are required:

    ■  The origin of the program must be 0100H, which must also be
        specified as the entry point.

    ■  The program code and data portion of the .EXE file must be less
        than 65227 bytes (64 KB minus 256 bytes used by the program segment
        prefix minus 2 bytes initially placed on the stack).

    ■  The program must not include any FAR references.

    Note: Many compilers cannot create programs that can be converted to
    .COM files. Check the compiler documentation for specific information
    concerning executable .COM files.

    The exe_file parameter in the command line can have any filename and
    can include a drive and path; the default extension is .EXE. The
    optional bin_file parameter can also contain any filename and a drive
    and path; the default extension is .BIN. If no path is specified with
    the bin_file parameter, the output file is given the same drive and
    path as the exe_file. If no bin_file parameter is supplied, the
    output file is given the same name as the exe_file, with the
    extension .BIN.

    If the program in the .EXE file requires segment fixups (that is, if
    the program contains instructions requiring segment relocation, which
    would ordinarily be done by the MS-DOS loader using the .EXE file's
    relocation table), EXE2BIN prompts for a base segment address.  When
    segment fixups are necessary, the resulting program is not relocatable
    and must be loaded at the given location to be executed; the MS-DOS
    loader cannot load the program.

Examples

    To convert the file HELLO.EXE to the file HELLO.BIN, type

    C>EXE2BIN HELLO  <Enter>

    To convert the file CLEAN.EXE, which has an origin of 0100H and meets
    the requirements for an executable .COM file, to the file CLEAN.COM,
    type

    C>EXE2BIN CLEAN.EXE CLEAN.COM  <Enter>

    To convert the file ASYNCH.EXE, produced by assembling and linking the
    device-driver source file ASYNCH.ASM, to the installable device-driver
    file ASYNCH.SYS, type

    C>EXE2BIN ASYNCH.EXE ASYNCH.SYS  <Enter>

Messages

    File cannot be converted
    The program to be converted has one of the following problems: The
    program has an origin of 0100H but a different entry point; the
    program requires segment fixups; the program code and data are larger
    than 64 KB; the program has more than one declared segment; or the
    file is not a valid .EXE-format file.

    File creation error
    EXE2BIN cannot create the output file because a read-only file with
    the same name already exists, because the specified directory is full,
    or because the specified disk is full, write-protected, or
    unreadable.

    File not found
    The file does not exist or the incorrect path was given.

    Fixups needed - base segment (hex):
    The .EXE-format file contains segment references that would ordinarily
    be relocated by the .EXE file loader. Specify the absolute segment
    address at which the converted module will be executed.

    Incorrect DOS version
    The version of EXE2BIN is not compatible with the version of MS-DOS
    that is running.

    Insufficient disk space
    The destination disk has insufficent space to create the memory-image
    output file.

    Insufficient memory
    Not enough memory is available to run EXE2BIN.

    WARNING - Read error in EXE file.
            Amount read less than size in header.
    The file size given in the .EXE header is inconsistent with the actual
    size of the file.



EXEMOD
Modify .EXE File Header


Purpose

    Allows inspection or modification of the fields in a .EXE file header.
    The EXEMOD utility is supplied with the Microsoft Macro Assembler
    (MASM), C Compiler, FORTRAN Compiler, and Pascal Compiler. This
    documentation describes EXEMOD version 4.02.

Syntax

    EXEMOD exe_file [/H]

    or

    EXEMOD exe_file [/STACK n] [/MAX n] [/MIN n]

    where:

    exe_file        is the name of an executable program in .EXE format
                    (the extension .EXE is assumed).

    /H              displays the values in the file's header.

    /STACK n        modifies the size of the program's stack segment to n
                    (hexadecimal) bytes.

    /MAX n          sets the maximum memory allocation for the program to
                    n (hexadecimal) paragraphs.

    /MIN n          sets the minimum memory allocation for the program to
                    n (hexadecimal) paragraphs.

    Note: Switches can be either uppercase or lowercase and can be
    preceded by a dash (-) instead of a forward slash (/).

Description

    Programs that are executable under MS-DOS can be in one of two file
    formats: .COM, which is an absolute image of the file to be executed
    and limits the program size to 65227 bytes (64 KB minus 256 bytes used
    by the program segment prefix minus 2 bytes initially placed on the
    stack); or .EXE, which allows a program of any size to be loaded and
    has a special header containing information about the program's entry
    point, stack size, and memory requirements, plus a relocation
    table.

    The EXEMOD utility can be used to display or modify those fields of a
    .EXE program header that control the size of the stack segment and the
    amount of memory allocated to the program when MS-DOS loads the
    program into the transient program area for execution.

    The /STACKn switch controls the number of bytes in the program's
    STACK segment by setting the initial SP to the hexadecimal value
    specified. The minimum paragraph allocation value is adjusted if
    necessary. The EXEMOD /STACKn switch should be used only with
    programs compiled by Microsoft C version 3.0 or later, Microsoft
    Pascal version 3.3 or later, or Microsoft FORTRAN version 3.0 or
    later. Use of the /STACKn switch with a program developed with
    another compiler can cause the program to fail or cause EXEMOD to
    return an error message.

    The /MAXn switch specifies the maximum number of additional
    paragraphs of memory to allocate for use by the program. The /MINn
    switch specifies the minimum number of paragraphs of memory, in
    addition to the size of the program itself and its stack and data
    segments, that are required for the program to execute. If enough
    memory exists to satisfy the minimum additional paragraphs requested
    but not enough exists to satisfy the maximum, MS-DOS allocates all
    available memory to the program.

    To display the current memory allocation and stack size values from a
    .EXE file's header, the /H switch can be used or the file's name can
    be entered as the only parameter in the command line.

    When EXEMOD is used on a previously packed .EXE file (a file that was
    processed by EXEPACK or linked with the /EXEPACK switch), the values
    set or displayed in the file's header are the values that will apply
    after the file is expanded at load time. EXEMOD displays a message
    advising the user that the file being modified was previously
    packed.

    The EXEMOD switches /MAXn and /STACKn correspond to the Microsoft
    Object Linker's /CPARMAXALLOC:n and /STACK:n switches, respectively.
    See PROGRAMMING UTILITIES: LINK.

Return Codes

    0  No error; EXEMOD operation was successful.
    1  An error was encountered that terminated execution of the EXEMOD
        program.

Examples

    To display the values in the file header of the DUMP.EXE program,
    type

    C>EXEMOD DUMP.EXE  <Enter>

    or

    C>EXEMOD DUMP.EXE /H  <Enter>

    The EXEMOD utility displays the following:

    Microsoft (R) EXE File Header Utility  Version 4.02
    Copyright (C) Microsoft Corp 1985.  All rights reserved.
    DUMP.EXE                           (hex)           (dec)

    .EXE size (bytes)                    580            1408
    Minimum load size (bytes)            383             899
    Overlay number                         0               0
    Initial CS:IP                  0000:0000
    Initial SS:SP                  0034:0040              64
    Minimum allocation (para)              5               5
    Maximum allocation (para)           FFFF           65535
    Header size (para)                    20              32
    Relocation table offset               20              32
    Relocation entries                     1               1

    To change the size of the STACK segment for the DUMP.EXE program to
    400H (1024) bytes, type

    C>EXEMOD DUMP.EXE /STACK 400  <Enter>

    EXEMOD displays the message

    EXEMOD : warning U4051: minimum allocation less than stack; correcting
            minimum

Messages

    error U1050: usage : exemod file [-/h] [-/stack n] [-/max n] [-/min n]
    An error was detected in the EXEMOD command line.

    error U1051: invalid .EXE file : bad header
    The file is not an executable file or has an invalid file header.

    error U1052: invalid .EXE file : actual length less than reported
    The file size indicated in the .EXE file header does not match the
    size recorded in the disk directory.

    error U1053: cannot change load-high program
    The header of the file cannot be modified because the minimum
    allocation value and the maximum allocation value are both zero.

    error U1054: file not .EXE
    The file specified does not have a .EXE extension.

    error U1055: filename : cannot find file
    The .EXE file specified in the command line cannot be found.

    error U1056: filename : permission denied
    The .EXE file specified in the command line is read-only.

    warning U4050: packed file
    The specified file is a packed file; that is, it was previously
    processed with the EXEPACK utility or was linked with the /EXEPACK
    switch. This is an informational message only; EXEMOD still modifies
    the file. The header values displayed are the values that will apply
    after the packed value is expanded at load time.

    warning U4051: minimum allocation less than stack; correcting
    minimum
    The minimum allocation value is not large enough to accommodate the
    stack; the minimum allocation value is adjusted. This is an
    informational message only.

    warning U4052: minimum allocation greater than maximum; correcting
    maximum
    If the minimum allocation value is greater than the maximum allocation
    value, the maximum value is adjusted. This is an informational message
    only.



EXEPACK
Compress .EXE File


Purpose

    Compresses an executable .EXE program file so that it requires less
    space on the disk. The EXEPACK utility is supplied with the Microsoft
    Macro Assembler (MASM), C Compiler, FORTRAN Compiler, and Pascal
    Compiler. This documentation describes EXEPACK version 4.04.

Syntax

    EXEPACK exe_file packed_file

    where:

    exe_file        is the name of the executable .EXE program file to be
                    compressed.
    packed_file     is the name of the compressed program file.

Description

    The EXEPACK utility compresses an executable .EXE program by packing
    sequences of identical bytes and optimizing the relocation table. The
    EXEPACK utility is not compatible with versions of MS-DOS earlier than
    2.0.

    The exe_file parameter specifies the name of the program file
    produced by the Microsoft Object Linker (LINK) and must contain the
    extension .EXE. The packed_file parameter specifies the name and
    extension of the resulting compressed file. EXEPACK has no default
    extensions.

    The name for packed_file must be different from the exe_file
    filename. Although it is possible to fool EXEPACK into creating a
    packed file with the same name by specifying a different but
    equivalent pathname for the output file, the resulting packed file
    will probably be damaged. If the packed file is to replace the
    original .EXE file, a different name should be specified for the
    packed file; then the input file should be deleted and the packed file
    renamed with the name of the original file.

    When EXEPACK is used to compress an executable overlay file or a
    program that calls overlays, the packed file should be renamed with
    its original name before use to avoid interruption by the overlay-
    manager prompt.

    The effects of EXEPACK depend on program characteristics. Most
    programs can be processed with EXEPACK to occupy significantly less
    disk space. Programs thus compressed also load for execution more
    quickly. Occasionally programs (particularly small ones) actually
    become larger after processing with EXEPACK; in such cases the file
    produced by EXEPACK should be discarded. Microsoft Windows programs or
    programs to be debugged under DEBUG, SYMDEB, or CodeView should not be
    compressed with EXEPACK.

    Using EXEPACK on a previously linked program is equivalent to
    specifying LINK's /EXEPACK switch while linking that program.

    Note: When using the EXEMOD utility with packed .EXE files created
    with EXEPACK or the /EXEPACK linker switch, use the EXEMOD version
    shipped with LINK or with the EXEPACK utility to ensure
    compatibility.

Return Codes

    0  No error; the EXEPACK operation was successful.
    1  An error was encountered that terminated execution of the EXEPACK
        utility.

Example

    To compress the file BUILD.EXE into a file named BUILDX.EXE,
    type

    C>EXEPACK BUILD.EXE BUILDX.EXE  <Enter>

Messages

    fatal error U1100: out of space on output file
    The destination disk has insufficient space for the output file, or
    the root directory is full.

    fatal error U1101: filename: file not found
    The .EXE file specified in the command line cannot be found.

    fatal error U1102: filename: permission denied
    A file with the same name as the specified output file already exists
    and is read-only.

    fatal error U1103: cannot pack file onto itself
    The file cannot be compressed because the name specified for the
    packed file is the same as the name of the source .EXE file.

    fatal error U1104: usage : exepack <infile> <outfile>
    The command line contained a syntax error, or the output filename was
    not specified.

    fatal error U1105: invalid .EXE file; bad header
    The file is not an executable file or has an invalid file
    header.

    fatal error U1106: cannot change load-high program
    The file cannot be compressed because the minimum allocation value and
    the maximum allocation value are both zero. See also PROGRAMMING
    UTILITIES: EXEMOD.

    fatal error U1107: cannot pack already-packed file
    The file specified has already been packed with EXEPACK.

    fatal error U1108: invalid .EXE file; actual length less than
    reported
    The file size indicated in the .EXE file header does not match the
    size recorded in the disk directory.

    fatal error U1109: out of memory
    The EXEPACK utility did not have enough memory to operate.

    fatal error U1110: error reading relocation table
    The file cannot be compressed because the relocation table cannot be
    found or is invalid.

    fatal error U1111: file not suitable for packing
    The file could not be packed because the packed load image of the
    specified file was larger than the unpacked load image.

    fatal error U1112: filename: unknown error
    An unknown system error occurred while the specified file was being
    processed.

    warning U4100: omitting debug data from output file
    EXEPACK has stripped all symbolic debug information from the output
    file.



LIB
Library Manager


Purpose

    Creates or modifies an object module library file. The LIB utility is
    supplied with the Microsoft Macro Assembler (MASM), C Compiler,
    FORTRAN Compiler, and Pascal Compiler. This documentation describes
    LIB version 3.06.

Syntax

    LIB

    or

    LIB library_file [/PAGESIZE:n] [operation][,[list_file]
    [,[new_library_file]]] [;]

    or

    LIB @response_file

    where:

    library_file           is the name of the object module library file
                            to be created or modified (default extension
                            = .LIB).

    /PAGESIZE:n            is the page size of the library file and must
                            immediately follow library_file if used; n
                            is a power of 2 between 16 and 32768,
                            inclusive (default = 16). Can be abbreviated
                            /P:n.

    operation              is one or more library manipulations to be
                            performed. Each operation is specified as a
                            code followed by an object module name (case
                            is not significant):

                            +name  Add object module or another library to
                                library.

                            -name  Delete object module from library.

                            -+name Replace object module in library.

                            *name  Copy object module from library to
                                object file.

                            -*name Copy object module to object file and
                                then delete object module from library.

    list_file              is the name of the file or character device to
                            receive the cross-reference listing for the
                            library file (default = NUL device).

    new_library_file       is the name to be assigned to the modified
                            object module library file. (The default name
                            is the same as library_file; if the default is
                            used, the original library_file is renamed
                            with the extension .BAK.)

    response_file          is the name of a text file containing LIB
                            parameters in the same order in which they are
                            supplied if entered interactively. The name of
                            the response file must be preceded by the @
                            symbol.

Description

    The Microsoft Library Manager (LIB) creates and modifies library
    files, checks existing library files for consistency, and prints
    listings of the contents of library files. The LIB utility does not
    work with versions of MS-DOS earlier than 2.0.

    A library file consists of relocatable object modules that are indexed
    by their names and public symbols. The Microsoft Object Linker (LINK)
    uses these files during the creation of an executable (.EXE) program
    to resolve external references to routines and variables contained in
    other object modules.

    The library_file parameter specifies the name of the object module
    library file to be created or modified. This parameter is required; if
    it is not included, LIB prompts for it. The default extension for a
    library file is .LIB.

    The /PAGESIZE:n switch (abbreviated /P:n) sets the page size (in
    bytes) for a new library file or changes the page size of an existing
    library file. The value of n must be a power of 2 between 16 and
    32768, inclusive. The default is 16 for a new library file; for an
    existing library file, the default is the current page size. Because
    the index to a library file is contained in a fixed number of pages,
    setting a larger page size increases the number of index entries (and
    thus the number of object modules) that a library file can contain but
    results in more wasted disk space (an average of half a library page
    per object module).

    The operation parameter specifies one or more relocatable object
    modules to add to, replace in, copy from, move from, or delete from
    library_file. Each operation is represented by a code specifying the
    type of operation, followed by the object module name. When an object
    module is copied or moved from the library file, the drive and
    pathname of the object module are set to the default drive, current
    directory, and specified module name, and the extension of the object
    module defaults to .OBJ. When an object module is added or replaced,
    LIB assumes a default extension of .OBJ.

    The operation +name adds the object module in the file name.OBJ to
    the library file. This operation can also be used to add the contents
    of another entire object module library file to the library file being
    updated, in which case the extension .LIB must be included in name.
    The operation -name deletes the object module name from the library.
    The operation -+name deletes the object module name from the library
    file and replaces it with the contents of the file name.OBJ. The
    operation *name copies the object module name from the library file
    into the file name.OBJ, which LIB creates in the current directory.
    The operation -*name also copies the object module name from the
    library file into a .OBJ file but then deletes the module from the
    library file. (Although name must have exactly the same spelling as
    the name in the library's reference listing, case is not
    significant.)

    Note: LIB does not actually delete object modules from the specified
    library file. Instead, it marks the selected object modules for
    deletion, creates a new library file, and copies only the modules not
    marked for deletion into the new file. Thus, if LIB is terminated for
    any reason, the original file is not lost. Enough space must be
    available on the disk for both the original library file and the
    copy.

    The list_file parameter specifies the file or character device to
    receive a reference listing for the library file. Any valid drive,
    pathname, and extension or any valid character device, such as PRN, is
    permitted (default = NUL). If this parameter is omitted, no listing is
    generated.

    The reference listing consists of two tables. The first table contains
    all the public symbols in the object modules in the library, listed
    alphabetically, with each symbol followed by the name of the object
    module in which it is referenced. The second table contains the names
    of all the object modules, listed alphabetically, with each name
    followed by the offset from the start of the library file, the code
    and data size, and an alphabetic listing of the public symbols in that
    object module.

    The new_library_file parameter specifies the name for the modified
    library file that is created. If this parameter is omitted, LIB gives
    the modified library file the same name as the original library file,
    and the original library file is renamed with a .BAK extension. When a
    new library file is being created, this parameter is not
    necessary.

    When the command line is used to supply LIB with filenames and
    switches, typing a semicolon character (;) after any parameter (except
    library_file) causes LIB to use the default values for the remaining
    parameters. If a semicolon is entered after library_file, LIB simply
    checks the file for consistency and usability. (This is seldom
    necessary, because LIB checks each object module for consistency
    before adding it to the library.)

    If the LIB command is entered without any parameters, LIB prompts the
    user for each parameter needed. If there are too many operations to
    fit on one line, the line can be ended with the ampersand character
    (&), causing LIB to repeat the Operations: prompt. If any response
    except library_file is terminated with a semicolon character, LIB
    uses the default values for the remaining filenames. When the library_
    file parameter is followed by a semicolon or a semicolon is entered at
    the Operations: prompt, LIB takes no action except to verify that the
    contents of the specified file are consistent and usable.

    The response_file parameter allows the automation of complex LIB
    sessions involving many files. A response file contains ASCII text
    that corresponds line for line to the responses that are entered in a
    normal interactive LIB session, in the form

    library_file [/P:n]
    [Y]
    [operations]
    [list_file]
    [new_library_file] [;]

    The response file name must be preceded in the command line by the at
    symbol (@) and can also be preceded by a path and/or drive letter. If
    library_file is a new file, the letter Y  must appear by itself on
    the second line of the response file to approve the creation of a
    library file. The last line of the response file must end with a
    semicolon or a carriage return. (LIB ignores any lines following a
    semicolon.) If all the parameters required by LIB are not present in
    the response file or the response file does not end with a semicolon,
    LIB prompts the user for the missing information.

Return Codes

    0  No error; LIB operation was successful.
    1  An error that terminated execution of the LIB utility was
        encountered.

Examples

    To create a library file named MYLIB.LIB and insert the object files
    VIDEO.OBJ, COMM.OBJ, and DOSINT.OBJ, type

    C>LIB MYLIB +VIDEO +COMM +DOSINT;  <Enter>

    To print a listing of the object modules in the library file
    MYLIB.LIB, type

    C>LIB MYLIB,PRN  <Enter>

    If the LIB command is entered without parameters, the user is prompted
    for the necessary information. For example, if the user wanted to add
    the module VIDEO.OBJ to the library file SLIBC.LIB, produce a
    reference listing in the file SLIBC.LST, and produce a new output
    library file named SLIBC2.LIB, the following dialogue would take
    place:

    C>LIB  <Enter>

    Microsoft (R) Library Manager  Version 3.06
    Copyright (C) Microsoft Corp 1983, 1984, 1985, 1986. All rights reserved

    Library name: SLIBC  <Enter>
    Operations: +VIDEO  <Enter>
    List file: SLIBC.LST  <Enter>
    Output library: SLIBC2  <Enter>

Messages

    filename: cannot access file.
    LIB is unable to access an object module specified in a response file,
    in the command line, or at the Operations: prompt.

    filename: cannot create extract file
    The object module cannot be copied or moved from the library file into
    a separate disk file called filename because the root directory or
    disk is full or because filename already exists and is read-only.

    filename: cannot create listing
    The list file specified in the response file, in the command line, or
    at the List file: prompt cannot be created because the root directory
    or disk is full or because filename already exists and is read-only.

    filename: invalid format (xxxx); file ignored.
    The hexadecimal signature byte or word xxxx of the specified file was
    not one of the following recognized types: Microsoft library, Intel
    library, Microsoft object, or XENIX archive.

    filename: invalid library header.
    The input library file either is not a library file or is damaged.

    filename: invalid library header; file ignored.
    The input library file is in the wrong format.

    modulename: invalid object module near location
    The specified object module has an invalid format near the hexadecimal
    offset indicated.

    modulename: module not in library; ignored
    The object module specified in the response file, in the command line,
    or at the Operations: prompt is not in the specified input library
    file.

    modulename: module redefinition ignored
    An object module was specified to be added to a library file but an
    object module with the same name was already in the library file, or
    the same object module was specified twice in an add operation in the
    command line.

    number: page size too small; ignored
    The size specified with a /P:n switch must be a power of 2 between 16
    and 32768 bytes, inclusive.

    symbol (modulename): symbol redefinition ignored
    The specified symbol was defined in more than one module. Only the
    first definition of a symbol is accepted. All redefinitions are
    ignored.

    cannot create new library
    The root directory is full, or a library file with the same name
    already exists and is read-only.

    cannot open response file
    The specified response file cannot be found or does not exist.

    cannot rename old library
    The old library file cannot be renamed with a .BAK extension because
    such a file already exists and is read-only.

    cannot reopen library
    The old library file could not be reopened after it was renamed with
    the .BAK extension. This error usually indicates damage to the
    operating system or to the disk directory structure.

    comma or new line missing
    A comma or carriage return was expected in the command line but was
    not found.

    Do not change diskette in drive X:
    LIB may have placed important temporary files on the specified disk.
    Do not remove the disk until the LIB operation is complete or these
    files may be lost.

    error writing to cross-reference file
    The disk or root directory is full.

    error writing to new library
    The new library file cannot be created because the disk is full.

    free: not allocated
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    insufficient memory
    Not enough memory is available in the transient program area for LIB
    to successfully perform the requested operations.

    internal failure
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    Library does not exist. Create?
    The specified library_file does not exist on disk. Respond with Y to
    create the library file; respond with N to terminate the LIB
    utility.

    mark: not allocated
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    option unknown
    The command line included a switch other than /P:n.

    output-library specification ignored
    An output library file was specified in addition to a new library
    file. This is only a warning. The output library file specification
    will be disregarded.

    page size too small
    The page size of an input library file was less than 16 bytes,
    indicating a damaged or otherwise invalid .LIB file. See LIB message
    number: page size too small; ignored.

    syntax error
    The command line included an invalid parameter or switch.

    syntax error: illegal file specification
    A command operator (such as *, -, or +) was given without an object
    module name.

    syntax error: illegal input
    The command line included an invalid parameter or switch.

    syntax error: option name missing
    The command line included a forward slash (/) that was not followed by
    P:n.

    syntax error: option value missing
    The /P switch was not followed by the page size value in bytes.

    terminator missing
    Either a control character (such as Control-Z) was specified at the
    Output library: prompt or the response file line that corresponds to
    LIB's Output library: prompt was not terminated by a carriage return
    or semicolon.

    too many symbols
    The maximum number of public symbols allowed in a library file has
    been exceeded. The limit for all object modules (combined) is
    4609.

    unexpected end-of-file on command input
    The response file did not include all the necessary LIB parameters.

    write to extract file failed
    The destination disk has insufficient space for the complete object
    module, or the root directory is full.

    write to library file failed
    The destination disk has insufficient space to create the new library
    file, or the root directory is full.



LINK
Create .EXE File


Purpose

    Combines relocatable object modules into an executable (.EXE) file.
    The Microsoft Object Linker (LINK) is supplied with the Microsoft
    Macro Assembler (MASM), C Compiler, Pascal Compiler, and FORTRAN
    Compiler. This documentation describes LINK version 3.50.

Syntax

    LINK

    or

    LINK obj_file[+obj_file...][,[exe_file]][,[map_file]][,[library
    [+library...]]] [options] [;]

    or

    LINK @response_file

    where:

    obj_file        is the name of a file containing a relocatable object
                    module produced by MASM or by a high-level-language
                    compiler (default extension = .OBJ).

    exe_file        is the name of the executable file to be produced by
                    LINK (default extension = .EXE).

    map_file        is the name of the file or character device to
                    receive a listing of the names, load addresses, and
                    lengths of the segments in exe_file (default = NUL
                    device; default extension = .MAP).

    library         is the name of an object module library to be
                    searched to resolve external references in the
                    object file(s) (default extension = .LIB).

    response_file   is the name of a text file containing LINK parameters
                    in the order in which they are supplied during an
                    interactive LINK session.

    options         specifies one or more of the following switches.
                    Switches can be either uppercase or lowercase.

                    /CP:n       (/CPARMAXALLOC:n) Sets the maximum number
                                of extra memory paragraphs required by
                                exe_file (default = 65535).

                    /DS         (/DSALLOCATE) Loads the data in DGROUP at
                                the high end of the data segment.

                    /DO         (/DOSSEG) Arranges segments according to
                                the Microsoft language segment-ordering
                                convention.

                    /E          (/EXEPACK) Compresses repetitive sequences
                                of bytes and optimizes exe_file's
                                relocation table.

                    /HI         (/HIGH) Causes exe_file to be loaded as
                                high as possible in memory when exe_file
                                is executed.

                    /HE         (/HELP) Lists LINK options on the screen.
                                No other switches or filenames should be
                                used with this switch.

                    /LI         (/LINENUMBERS) Copies line-number
                                information (if available) from obj_file
                                to map_file. If a map file was not
                                specified, this switch creates one.

                    /M          (/MAP) Copies a list of all public symbols
                                declared in obj_file to map_file. If a
                                map file was not specified, this switch
                                creates one.

                    /NOD        (/NODEFAULTLIBRARYSEARCH) Causes LINK to
                                ignore any library names inserted in the
                                object file by the language compiler.

                    /NOG        (/NOGROUPASSOCIATION) Causes LINK to
                                ignore GROUP associations when assigning
                                addresses.

                    /NOI        (/NOIGNORECASE) Causes LINK to be case
                                sensitive when resolving external names.

                    /O:n        (/OVERLAYINTERRUPT:n) Overrides the
                                interrupt number used by the overlay
                                manager (0-255, default = 63, or 3FH).
                                This switch should be used only when
                                linking with a run-time module from a
                                language compiler that supports overlays.

                    /P          (/PAUSE) Causes LINK to pause and prompt
                                the user to change disks before writing
                                the exe_file.

                    /SE:n       (/SEGMENTS:n) Sets the maximum number of
                                segments that can be processed (1-1024,
                                default = 128).

                    /ST:n       (/STACK:n) Sets the size of the exe_file's
                                stack segment to n bytes (1-65535).

Description

    LINK combines relocatable object modules into an executable file in
    the .EXE format. LINK can be used with object files produced by any
    high-level-language compiler or assembler that supports the Microsoft
    object module format. See PROGRAMMING IN THE MS-DOS ENVIRONMENT:
    PROGRAMMING TOOLS: Object Modules; The Microsoft Object Linker.

    The obj_file parameter, which is required, specifies one or more
    files containing relocatable object modules. If multiple object files
    are linked, their names should be separated by a plus operator (+) or
    a space. If an extension is not specified for an object file, LINK
    supplies the extension .OBJ. Some high-level-language compilers
    support partitioning of the executable program into a root segment and
    one or more overlay segments and include a special overlay manager in
    their libraries; when these compilers are used, the object modules
    that compose each overlay segment should be surrounded with
    parentheses in the LINK command line.

    The exe_file parameter specifies the name of the executable file that
    is created by LINK. The default is the same filename as the first
    object file, but with the extension .EXE.

    The map_file parameter designates the file or character device to
    receive LINK's listing of the name, load address, and length of each
    of exe_file's segments. The map file also includes the names and load
    addresses of any groups in the program, the program entry point, and,
    if the /M switch is used, all public symbols and their addresses. If
    the /LI switch is used and if line numbers were inserted into obj_file
    by the compiler, the starting address of each obj_file program line
    is also copied to map_file. The default extension for a map file is
    .MAP. If the /M or /LI switch is used, a map file is created using the
    name of the specified .EXE file even if map_file is not specified. If
    neither the /M nor the /LI switch is used and map_file is not
    specified, no listing is created.

    The library parameter specifies the object module library or
    libraries that will be searched to resolve external references after
    all the object files are processed. The default extension for library
    files is .LIB. Multiple library names should be separated by plus
    operators (+) or spaces. A maximum of 16 search paths can be specified
    in the LINK command line. If a library name is preceded by a drive
    and/or path, LINK searches only the specified location. If no drive or
    path precedes a library name, LINK searches for library files in the
    following order:

    1.  Current drive and directory

    2.  Any other library search paths specified in the command line, in
        the order they were entered

    3.  Directories specified in the LIB= environment variable, if one
        exists

    In the following example, LINK searches only the \ALTLIB directory on
    drive A to find the library MATH.LIB. To find the library COMMON.LIB,
    LINK searches the current directory on the current drive, then the
    current directory on drive B, then directory \LIB on drive D, and
    finally, any directories named in the LIB environment variable.

    C>LINK TEST,,TEST,A:\ALTLIB\MATH.LIB+COMMON+B:+D:\LIB\  <Enter>

    If default libraries are specified within the object files through
    special records inserted by certain high-level-language compilers,
    those libraries will be searched after the libraries named in the
    command line or response file.

    If the LINK command is entered without parameters, LINK prompts the
    user for each filename needed. The default response for each prompt
    (except the obj_file prompt) is displayed in square brackets and can
    be selected by pressing the Enter key. If there are too many obj_file
    or library names to fit on one line, the line can be terminated by
    entering a plus operator (+) and pressing the Enter key; LINK then
    repeats the prompt. If the user ends any response with a semicolon
    character (;), LINK uses the default values for the remaining fields.

    When the command line contains filenames and switches, commas must be
    used to separate the obj_file, exe_file, map_file, and library
    parameters. If a filename is not supplied, a comma must be used to
    mark its place. If the user places a semicolon after any parameter in
    the command line, LINK terminates the command line at the semicolon
    and uses the default values for any remaining parameters.

    The user can automate complex LINK sessions involving multiple files
    by creating a response file. The response_file parameter must be the
    name of an ASCII file that corresponds line for line to the responses
    that are entered in a normal interactive LINK session. The last line
    of the response file must end with a semicolon character (;) or a
    carriage return. If all parameters required by LINK are not present in
    the response file and the response file does not end with a semicolon
    or carriage return, LINK prompts the user for the missing information.

    LINK supports many options that can be invoked by including a switch
    in the command line, as part of the response to a LINK prompt, or in a
    response file. To simplify this description, these switches are
    grouped according to their functions.

    The /E, /HE, /NOD, /NOI, /P, and /SE:n switches affect LINK's general
    operation. The /E switch compresses repetitive sequences of bytes in
    exe_file and optimizes certain parts of the relocation table in
    exe_file's header. The /E switch functions exactly like the
    EXEPACK utility.

    Note: The /E switch does not always save a significant amount of disk
    space and may even increase file size when used with small programs
    that have few load-time relocations or repeated characters. The
    Microsoft Symbolic Debugger (SYMDEB) utility cannot be used with
    packed files.

    The /HE switch displays the available options on the screen. No other
    switches or filenames should be specified if the /HE switch is used.
    The /NOD switch causes LINK to ignore any default libraries that have
    been added to the object modules by the high-level-language compiler
    that produced the modules, thus restricting searches to those
    libraries specified in the command line or response file. The /NOI
    switch causes LINK to be case sensitive when resolving external
    references to symbols between object modules. The /NOI switch is
    typically used with object files created by high-level-language
    compilers that differentiate between uppercase and lowercase
    letters.

    The /P switch causes LINK to pause and prompt the user before writing
    exe_file to disk, thus allowing the user to exchange the disk used
    during the linking operation for another that has more space
    available. The /SE:n switch controls the number of program segments
    processed by LINK. The n must be a decimal, octal, or hexadecimal
    number from 1 through 1024, inclusive (default = 128). Octal numbers
    must have a leading zero; hexadecimal numbers must begin with 0x.

    The /M and /LI switches affect the production and contents of the
    optional map file. The /M switch creates a map file with the same name
    as exe_file or, if exe_file is not specified, with the same name as
    the first object file and the extension .MAP. The resulting map file
    includes a list of all public symbols and their addresses. The /LI
    switch also creates a map file and includes line-number information if
    available in the object file. (MASM and some high-level-language
    compilers do not insert line-number information into object files.)

    The /D, /DO, /NOG, and /O:n switches affect the structure of the code
    in exe_file. Use of the /D switch places the data in DGROUP at the top
    (highest address) of the memory segment pointed to by the DS register,
    rather than at the bottom (the default). The /DO switch arranges the
    program segments according to a convention expected by all Microsoft
    language compilers: All segments with the class name CODE are placed
    first in the executable file; any other segments that do not belong to
    DGROUP are placed immediately after the CODE segments; all segments
    belonging to DGROUP are placed at the end of the file. The /NOG switch
    causes LINK to ignore group associations specified in the object
    modules when assigning addresses to data and code items; that is,
    segments that would ordinarily have been collected into the same
    physical memory segment because of their association within a GROUP
    are decoupled. The /NOG switch provides compatibility with LINK
    versions 2.02 and earlier and with early versions of Microsoft
    language compilers. The /O:n switch controls the interrupt number
    used by the resident overlay manager if the linked program includes
    overlays. The number n can be any decimal, octal, or hexadecimal
    number in the range 0 through 255 (default = 63, or 3FH). Octal
    numbers must have a leading zero; hexadecimal numbers must begin with
    0x.

    Note: MASM and many high-level-language compilers do not include
    overlay managers in their libraries. Users should check their compiler
    documentation to determine if the /O:n switch can be used.

    Warning: Interrupt numbers that conflict with the software interrupts
    used to obtain MS-DOS or ROM BIOS services or with hardware interrupts
    assigned to peripheral device controllers should not be used in the
    /O:n switch.

    The /C:n, /H, and /ST:n switches control the information in exe_
    file's header that affects the behavior of the MS-DOS system loader
    when the file is read from the disk into RAM for execution. The /C:n
    switch sets the maximum number of 16-byte paragraphs of memory to be
    made available to the program when it is loaded into memory, in
    addition to the memory required to hold the program's code, data, and
    stacks; the default is 65535, which causes the program to be allocated
    all available memory. The /H switch causes the program to be loaded as
    high as possible in the transient program area (free memory), rather
    than as low as possible (the default). The /ST:n switch sets the
    stack size (in bytes) to be allocated for the program when it is
    loaded and overrides any stack segment size declarations in the
    original source code. The number n can be any decimal, octal, or
    hexadecimal number from 1 through 65535; however n must be large
    enough to accommodate any initialized data in the stack segment. Octal
    numbers must have a leading zero; hexadecimal numbers must begin with
    0x. If the /ST:n switch is not used, LINK calculates a program's
    stack size, basing the size on the size of any stack segments given in
    the object files. The /C:n and /ST:n values in the exe_file header
    can be altered after linking by using the EXEMOD utility.

    If LINK is unable to hold in RAM all the data it is processing, it
    creates a temporary disk file named VM.TMP (Virtual Memory) in the
    current directory of the default disk drive. If a floppy disk is in
    the default drive, LINK issues a warning message to prevent the user
    from changing disks until the LINK session is completed. After LINK
    finishes processing, it deletes the temporary file.

    Warning: Any file named VM.TMP that is already on the disk will be
    destroyed if LINK creates the temporary disk file.

Return Codes

    0    No errors or unresolved references were encountered during
            creation of exe_file.
    1    A miscellaneous LINK error occurred that was not covered by
            the other return codes.
    16    A data record was too large to process.
    32    No object files were specified in the command line or response
            file.
    33    The map file could not be created.
    66    A COMMON area was declared that is larger than 65535 (one
            segment).
    96    Too many libraries were specified.
    144    An invalid object module (obj_file) was detected.
    145    Too many TYPDEFs were found in the specified object modules.
    146    Too many group, segment, or class names were found in one
            object module.
    147    Too many segments were found in all the object modules
            combined, or too many segments were found in one
            object module.
    148    Too many overlays were specified.
    149    The size of a segment exceeded 65535.
    150    Too many groups or GRPDEFs were found in one object module.
    151    Too many external symbols were found in one object module.
    177    The size of a group exceeded 65535.

Examples

    The simplest use of LINK is to process a single object file to produce
    an executable file, using all the default values. For example, to
    process the file SHELL.OBJ, create an executable file named SHELL.EXE,
    and search only the default libraries, type

    C>LINK SHELL;  <Enter>

    The semicolon after the filename causes LINK to use the default values
    for all other parameters.

    To link three object files named SHELL.OBJ, VIDEO.OBJ, and DOSINT.OBJ
    into an executable file named SHELL.EXE and search the library
    DEVLIB.LIB on drive B before searching any default libraries,
    type

    C>LINK SHELL+VIDEO+DOSINT,,,B:DEVLIB  <Enter>

    If the LINK command is entered without parameters, LINK prompts the
    user for the necessary information. For example, the following
    interactive session links the file MENUMGR.OBJ into the executable
    file MENUMGR.EXE, creates a map file named MENUMGR.MAP, and searches
    the math floating-point emulator library EM.LIB before any default
    libraries:

    C>LINK  <Enter>

    Microsoft (R) 8086 Object Linker  Version 3.05
    Copyright (C) Microsoft Corp 1983,1984,1985.  All rights reserved.

    Object Modules [.OBJ]: MENUMGR  <Enter>
    Run File [MENUMGR.EXE]:  <Enter>
    List File [NUL.MAP]:  MENUMGR  <Enter>
    Libraries [.LIB]:  EM  <Enter>

Messages

    filename is not a valid library
    The file specified as an object module library either is corrupt or is
    not a library in the format created by the Microsoft LIB
    utility.

    About to generate .EXE file
    Change diskette in drive X and press <ENTER>
    The /P switch was used in the command line. LINK is prompting the user
    to change disks before LINK creates the file containing the executable
    program.

    Ambiguous switch error: "option"
    A valid switch was not entered after a forward slash (/) in the
    command line.

    Array element size mismatch
    A FAR communal array was declared with two or more different array-
    element sizes (for example, once as an array of characters and once as
    an array of real numbers). This error occurs only with programs
    produced by the Microsoft C Compiler or other compilers that support
    FAR communal arrays; it does not occur with object files produced by
    MASM.

    Attempt to access data outside segment bounds
    A data record in an object module specified data extending beyond the
    end of a segment. This is a translator error. Note which compiler or
    assembler produced the invalid object module and notify Microsoft
    Corporation.

    Attempt to put segment name in more than one group in file filename
    A segment was declared to be a member of two groups. Correct the
    source code and recreate the object modules.

    Bad value for cparMaxAlloc
    The value specified using the /C:n option is not in the range 1
    through 65535.

    Cannot create temporary file
    The destination disk has insufficient space for the temporary file, or
    the root directory is full.

    Cannot find file filename
    Change diskette and press <ENTER>
    The specified object file cannot be found in the current drive.

    Cannot find library: filename
    Enter new file spec:
    The specified library file cannot be found or does not exist. Enter
    the correct drive letter, check the spelling of the filename and path,
    or make sure that the LIB environment variable has been set up
    properly.

    Cannot nest response files
    A response file was named within a response file. Revise the response
    file to eliminate the nested file.

    Cannot open list file
    The destination disk has insufficient space for the listing, or the
    root directory is full.

    Cannot open response file: filename
    LINK cannot find the specified response file.

    Cannot open run file
    The destination disk has insufficient space for the .EXE file, or the
    root directory is full.

    Cannot open temporary file
    The destination disk has insufficient space for the temporary file, or
    the root directory is full.

    Cannot reopen list file
    The original disk was not replaced when requested. Restart LINK.

    Common area longer than 65536 bytes
    The program has more than 64 KB of communal variables. This error
    occurs only with programs produced by the Microsoft C Compiler or
    other compilers that support communal variables.

    Data record too large
    An LEDATA record (in an object module) contains more than 1024 bytes
    of data. This is a symptom of an error in the compiler used to
    generate the object module. Document the circumstances and contact
    Microsoft Corporation.

    Dup record too large
    An LIDATA record (in an object module) contains more than 512 bytes of
    data. This error may be caused by a complex structure definition or by
    a series of deeply nested DUP operators.

    File not suitable for /EXEPACK, relink without
    The file linked with the /E switch would have been smaller if it had
    not been compressed. Relink without the /E switch.

    Fixup overflow near number in segment name in filename offset number
    A group is larger than 64 KB, the original source file contains an
    intersegment short jump or intersegment short call, the name of a data
    item conflicts with that of a library subroutine, or an EXTRN
    declaration is placed inside the wrong segment.

    Incorrect DOS version, use DOS 2.0 or later
    LINK uses the extended file management calls to provide path support
    and, thus, does not work with versions of MS-DOS earlier than 2.0.

    Insufficient stack space
    Not enough memory is available to run LINK.

    Interrupt number exceeds 255
    The number specified in the /O:n switch is not in the range 0 through
    255.

    Invalid numeric switch specification
    An incorrect value was entered with one of the LINK options.

    Invalid object module
    One of the object modules is invalid. Recompile the source file. If
    the error persists after recompiling, document the circumstances and
    contact Microsoft Corporation.

    NEAR/HUGE conflict
    Conflicting NEAR and HUGE definitions were given for a communal
    variable. This error occurs only with programs produced by the
    Microsoft C Compiler or other compilers that support communal
    variables.

    Nested left parentheses
    An opening (left) parenthesis is needed on the left side of an overlay
    module.

    Nested right parentheses
    A closing (right) parenthesis is needed on the right side of an
    overlay module.

    No object modules specified
    No object file names were specified in the command line or response
    file.

    Object not found
    One of the object files specified in the command line was not
    found.

    Out of space on list file
    The destination disk has insufficient space for the listing.

    Out of space on run file
    The destination disk has insufficient space for the .EXE file.

    Out of space on scratch file
    The disk in the default drive has insufficient space for temporary
    files.

    Overlay manager symbol already defined: name
    A symbol name was defined that conflicts with one of the special
    overlay manager names. Use another symbol name.

    Please replace original diskette
    in drive X and press <ENTER>
    The /P switch was specified in the command line and the disk to
    receive the .EXE file produced by LINK has already been inserted. This
    message indicates that the .EXE file was successfully created and that
    the original disk should again be placed in the drive.

    Relocation table overflow
    More than 32768 long calls, long jumps, or other long pointers were
    found in the program. The program may need to be restructured to
    reduce the number of FAR references. (Pascal and FORTRAN users should
    try turning off the debugging option before restructuring the
    program.)

    Response line too long
    A line in a response file had more than 127 characters.

    Segment limit set too high
    The number specified in the /SE:n switch was not in the range 1
    through 1024.

    Segment limit too high
    Not enough memory is available for LINK to allocate tables to describe
    the number of segments requested (default = 128 or the number
    specified in the /SE:n switch). Use the /SE:n switch to specify a
    smaller number of segments, or alter the system configuration to
    increase the amount of free memory.

    Segment size exceeds 64K
    The program is a small-model program with more than 64 KB of code or
    data, a compact-model program with more than 64 KB of code, or a
    medium-model program with more than 64 KB of data. Selection of a
    different model or alteration of the program code may be required to
    successfully complete the LINK process.

    Stack size exceeds 65536 bytes
    The size specified for the stack in the /ST:n switch was too large,
    or the combined length of multiple declared stack segments exceeded
    64 KB.

    Symbol already defined: "symbol"
    One of the special overlay symbols required for overlay support was
    previously defined.

    Symbol defined more than once: "symbol" in file
    A symbol has been defined more than once in the object module. Remove
    the extra symbol definition.

    Symbol table overflow
    The program has more than 256 KB of symbolic information (publics,
    externals, segments, groups, classes, files, and so on). Eliminate as
    many public symbols as possible, combine modules and/or segments, and
    recreate the object files.

    Terminated by user
    Ctrl-C or Ctrl-Break was pressed, causing the LINK session to be
    terminated prematurely.

    Too many external symbols in one module
    An object module contains more than the limit of 1023 external
    symbols.

    Too many group-, segment-, and class-names in one module
    One of the object modules for the program contains too many group,
    segment, and class names. The source file for the object module may
    need to be divided or restructured.

    Too many groups
    The program defines more than nine groups (including DGROUP). Groups
    must be combined or eliminated.

    Too many GRPDEFs in one module
    LINK encountered more than nine group definitions (GRPDEFs) in a
    single object module. Reduce the number of GRPDEFs or split the object
    module.

    Too many libraries
    More than 16 libraries were specified. Combine libraries or use object
    modules that require fewer libraries.

    Too many overlays
    The program defines more than 63 overlays. Reduce the number of
    overlays.

    Too many segments
    The program has more than the maximum number of segments as specified
    by the default of 128 or with the /SE:n switch. Use the /SE:n switch
    to specify a greater number of segments.

    Too many segments in one module
    An object module has more than 255 segments. Split the module or
    combine segments.

    Too many TYPDEFs
    An object module contains too many TYPDEF records (these records
    describe communal variables). This error occurs only with programs
    produced with the Microsoft C Compiler or other compilers that support
    communal variables.

    Unexpected end-of-file on library
    This message may indicate that the disk containing the library in use
    was removed prematurely.

    Unexpected end-of-file on scratch file
    The disk containing VM.TMP was removed.

    Unmatched left parenthesis
    A syntax error was detected in the specification of an overlay
    structure. Refer to the language compiler manual for instructions on
    specifying overlays to LINK.

    Unmatched right parenthesis
    A syntax error was detected in the specification of an overlay
    structure. Refer to the language compiler manual for instructions on
    specifying overlays to LINK.

    Unrecognized switch error: "option"
    An unrecognized character was entered after a forward slash (/) in the
    command line.

    Unresolved COMDEF; Microsoft internal error
    This is a serious problem. Note the circumstances of the failure and
    contact Microsoft Corporation.

    Unresolved externals: list
    A symbol was declared external (EXTRN) in one object module but was
    not declared PUBLIC in the object module in which it was defined, or a
    necessary library specification was omitted from the command line or
    response file.

    VM.TMP is an illegal file name
    and has been ignored
    VM.TMP was specified as an object file name. If an object file named
    VM.TMP exists, rename it.

    Warning: load-high disables exepack
    The /H and /E switches cannot be used at the same time.

    Warning: no stack segment
    The program contains no segment with the STACK combine type. This
    message can be ignored if there is a specific reason for not defining
    a stack (for example, if the .EXE file will subsequently be converted
    to a .COM file) or for defining one without the STACK combine
    type.

    WARNING: Segment longer than reliable size
    Although code segments can be as long as 65536 bytes, code segments
    longer than 65500 bytes can be unreliable on the Intel 80286
    microprocessor. Reduce all code segments to 65500 bytes or less.

    Warning: too many public symbols
    The /M switch was used to request a sorted listing of public symbols
    in the map file, but there are too many symbols to sort. LINK will
    produce an unsorted listing instead.



MAKE
Maintain Programs


Purpose

    Interprets a text file of commands to compare dates of files and carry
    out other operations on the basis of the comparison. MAKE is
    customarily used to update the executable version of a program after a
    change to one or more of its source files. The MAKE utility is
    supplied with the Microsoft Macro Assembler (MASM), C Compiler, and
    FORTRAN Compiler. This documentation describes MAKE version 4.05.

Syntax

    MAKE [/D] [/I] [/N] [/S] [name=value ...] filename

    where:

    filename         is an ASCII text file that contains MAKE dependency
                    statements, commands, macro definitions, and
                    inference rules.

    name=value       declares a MAKE macro, associating a specific value
                    with the dummy parameter name.

    /D               displays the last modification date of each file as
                    it is scanned.

    /I               causes MAKE to ignore exit codes returned by programs
                    called by filename.

    /N               displays but does not execute the commands in
                    filename.

    /S               selects "silent" mode (commands are not displayed as
                    they are executed).

    Note: Switches can be either uppercase or lowercase and can be
    preceded by a dash (-) instead of a forward slash (/). Versions of
    MAKE earlier than 4.0 have no switches.

Description

    The MAKE utility allows maintenance of complex programs to be
    automated. Its basic operation is to compare the dates of files and to
    carry out, or not carry out, an associated list of commands on the
    basis of the comparison.

    The filename parameter specifies an ASCII text file often referred to
    as a make file. By convention, filename is the same as the name of
    the executable program being maintained, but without an extension. A
    make file can contain the following types of entries:

    ■  Dependency statements
    ■  Commands
    ■  Macro definitions
    ■  Inference rules
    ■  Comments

    The basic form of a make file is a dependency statement followed by
    one or more valid MS-DOS command lines:

    targetfile: dependentfile1 [dependentfile2...]
            command1
            [command2]
            ...

    where targetfile designates the file that may need updating,
    dependentfile is a source file or files on which targetfile depends,
    and command1, command2, and so forth are any valid MS-DOS internal
    commands or external programs. These commands or programs are executed
    only if the date and time stamps of any dependent file are more recent
    than those of the target file or if the target file does not exist.
    Only one target file can be specified. Any number of dependent files
    can be included; each dependent filename must be separated from the
    next by at least one space. If too many dependent files are included
    to fit on a single line, the line can be terminated with a backslash
    character (\) and the list continued on the next line.

    Any number of MS-DOS command lines can follow a dependency statement.
    The last command line should be followed by a blank line to set it off
    from the next MAKE entry. It is recommended that each command line
    include a leading space or tab character for compatibility with future
    versions of MAKE and existing versions of XENIX MAKE.

    A macro definition takes the form

    name=value

    where both name and value are any string. Whenever name is referenced
    in the make file in the form $(name), name is replaced by the string
    value before the statement that contains it is evaluated or executed.
    Macro definitions can be nested, although very complex macro
    definitions can result in the premature termination of the MAKE
    process because of lack of memory. If name is not defined in the file
    but is defined in the system environment block by a previous SET
    command, $(name) is replaced by the string following the equal sign
    (=) in the environment block. If the command line contains a parameter
    of the form name=value, the command line overrides any definition of
    name in the make file or in the environment block. Thus, the
    precedence for macro definitions with the same name is

    1.  Command line
    2.  Make file
    3.  Environment block

    MAKE contains several special macros that make it more convenient to
    form commands:

╓┌────────────────┌──────────────────────────────────────────────────────────╖
    Macro       Action
    ─────────────────────────────────────────────────────────────────────
    $*          Substitutes as the base portion of targetfile (the
                filename without the extension).

    $@          Substitutes as the complete targetfile name.

    $**         Substitutes as the complete dependentfile list.

    An inference rule specifies a series of commands to be carried out for
    a matching dependency statement that is not followed by its own list
    of commands. Inference rules allow a set of commands to be applied to
    more than one targetfile: dependentfile description, eliminating
    repetition of the same set of commands for several descriptions. An
    inference rule takes the form

    .dependentextension.targetextension:
        command1
        [command2]
        ...

    Whenever MAKE finds a dependency statement not followed by any
    commands, the utility first searches the make file for an inference
    rule. If MAKE doesn't find an inference rule in the make file, the
    utility then searches the current drive and directory (or any
    directories specified with the MS-DOS PATH command) for the tools
    initialization file (TOOLS.INI) and searches the [make] section of
    TOOLS.INI for an inference rule that matches the extensions of the
    target file and dependent files in the dependency statement.

    A make file can contain any number of comment lines. If a comment is
    placed where MAKE expects to find a command, the comment must be on a
    separate line and must have the pound character (#) as the first
    character of the line. Elsewhere, a pound character and following
    comment text can be placed either on a line alone or after the last
    dependent file or command listed on a line. Characters appearing on a
    line after the pound character are ignored during execution.

    The /D, /N, and /S switches affect MAKE's output to the display while
    MAKE is executing. The /D switch causes the last modification date of
    each file to be displayed as the file is scanned. The /N switch causes
    the commands in the make file to be expanded and displayed, but not
    executed; this is useful for determining the result of a specific MAKE
    process without first examining the file dates and without recompiling
    or relinking files. The /S switch selects "silent" mode, in which
    commands are not displayed as they are executed.

    The /I switch causes MAKE to ignore error codes returned by the
    compilers, assemblers, linkers, or other programs called by the make
    file. When the /I switch is used, the MAKE process proceeds to
    completion regardless of errors instead of terminating immediately as
    it ordinarily would, but the resulting files may not be
    executable.

Return Codes

    0  No error; the MAKE process was successful.
    1  Processing was terminated because of a fatal error by MAKE or by
        one of the programs called by MAKE.

Example

    Assume that the file SHELL contains the following MAKE dependency
    statements and commands:

    video.obj: video.asm
            masm video;

    shell.obj: shell.c
            msc shell;

    shell.exe: shell.obj video.obj
            link /map shell+video,shell,shell,slibc2

    The SHELL file asserts that the executable program SHELL.EXE is
    composed of the files SHELL.OBJ and VIDEO.OBJ, which are in turn
    compiled or assembled from the source files SHELL.C and VIDEO.ASM. To
    update the file SHELL.EXE if either of the source files for its
    constituent modules has been changed, type

    C>MAKE SHELL  <Enter>

Messages

    fatal error U1001: macro definition larger than 512
    A single macro was defined to have a value string longer than the 512-
    byte maximum. Rewrite the make file to use two or more short lines
    instead of one long line.

    fatal error U1002: infinitely recursive macro
    The macros defined in the make file form a circular chain.

    fatal error U1003: out of memory
    The make file cannot be processed because insufficent memory is
    available in the transient program area. Split the make file into two
    make files or reconfigure the system to increase available memory.

    fatal error U1004: syntax error : macro name missing
    A macro name is missing from the left side of the equal sign (=).

    fatal error U1005: syntax error : colon missing
    A line that should be a dependency statement lacks the colon that
    separates a target file from its dependent files. MAKE expects any
    line that follows a blank line to be a dependency statement.

    fatal error U1006: targetname : macro expansion larger than 512
    A single macro expansion, plus the length of any string to which it
    may be concatenated, is longer than 512 bytes. Rewrite the make file
    to use two or more short lines instead of one long line.

    fatal error U1007: multiple sources
    An inference rule has been defined more than once in the make
    file.

    fatal error U1008: filename : cannot find file
    The specified file does not exist.

    fatal error U1009: command : argument list too long
    A command line in the make file is longer than 128 characters (the
    maximum MS-DOS allows).

    fatal error U1010: filename : permission denied
    The specified file is read-only.

    fatal error U1011: not enough memory
    Memory is insufficient in the transient program area to execute a
    program listed in the make file. Reconfigure the system to increase
    available memory, if necessary.

    fatal error U1012: filename : unknown error
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    fatal error U1013: command : error returncode
    One of the programs or commands called by MAKE was not able to execute
    correctly. MAKE terminates and displays the error code from the
    program that failed.

    warning U4000: filename : target does not exist
    The target file does not already exist. The dependency statement is
    evaluated as though the target file exists and has a date earlier than
    that of any of the dependent files.

    warning U4001: dependent filename does not exist;
    target filename not built
    One of the dependent files does not exist or could not be found, so
    MAKE terminated without creating a new target file.

    warning U4013: command : error returncode (ignored)
    One of the programs or commands called by MAKE did not execute
    successfully and has returned the specified return code. Because MAKE
    was run with the /I switch, MAKE ignores the error and continues
    processing the make file.

    warning U4014: usage : make [/n] [/d] [/i] [/s] [name=value ...] file
    An error was detected in the MAKE command line.



MAPSYM
Create Symbol File for SYMDEB


Purpose

    Processes a map file generated by the Microsoft Object Linker (LINK)
    to create a special symbol file for use with SYMDEB, the symbolic
    debugging program. The MAPSYM utility is supplied with the Microsoft
    Macro Assembler (MASM). This documentation describes MAPSYM version
    4.0.

Syntax

    MAPSYM [/L] map_file

    where:

    map_file    is a map file produced by LINK (default extension = .MAP).

    /L          causes information about the symbol file to be
                displayed as it is created.

    Note: The /L switch can be either uppercase or lowercase and can be
    preceded by a dash (-) instead of a forward slash (/).

Description

    LINK combines relocatable object records (produced by MASM or a high-
    level-language compiler) into an executable program, which is stored
    in a specially formatted file with a .EXE extension. LINK can also
    produce an optional map file that contains information about public
    symbols and addresses in the linked program. The map file is an
    ordinary ASCII text file and has a default extension of .MAP.

    To create a map file to use with MAPSYM, the LINK command line should
    include the /MAP switch, which creates the file, and the /LINENUMBERS
    switch, which includes line numbers. See PROGRAMMING UTILITIES:
    LINK.

    The MAPSYM utility processes a map file into a special symbol file
    that can be used by SYMDEB. A drive and pathname can be specified if
    the map file is not in the current directory. If a file extension is
    not specified, .MAP is assumed.

    The symbol file created by MAPSYM is placed in the current directory
    and has the same name as the map file but has the extension .SYM. It
    can contain a maximum of 1024 segments (or as many segments as can fit
    into available memory) and 10,000 symbols per segment. See
    PROGRAMMING UTILITIES: SYMDEB.

    When the /L switch precedes map_file in the command line, MAPSYM
    displays the names of groups defined in the program described by the
    map and symbol files, plus the program's starting address. The /L
    switch does not affect the format of the symbol file that is
    generated.

Return Codes

    0  No error; the MAPSYM process was successful.
    1  Processing was terminated because of a write failure, because the
        map file specified does not exist, or because the symbol file could
        not be created.
    4  Processing was terminated because an unexpected end-of-file mark
        was detected, because too many segments exist in the map file,
        because no public symbols exist in the map file, or because not
        enough memory is available to create the symbol file.

Example

    To convert the file HELLO.MAP, which was produced by assembling and
    linking the file HELLO.ASM, to a symbol file that can be used by
    SYMDEB, type

    C>MAPSYM /L HELLO  <Enter>

    MAPSYM displays the following:

    Microsoft (R) Symbol File Generator  Version 4.00
    Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.
    Building: HELLO.SYM
    HELLO.MAP
            Program entry point at 0000:0100
    HELLO     0 segment

    The symbol file produced by MAPSYM symbol has the name
    HELLO.SYM.

Messages

    Can't create: <filename>
    The drive specified does not exist, the current disk or directory is
    full, or the output file already exists and is read-only.

    Can't open MAP file: <filename>
    The file named in the command line does not exist.

    DOS 2.0 or later required
    MAPSYM does not work with versions of MS-DOS earlier than 2.0.

    mapsym: out of memory
    System memory is insufficient to process the map file.

    mapsym: segment table (n) exceeded.
    More than 1024 segments have been used in the map file. The number
    displayed is the total number of segments in the map file.

    No public symbols
    Re-link file with the /M switch!
    The map file created by LINK does not include a list of public names.
    The .EXE file must be relinked using the /MAP switch to generate a map
    file that can be used with MAPSYM.

    Unexpected eof reading: <filename>
    The map file contains no symbols, is corrupt, or is otherwise invalid.
    The .EXE file must be relinked and a new map file generated.

    usage: MAPSYM [/l] maplist
    A syntax error was detected in the command line.

    Write fail on: <filename>
    An error occurred during the creation of the output file.



MASM
Microsoft Macro Assembler


Purpose

    Translates an assembly-language source program into a relocatable
    object module. MASM is part of the Microsoft Macro Assembler (MASM)
    retail package. This documentation describes MASM version 4.0.

Syntax

    MASM

    or

    MASM source_file [,[object_file][,[list_file][,[cref_file]]]]
    [options] [;]

    where:

    source_file     is the name of the file containing the assembly-
                    language source code (default extension = .ASM).

    object_file     is the name of the file to receive the assembled
                    object module (default extension = .OBJ).

    list_file       is the name of the file or device to receive the
                    assembly listing (default = NUL). (If destination =
                    file, default extension = .LST.)

    cref_file       is the name of the cross-reference file to receive
                    information for later processing by the CREF utility
                    (default = NUL). (If destination = file, default
                    extension = .CRF.)

    options         is one or more switches from the list below.

                    /A         Writes the program segments in alphabetic
                                order.

                    /Bn        Sets the size of the source-file buffer in
                                kilobytes (1-63, default = 32).

                    /C         Creates a cross-reference (.CRF) file.

                    /D         Adds a first-pass program listing to
                                list_file if a list file was specified
                                (default = second-pass listing only).

                    /Dsymbol   Defines symbol as a null text string.

                    /E         Assembles code for an 8087/80287 emulator.

                    /Ipath     Defines a directory to be searched for
                                include files.

                    /L         Creates a list (.LST) file with line-
                                number information.

                    /ML        Preserves case sensitivity in all symbol
                                names.

                    /MU        Converts all lowercase names to uppercase
                                names.

                    /MX        Preserves lowercase in public and external
                                names only.

                    /N         Suppresses generation of tables of macros,
                                structures, records, groups, segments,
                                and symbols at the end of the list file.

                    /P         Checks for impure code in 80286 protected
                                mode; has no effect unless the .286P
                                directive is included in the source file.

                    /R         Assembles code for an 8087/80287 math
                                coprocessor.

                    /S         Arranges program segments in order of
                                occurrence.

                    /T         Selects terse mode, suppressing all
                                messages generated during assembly except
                                error messages.

                    /V         Selects verbose mode, displaying the
                                number of lines and symbols at the end of
                                assembly.

                    /X         Includes false conditionals in the list
                                file.

                    /Z         Displays source lines with errors during
                                assembly.

    Note: Switches can be either uppercase or lowercase and can be
    preceded by a dash (-) instead of a forward slash (/).

Description

    MASM translates assembly-language source code into relocatable object
    modules. The object modules can then be placed in a library file or
    processed by the Microsoft Object Linker (LINK) to create an
    executable program.

    The source_file parameter is the only required filename. It specifies
    a file containing the assembly-language source code in ASCII text. If
    no extension is specified, MASM uses .ASM. If no source file is
    entered in the command line, MASM prompts for a source file name.

    The object_file parameter specifies the file that will contain the
    assembled relocatable object code. If this parameter is not supplied,
    MASM uses the same filename as source_file but substitutes the
    extension .OBJ.

    The list_file parameter specifies a destination file or device for
    the optional program listing. The listing contains the original source
    code, the assembled machine code, macro definitions and expansions,
    and other useful information, formatted into pages with titles, dates,
    and page numbers. If the destination of the listing is a file, the
    file's default extension is .LST. If the list_file parameter is not
    included in the command line, MASM sends the listing to NUL (that is,
    a listing is not produced).

    The cref_file parameter specifies the name of a cross-reference file
    to receive information to be processed by the CREF utility. If a file
    extension is not specified, MASM uses .CRF. If the cref_file
    parameter is not included in the command line, MASM sends the file to
    NUL (that is, no cross-reference file is generated).

    If the MASM command is entered without parameters, MASM prompts the
    user for each filename. The default response for each prompt (except
    the source file prompt) is displayed in square brackets and can be
    selected by pressing the Enter key.

    After the source file is specified, if MASM encounters a semicolon
    character (;) in the command line or at any prompt, it uses default
    values for the remaining parameters. MASM ignores any parameters
    specified after the semicolon.

    MASM does two passes to translate the assembly-language code in the
    source file into relocatable object code. Any errors detected during
    translation are displayed on standard output and included in the
    program listing (if one is requested). Two types of errors may be
    detected: warning errors and severe errors. If MASM encounters a
    warning error, it still creates the object file, although the
    resulting file may be unusable. If MASM encounters a severe error, it
    does not create the object file. After a file has been successfully
    assembled without errors, the LINK utility can be used to convert the
    resulting object file into an executable program file.

    MASM supports a wide variety of options that can be selected by
    including switches in the command line or by responding to any
    prompt.

    The /A and /S switches determine the order of segments in the
    resulting object module file. The /A switch places the segments into
    the object file in alphabetic order. The /S switch (the default)
    arranges the segments in the same order they occur in the source
    file.

    The /Bn, /Dsymbol, and /Ipath switches have rather general effects on
    the behavior of MASM. The /Bn switch sets the size (in kilobytes) of
    the source file's RAM buffer; the value of n must be between 1 and
    63, inclusive (default = 32). If the RAM buffer is large enough, the
    entire source file can be kept resident in memory, reducing disk
    activity during passes. The /Dsymbol switch defines a null text-
    string symbol from the command line. This symbol can be referenced
    inside the program with the IFDEF directive to control the conditional
    assembly of portions of the program. The /Ipath switch specifies a
    directory that will be searched for files named in assembler INCLUDE
    statements if those statements do not include an explicit directory.
    As many as 10 such search paths can be specified with individual
    /Ipath switches.

    The /E and /R switches affect the generation of code for the
    8087/80287 emulator or 8087/80287 math coprocessor. (Support for the
    80287 is included with MASM versions 3.0 and later.) The /E switch
    generates software interrupts to floating-point-processor emulator
    routines. A subprogram assembled with the /E switch can be linked to
    C, Pascal, and FORTRAN programs and can use the emulator libraries.
    The /R switch produces in-line machine instructions for the math
    coprocessor when floating-point mnemonics are used.

    The /ML, /MU, and /MX switches control MASM's handling of uppercase
    and lowercase names. The /ML switch makes MASM case sensitive; that
    is, it makes MASM differentiate a name in uppercase letters from the
    same name in lowercase letters. (The /ML switch should not be used if
    the source file contains 8087 WAIT instructions and MASM 4.0 is being
    used to translate the file.) The /MU switch (the default) makes MASM
    case insensitive; all lowercase letters are converted to uppercase for
    purposes of assembly. The /MX switch makes MASM case sensitive for
    public and external names only (names defined with PUBLIC or EXTRN
    directives). The /MX switch is often used to process assembly-language
    functions for C programs.

    The /P switch checks for impure code segments that will cause problems
    if the assembled program is run in 80286 protected mode. The switch
    checks by flagging any instruction that will change a memory location
    addressed through the processor's CS register. The /P switch has no
    effect unless the assembly-language source file includes the .286P
    directive.

    The /C, /D, /L, /N,  and /X switches control the contents of the
    program listing and other optional files that are generated as a
    result of assembly. The /C switch causes the creation of a cross-
    reference (.CRF) file and the addition of line numbers to the list
    (.LST) file (if one exists). The /C switch should be included in the
    command line if the cross-reference file will be used later with the
    CREF utility to produce a cross-reference listing. The /D switch
    includes a listing from the first pass as well as a listing from the
    second pass in the list file if a list file was specified (default =
    second-pass listing only). By comparing the two listings, the user can
    isolate an instruction causing a phase error. (A phase error occurs
    when MASM makes assumptions about addresses, values, or data types on
    the first pass that are not valid in the second pass.) The /L switch
    creates a list file with line-number information and gives it the same
    name as the source file, with the extension .LST. The /N switch
    suppresses generation of tables--symbols, segments, groups,
    structures, records, and macros--at the end of a program listing. The
    /X switch includes statements inside false conditional statements in
    the list file, allowing conditionals that do not generate code to be
    displayed. /X has no effect if the .SFCOND or the .LFCOND directive is
    used in the source file; if the .TFCOND directive is used, the effects
    of /X are reversed.

    Note: The effects of /X are also reversed in MASM version 1.2. In
    that version, statements within a false conditional are included in
    the list file by default, and /X will suppress them.

    The /T, /V, and /Z switches affect MASM's display on standard output.
    The /T (terse) switch suppresses messages to standard output, except
    for messages indicating warning errors or severe errors. The /V
    (verbose) switch displays information about the number of source lines
    and symbols at the end of the assembly, in addition to displaying the
    normal error and symbol space information. The /Z switch displays the
    actual source lines producing assembly errors (rather than displaying
    just the error type and line number).

    Note: Versions of MASM earlier than 4.0 always show both the source
    line and the error message.

Return Codes

    0   No errors were found during assembly.
    1   An error was detected in one of the command-line parameters.
    2   The assembly-language source file could not be opened.
    3   The list file could not be created.
    4   The object file could not be created.
    5   The cross-reference file could not be created.
    6   An include file could not be opened.
    7   At least one severe error was detected during assembly. (MASM
        deletes the invalid object file.)
    8   The assembly was terminated because a memory allocation error
        occurred.
    10  An error occurred in defining a symbol (with the /Dsymbol switch)
        from the command line.
    11  Assembly was interrupted by the user's pressing Ctrl-C or Ctrl-
        Break.

Examples

    To assemble the source file CLEAN.ASM in the current drive and
    directory and place the resulting relocatable object module in the
    file CLEAN.OBJ without producing a listing or a cross-reference file,
    type

    C>MASM CLEAN;  <Enter>

    The semicolon after the first parameter causes MASM to use the default
    values for the rest of the parameters.

    To assemble the source file CLEAN.ASM, put the object code in a file
    named CLEAN.OBJ, create a list file named CLEAN.LST, and place
    information for later processing by the CREF utility in the cross-
    reference file CLEAN.CRF, type

    C>MASM CLEAN,CLEAN,CLEAN,CLEAN  <Enter>

    or

    C>MASM CLEAN,,CLEAN,CLEAN  <Enter>

    To use MASM interactively, enter its name without parameters:

    C>MASM  <Enter>

    MASM then prompts for all the necessary information. For example, the
    interactive session on the next page assembles the file HELLO.ASM into
    the file HELLO.OBJ, producing no listing or .CRF file.

    C>MASM  <Enter>
    Microsoft (R) Macro Assembler  Version 4.00
    Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved

    Source filename: [.ASM]: HELLO  <Enter>
    Object filename: [HELLO.OBJ]:  <Enter>
    Source listing [NUL.LST]:  <Enter>
    Cross-reference [NUL.CRF]:  <Enter>

    51004 Bytes symbol space free

        0 Warning Errors
        0 Severe Errors

Messages

    8087 opcode can't be emulated
    An 8087 opcode or the operands used with it produced an instruction
    the emulator cannot support.

    Already defined locally
    An attempt was made to define a symbol as EXTRN that had already been
    defined locally.

    Already had ELSE clause
    An attempt was made to define an ELSE clause within an existing ELSE
    clause. (ELSE cannot be nested without nesting IF...ENDIF.)

    Already have base register
    More than one base register was specified within an operand.

    Already have index register
    More than one index register was specified within an operand.

    Block nesting error
    A segment, structure, macro, IRC, IRP, REPT, or nested procedure was
    not terminated properly.

    Byte register is illegal
    A byte register was used incorrectly in an instruction.

    Can't override ES segment
    An attempt was made to override the ES segment in an instruction in
    which this override is invalid.

    Can't reach with segment reg
    No ASSUME directive was given to make the variable reachable.

    Can't use EVEN on BYTE segment
    An EVEN directive was used on a segment declared to be a byte
    segment.

    Circular chain of EQU aliases
    An alias EQU ultimately points to itself.

    Constant was expected
    A constant was expected, but an item was received that does not
    evaluate to a constant.

    CS register illegal usage
    The CS register was used incorrectly in one of the instructions.

    Data emitted with no segment
    Code that is not located within a segment attempted to generate
    data.

    Directive illegal in STRUC
    All statements within STRUC blocks must be either comments preceded by
    a semicolon character (;) or one of the define directives (DB, DW, and
    so on).

    Division by 0 or overflow
    An expression was encountered that resulted in either a division by 0
    or a number too large to be represented.

    DUP is too large for linker
    Nesting of DUP operators was such that a record too large for LINK was
    created.

    End of file, no END directive
    No END statement was encountered, or a nesting error occurred.

    Extra characters on line
    Superfluous characters were detected on a line after sufficient
    information to define an instruction was interpreted.

    extra file name ignored
    The command line contained more than four filename parameters.

    Field cannot be overridden
    An attempt was made to give a value to a field that cannot be
    overridden with a STRUC initialization statement.

    Forced error
    An error was forced with the .ERR directive.

    Forced error - expression equals 0
    An error was forced with the .ERRE directive.

    Forced error - expression not equal 0
    An error was forced with the .ERRNZ directive.

    Forced error - pass1
    An error was forced with the .ERR1 directive.

    Forced error - pass2
    An error was forced with the .ERR2 directive.

    Forced error - string blank
    An error was forced with the .ERRB directive.

    Forced error - string not blank
    An error was forced with the .ERRNB directive.

    Forced error - strings different
    An error was forced with the .ERRDIF directive.

    Forced error - strings identical
    An error was forced with the .ERRIDN directive.

    Forced error - symbol defined
    An error was forced with the .ERRDEF directive.

    Forced error - symbol not defined
    An error was forced with the .ERRNDEF directive.

    Forward reference is illegal
    An item was referenced in the operand of an EQU or equal-sign (=)
    directive before it was defined.

    Illegal register value
    A specified register value does not fit into the reg field (that is,
    the value is greater than 7).

    Illegal size for item
    The size of the referenced item is invalid. This error also frequently
    occurs when an attempt is made to assemble source code written for
    assemblers with less strict type-checking than that of the Microsoft
    Macro Assembler (such as early versions of the IBM assembler). The
    problem can usually be solved by overriding the type of the operand
    with the PTR operator.

    Illegal use of external
    A variable that was declared external was used incorrectly.

    Illegal use of register
    An attempt was made to use a register with an instruction in which a
    register cannot be used.

    Illegal value for DUP count
    The DUP count was not a constant that evaluates to a positive integer
    greater than zero.

    Improper operand type
    An operand was used in a way that prevents opcode generation.

    Improper use of segment register
    An attempt was made to use a segment register in an instruction in
    which use of a segment register is not permitted.

    Impure memory reference
    An attempt was made to store data in the code segment when the .286P
    directive and the /P switch were in effect.

    Index displ. must be constant
    An index displacement was used incorrectly or did not evaluate to an
    absolute number or memory address.

    Internal error
    An internal logic error was detected in the assembler. Document the
    circumstances and contact Microsoft Corporation.

    Label can't have seg. override
    A segment override was used incorrectly.

    Left operand must have segment
    The content of the right operand requires that a segment be specified
    in the left operand.

    Line too long expanding symbol
    A symbol defined by an EQU or equal-sign (=) directive is so long that
    expanding it will cause the assembler's internal buffers to overflow.
    This message may indicate a recursive text macro.

    Missing data; zero assumed
    An operand is missing from a statement and MASM assumes its value is
    zero. This is a warning error; the object file is not deleted as it is
    with severe errors.

    More values than defined with
    Too many initial values were given when defining a variable using a
    REC or STRUC type.

    Must be associated with code
    A data-related item was used where a code-related item was
    expected.

    Must be associated with data
    A code-related item was used where a data-related item was
    expected.

    Must be AX or AL
    A register other than AX or AL was specified where only these are
    acceptable.

    Must be in segment block
    An attempt was made to generate code by instructions that were not
    contained within a segment.

    Must be index or base register
    An instruction requires a base or index register, and some other
    register was specified within square brackets ([]).

    Must be record field name
    A record field name was expected, but something else was
    encountered.

    Must be record or fieldname
    A record name or field name was expected, but something else was
    encountered.

    Must be register
    A register was expected as the operand, but something else was
    encountered.

    Must be segment or group
    A segment or group was expected, but something else was
    encountered.

    Must be structure field name
    A structure field name was expected, but something else was
    encountered.

    Must be symbol type
    A BYTE, WORD, DWORD, or similar designation was expected, but
    something else was encountered.

    Must be var, label or constant
    A variable, label, or constant was expected, but something else was
    encountered.

    Must have opcode after prefix
    A REP, REPE, REPNE, REPZ, or REPNZ instruction was not followed by the
    mnemonic for a string operation.

    Near JMP/CALL to different CS
    An attempt was made to do a NEAR jump or call to a location in a code
    segment defined with a different ASSUME:CS.

    No immediate mode
    Immediate data was supplied as an operand for an instruction that
    cannot use immediate data. For example, immediate data cannot be moved
    directly with a MOV instruction to a segment register; it must first
    be moved into a general register and then copied to the segment
    register.

    No or unreachable CS
    An attempt was made to jump to a label that is unreachable.

    Normal type operand expected
    A STRUC, BYTE, WORD, or some other invalid operand was encountered
    when a variable label was expected.

    Not in conditional block
    An ENDIF or ELSE statement was encountered, and no previous
    conditional-assembly directive was active.

    Not proper align/combine type
    The SEGMENT parameters are incorrect. Check the align and combine
    types to be sure they are valid.

    One operand must be const
    The addition operator was used incorrectly.

    Only initialize list legal
    An attempt was made to use a STRUC name without angle brackets (<>).

    Operand combination illegal
    A two-operand instruction was specified and the combination specified
    was invalid.

    Operand must have segment
    A SEG directive was used incorrectly.

    Operand must have size
    An operand was encountered that needed a specified size, but none had
    been provided. Often this error can be remedied by using the PTR
    operator to specify a size type.

    Operand not in IP segment
    An operand cannot be accessed because it is not in the segment last
    assigned to CS with an ASSUME directive.

    Operand types must match
    MASM encountered different kinds or sizes of arguments in a case where
    they must match.

    Operand was expected
    MASM expected an operand, but an operator was encountered.

    Operands must be same or 1 abs
    The subtraction operator was used incorrectly.

    Operator was expected
    MASM expected an operator, but an operand was encountered.

    Out of memory
    System memory is insufficient to complete the assembly. If a listing
    (.LST) or cross-reference (.CRF) file was being generated, retry the
    assembly, generating only an object file. It may also be necessary to
    modify the source program to reduce the load on the symbol table (by
    shortening names or reducing the number of EQU statements or macros,
    for example).

    Override is of wrong type
    An attempt was made to use a data item of incorrect size in a STRUC
    initialization statement.

    Override value is wrong length
    The override value for a structure field is too large to fit in the
    field.

    Override with DUP is illegal
    An attempt was made to use DUP to override in a STRUC initialization
    statement.

    Phase error between passes
    The program has ambiguous instruction directives that caused the
    location of a label in the program to change in value between the
    first and second passes of MASM. A common cause is a forward reference
    to a typed data item in the instructions preceding the label that
    generated the phase error message. Use the /D switch to produce a
    first-pass listing to aid in resolving phase errors between passes.

    Redefinition of symbol
    This message is displayed during first pass upon the second
    declaration of a symbol that has been defined in more than one place.

    Reference to mult defined
    The instruction references a symbol that has been defined more than
    once.

    Register already defined
    An internal error was detected. Note the circumstances of the failure
    and contact Microsoft Corporation.

    Relative jump out of range
    A conditional jump references a label that is out of the allowed range
    of -128 to +127 bytes relative to the current instruction. The problem
    usually can be corrected by reversing the condition of the jump and
    using an unconditional jump (JMP) to the out-of-range label.

    Segment parameters are changed
    The list of parameters encountered for a SEGMENT was not identical to
    the list specified the first time the segment was used.

    Shift count is negative
    A shift expression was generated that resulted in a negative shift
    count.

    Should have been group name
    A group name was expected, but something else was encountered.

    Symbol already different kind
    An attempt was made to redefine an already defined symbol.

    Symbol has no segment
    An attempt was made to use a variable with SEG that has no known
    segment.

    Symbol is already external
    An attempt was made to redefine a symbol as local that has already
    been defined as external.

    Symbol is multi-defined
    This message is displayed during the second pass upon each declaration
    of a symbol that has been defined in more than one place.

    Symbol is reserved word
    An attempt was made to use a reserved MASM word as a symbol.

    Symbol not defined
    A symbol that had not been defined was used.

    Symbol type usage illegal
    A PUBLIC symbol was used incorrectly.

    Syntax error
    The syntax of the statement does not match any recognizable syntax.

    Type illegal in context
    The type specified is of an unacceptable size.

    Unable to open input file filename
    The specified source file cannot be found.

    unknown switch letter
    The command line included an invalid switch.

    Unknown symbol type
    MASM does not recognize the size type specified in a label or external
    declaration. Rewrite with a valid type such as BYTE, WORD, or NEAR.

    Value is out of range
    A value is too large for its expected use.

    Wrong type of register
    A directive or instruction expected one type of register, but another
    type was encountered.



DEBUG
Program Debugger


Purpose

    Allows the controlled execution of a program for debugging purposes or
    the alteration of the binary contents of any file. The DEBUG utility
    is supplied with the MS-DOS distribution disks.

Syntax

    DEBUG

    or

    DEBUG filename [parameter ...]

    where:

    filename         is the name of the file that contains data to be
                    modified or a program to be debugged. If filename
                    includes an extension, it must be specified.

    parameter ...    is one or more filenames or switches required by a
                    program being debugged.

Description

    The DEBUG program allows a file to be loaded, examined, and altered.
    If the file is not a .EXE file or a .HEX file, it may also be written
    back to disk. If the file contains a program, the program can be
    disassembled, modified, traced one instruction at a time, or executed
    at full speed with preset breakpoints. DEBUG can also be used to read
    from and write to input/output (I/O) ports and to read, modify, and
    write absolute disk sectors.

    The command line typically includes the filename parameter, which is
    the name of an executable program (with the extension .COM or .EXE) to
    be loaded into DEBUG's memory buffer. Files with the extension .EXE
    are loaded in a manner compatible with the MS-DOS loader; if
    necessary, the contents of the file are relocated so that the program
    is ready to execute. Files with the extension .HEX are converted to
    binary images and loaded at the internally specified address. All
    other files are assumed to be direct memory images and are read
    directly into memory starting at offset 100H.

    An appropriate program segment prefix (PSP) is synthesized at the head
    of DEBUG's buffer for use by the target program (the program being
    debugged). The PSP includes a command tail at offset 80H and default
    file control blocks (FCBs) at offsets 5CH and 6CH, constructed from
    the optional parameters following filename.

    After DEBUG is loaded and the first file named in the command line is
    also located and loaded, DEBUG displays its special prompt character,
    a hyphen (-), and awaits a command. DEBUG commands consist of a single
    letter, usually followed by one or more parameters. Uppercase and
    lowercase characters are treated the same except when they are
    contained in strings enclosed within single or double quotation marks.
    All commands are executed by pressing the Enter key.

    The DEBUG commands are

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
    ──────────────────────────────────────────────────────────────────────
    A            Assemble machine instructions (versions 2.0 and later).
    C            Compare memory areas.
    D            Display memory.
    E            Enter data.
    F            Fill memory.
    G            Go execute program.
    H            Perform hexadecimal arithmetic.
    I            Input from port.
    L            Load file or sectors.
    M            Move (copy) data.
    N            Name file or command-tail parameters.
    O            Output to port.
    P            Proceed through loop or subroutine (versions 3.0 and
                later).
    Q            Quit debugger.
    R            Display or modify registers.
    S            Search memory.
    T            Trace program execution.
    U            Disassemble (unassemble) program.
    W            Write file or sectors.

    The parameters for a DEBUG command include addresses, ranges, 8-bit or
    16-bit hexadecimal values, and lists. Multiple parameters can be
    separated by spaces, tabs, or commas, but separators are required
    only between hexadecimal values.

    An address can be a simple offset or a complete address in the form
    segment:offset. The offset is always a hexadecimal number in the range
    00H through FFFFH; the segment can be either a hexadecimal value in
    the same range or a two-character segment register name (CS, DS, ES,
    or SS). If the segment portion of an address is absent, DEBUG uses DS
    unless an A, G, L, T, U, or W command is used, in which case DEBUG
    uses CS.

    A range specifies an area of memory and can be expressed as either two
    addresses or a starting address and a length. A segment can be
    included only in the first element of a range; an error message is
    displayed if a segment is found in the second address. A length is
    represented by the letter L, followed by a hexadecimal value between
    00H and FFFFH that indicates the number of bytes following the
    starting address that the command should operate on.

    Note: Any length that causes an address to exceed 16 bits will
    generate an error.

    A byte, or 8-bit, value is entered as one or two hexadecimal digits,
    whereas a word, or 16-bit, value is entered as one to four hexadecimal
    digits. Leading zeros can be omitted.

    A list is composed of one or more byte values or strings, separated by
    spaces, commas, or tabs. A string is one or more ASCII characters
    enclosed within single or double quotation marks. Case is significant
    within a string. If the same type of quote character that is used to
    delimit the string occurs inside the string itself, the character must
    be doubled inside the string in order to be interpreted correctly. For
    example:

    "This ""string"" is OK."

    When used, a list must be the last parameter in the command
    line.

    DEBUG responds to an invalid command by pointing to the approximate
    location of the error with a caret character (^) and displaying the
    word Error. For example:

    -D CS:0100,CS:0200  <Enter>
                ^ Error

    DEBUG maintains a set of virtual CPU registers for a program being
    debugged. These registers can be examined and modified with DEBUG
    commands. When a program is first loaded for debugging, the virtual
    registers are initialized with the following values:

╓┌──────────────┌─────────────────────────────┌──────────────────────────────╖
    Register  .COM Program                  .EXE Program
    ──────────────────────────────────────────────────────────────────────
    AX        Valid drive error code        Valid drive error code
    BX        Upper half of program size    Upper half of program size
    CX        Lower half of program size    Lower half of program size
    DX        Zero                          Zero
    SI        Zero                          Zero
    DI        Zero                          Zero
    BP        Zero                          Zero
    SP        FFFEH or top of available     Size of stack segment
            memory minus 2
    IP        100H                          Offset of entry point within
                                            target program's code segment
    CS        PSP                           Base of target program's code
                                            segment
    DS        PSP                           PSP
    ES        PSP                           PSP
    SS        PSP                           Base of target program's stack
                                            segment

    Note: DEBUG checks the first three parameters in the command line. If
    the second and third parameters are filenames, DEBUG checks any drive
    specifications with those filenames to verify that they designate
    valid drives. Register AX contains one of the following codes:

╓┌──────────────┌────────────────────────────────────────────────────────────╖
    Code      Meaning
    ──────────────────────────────────────────────────────────────────────
    0000H     The drives specified with the second and third filenames are
            both valid, or only one filename was specified in the
            command line.

    00FFH     The drive specified with the second filename is invalid.

    FF00H     The drive specified with the third filename is invalid.

    FFFFH     The drives specified with the second and third filenames are
            both invalid.

    DEBUG also maintains a set of virtual flags, which may be set or
    cleared. The flags are

╓┌───────────────────────┌───────────────────┌───────────────────────────────╖
    Flag Name          Value If Set (1)    Value If Clear (0)
    ──────────────────────────────────────────────────────────────────────
    Overflow           OV (Overflow)       NV (No Overflow)B
    Direction          DN (Down)           UP (Up)
    Interrupt          EI (Enabled)        DI (Disabled)
    Sign               NG (Minus)          PL (Plus)
    Zero               ZR (Zero)           NZ (Not Zero)
    Aux Carry          AC (Aux Carry)      NA (No Aux Carry)
    Parity             PE (Even)           PO (Odd)
    Carry              CY (Carry)          NC (No Carry)

    Before DEBUG transfers control to the target program, it saves
    the actual CPU registers and then loads them with the current values
    of the virtual registers. Conversely, when control reverts to DEBUG
    from the target program, the returned register contents are stored
    back in the virtual register set for inspection and alteration by the
    user.

Examples

    To load the file SHELL.EXE in the current directory for execution
    under the control of DEBUG, type

    C>DEBUG SHELL.EXE  <Enter>

    To use the DEBUG program to inspect or modify memory or to read,
    modify, and write absolute disk sectors, simply type

    C>DEBUG  <Enter>

Message

    File not found
    The filename supplied as the first parameter in the DEBUG command line
    cannot be found.



DEBUG: A
Assemble Machine Instructions


Purpose

    Allows entry of assembler mnemonics and translates them into
    executable machine code.

Syntax

    A [address]

    where:

    address    is the starting location for the assembled machine code.

Description

    The Assemble Machine Instructions (A) command accepts assembly-
    language statements, rather than hexadecimal values, for the Intel
    8086/8088 microprocessors and the Intel 8087 math coprocessor and then
    assembles each statement into executable machine code.

    The address parameter specifies the location where entry of assembly-
    language mnemonics will begin. If address is omitted, DEBUG uses the
    address following the last instruction generated the last time the A
    command was used. If the A command has not been used, DEBUG uses the
    current value of the target program's CS:IP registers.

    After an A command is entered, DEBUG prompts for each assembly-
    language statement by displaying the address, in the form of a segment
    and an offset, in which the assembled code will be stored. When the
    Enter key is pressed, the assembly-language statement is translated,
    and each byte of the resulting machine instruction is stored
    sequentially in memory (overwriting existing information), beginning
    at the displayed address. The address following the last byte of the
    machine instruction is then displayed so that the user can enter the
    next assembly-language statement. Pressing the Enter key alone in
    response to the address prompt terminates the A command.

    The syntax of assembly-language statements accepted by the DEBUG A
    command differs slightly from that of the usual Microsoft Macro
    Assembler programming statements. The differences can be summarized as
    follows:

    ■  All numbers are assumed to be hexadecimal integers and should be
        entered without a trailing H character.

    ■  Segment overrides must be specified by preceding the entire
        instruction with CS:, DS:, ES:, or SS:.

    ■  File control directives (NAME, PAGE, TITLE, and so forth), macro
        definitions, record structures, and conditional assembly directives
        are not supported by DEBUG.

    ■  Specific hexadecimal values, rather than program labels, must be
        included.

    ■  When the data type (word or byte) is not implicit in the
        instruction, the type must be specified by preceding the operand
        with BYTE PTR (or BY) or WORD PTR (or WO).

    ■  The size of the string in a string operation must be specified by
        adding a B (byte) or W (word) to the string instruction mnemonic
        (for example, LODSB or LODSW).

    ■  The DB and DW instructions accept a parameter of the type list and
        assemble byte and word values directly.

    ■  The WAIT or FWAIT opcodes for 8087 assembler statements are not
        generated by default, so they must be coded explicitly.

    ■  Memory locations are differentiated from immediate operands by
        enclosing memory addresses in square brackets.

    ■  Repeat prefixes, such as REP, REPZ, or REPNZ, can be entered either
        alone on the line preceding the statement they affect or
        immediately preceding the statement on the same line.

    ■  Although the assembler generates the optimal form (SHORT, NEAR, or
        FAR) for jumps or calls, depending on the destination address,
        these designations can be overridden by preceding the operand with
        a NEAR (or NE) or FAR (no abbreviation) prefix.

    ■  The mnemonic for a FAR RETURN is RETF.

    Examples

    To begin assembling code at address CS:0100H, type

    -A 100  <Enter>

    To assemble the instruction sequence

    LODS  WORD PTR [SI]
    XCHG  BX,AX
    JMP   [BX]

    beginning at address CS:0100H, the following dialogue would take
    place:

    -A 100  <Enter>
    1983:0100  LODSW  <Enter>
    1983:0101  XCHG BX,AX  <Enter>
    1983:0103  JMP [BX]  <Enter>
    1983:0105  <Enter>


    To continue assembling at the location following the last instruction
    generated by a previous A command, type

    -A  <Enter>



DEBUG: C
Compare Memory Areas


Purpose

    Compares two areas of memory and reports any differences.

Syntax

    C range address

    where:

    range      is the starting and ending addresses or the starting
                address and length of the first area of memory to be
                compared.

    address    is the starting address of the second area of memory to be
                compared.

Description

    The Compare Memory Areas (C) command compares the contents of two
    areas of memory. The location and contents of any differing bytes are
    displayed in the following format:

    address1  byte1  byte2  address2

    If no differences are found, the DEBUG prompt returns.

    The range parameter specifies the starting and ending addresses or
    the starting address and length in bytes of the first area of memory
    to be compared. The address parameter specifies the beginning address
    of the second area of memory to be compared. If a segment is not
    included in range or address, DEBUG uses DS.

Example

    To compare the 64 bytes beginning at CS:CE00H with the 64 bytes
    beginning at CS:CF0AH, type

    -C CS:CE00 CE3F CS:CF0A  <Enter>

    or

    -C CS:CE00 L40 CS:CF0A  <Enter>

    If any differences are found, DEBUG displays them in the following
    format:

    2124:CE06  00  FF  2124:CF10



DEBUG: D
Display Memory


Purpose

    Displays the contents of an area of memory in hexadecimal and ASCII
    format.

Syntax

    D [range]

    where:

    range      is the starting and ending addresses or the starting
                address and length of the area to be displayed.

Description

    The Display Memory (D), or Dump, command displays the contents of a
    specified range of memory addresses in hexadecimal and ASCII format.

    The range parameter gives the starting and ending addresses or the
    starting address and length in bytes of the memory to be displayed. If
    range does not include a segment, DEBUG uses DS.

    If range is omitted the first time the D command is used, the display
    starts at the target program's CS:IP registers. If range was
    specified in a preceding D command, the memory address following the
    last address displayed by that command is used. If a length is not
    explicitly stated in a D command, 128 bytes are displayed.

    Each line displays a segment and offset, followed by the contents of
    16 bytes of memory represented as hexadecimal values and separated by
    spaces (except the eighth and ninth values, which are separated by a
    dash), followed by the ASCII character equivalents (if any) of the
    same 16 bytes. In the ASCII portion, nonprinting characters are
    displayed as periods.

Examples

    To display the contents of the 128 bytes of memory beginning at
    7F00:0100H, type

    -D 7F00:0100  <Enter>

    The contents of the memory addresses are displayed in the following
    format:

7F00:0100  20 64 65 76 69 63 65 0D-0A 00 60 39 0D 0A 00 7C  device...'9...|
7F00:0110  39 08 20 08 00 81 39 04-1B 5B 32 4A 42 BD 11 44 9. ...9..[2JB=.D
7F00:0120  2E 26 45 AF 11 47 B3 11-48 A5 11 4C B8 11 4E D3 .&E/.G3.H%.L8.NS
7F00:0130  11 50 DF 11 51 AB 11 54-DF 1E 56 37 11 5F 9F 16 .P_.Q+.T_.V7._..
7F00:0140  24 C0 11 00 03 4E 4F 54-C1 07 0A 45 52 52 4F 52 $@...NOTA..ERROR
7F00:0150  4C 45 56 45 4C 85 08 05-45 58 49 53 54 18 08 00 LEVEL...EXIST...
7F00:0160  03 44 49 52 03 91 0C 06-52 45 4E 41 4D 45 01 C0 .DIR....RENAME.@
7F00:0170  0F 03 52 45 4E 01 C0 0F-05 45 52 41 53 45 01 68 ..REN.@..ERASE.h

    To view the next 128 bytes of memory, type

    -D  <Enter>

    In this case, the contents of memory addresses 7F00:0180H through
    7F00:01FFH are displayed.



DEBUG: E
Enter Data


Purpose

    Enters data into memory.

Syntax

    E address [list]

    where:

    address    is the first memory location for data entry.

    list       specifies the data to be entered into successive bytes of
                memory, starting at address.

Description

    The Enter Data (E) command allows data to be entered into successive
    memory locations. The data can be entered in either hexadecimal or
    ASCII format. Data previously stored in the specified locations is
    lost.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, DEBUG uses DS. The address is
    incremented for each byte of data stored.

    The list parameter is one or more hexadecimal byte values and/or
    strings, separated by spaces, commas, or tab characters. Strings must
    be enclosed within single or double quotation marks, and case is
    significant within a string.

    If list is included in the command line, the changes to memory are
    made unless an error is detected in the command line, in which case an
    error message is displayed and the E command is terminated. If list
    is omitted from the command line, the user is prompted byte by byte
    for data to be entered into memory, starting at address. The current
    contents of a byte are displayed, followed by a period. A new value
    for that byte can be entered as one or two hexadecimal digits (extra
    characters are ignored) or the contents can be left unchanged.
    Pressing the spacebar displays the contents of the next byte. Entering
    a minus sign or hyphen character (-) instead of pressing the spacebar
    displays the contents of the previous byte. A maximum of 8 bytes can
    be entered on each input line; a new line is begun each time an 8-byte
    boundary is crossed. Pressing the Enter key without pressing the
    spacebar or entering any data terminates data entry.

    Text strings can be entered only by using the list parameter; they
    cannot be entered in response to an address prompt.

Examples

    To store the byte values 00H, 0DH, and 0AH in the three bytes
    beginning at DS:1FB3H, type

    -E 1FB3 00 0D 0A  <Enter>

    To store the string MAIN MENU into memory beginning at address
    ES:0C14H, type

    -E ES:C14 "MAIN MENU"  <Enter>



DEBUG: F
Fill Memory


Purpose

    Stores a repetitive data pattern in an area of memory.

Syntax

    F range list

    where:

    range      is the starting and ending addresses or starting address
                and length of the memory to be filled.

    list       is the data to be entered.

Description

    The Fill Memory (F) command fills an area of memory with the data from
    a list. The data can be entered in either hexadecimal or ASCII format.
    Any data previously stored at the specified locations is lost. If an
    error message is displayed, the original values in memory remain
    unchanged.

    The range parameter specifies the starting and ending addresses or
    the starting address and hexadecimal length in bytes of the area of
    memory to be filled. If range does not specify a segment, DEBUG uses
    DS.

    The list parameter specifies one or more hexadecimal byte values
    and/or strings, separated by spaces, commas, or tab characters.
    Strings must be enclosed in single or double quotation marks, and case
    is significant within a string.

    If the area to be filled is larger than the data list, the list is
    repeated as often as necessary to fill the area. If the data list is
    longer than the area of memory to be filled, it is truncated to fit
    into the area.

Examples

    To fill the area of memory from DS:0B10H through DS:0B4FH with the
    value 0E8H, type

    -F B10 B4F E8  <Enter>

    or

    -F B10 L40 E8  <Enter>

    To fill the 16 bytes of memory beginning at address CS:1FA0H by
    replicating the 2-byte sequence 0DH 0AH, type

    -F CS:1FA0 1FAF 0D 0A  <Enter>

    or

    -F CS:1FA0 L10 0D 0A  <Enter>

    To fill the area of memory from ES:0B00H through ES:0BFFH by
    replicating the text string BUFFER, type

    -F ES:B00 BFF "BUFFER"  <Enter>

    or

    -F ES:B00 L100 "BUFFER"  <Enter>



DEBUG: G
Go


Purpose

    Transfers control from DEBUG to the program being debugged.

Syntax

    G [=address] [break0 [... break9]]

    where:

    address                is the location DEBUG begins execution.

    break0...break9        specify from 1 to 10 temporary breakpoints.

Description

    The Go (G) command transfers control from DEBUG to the program being
    debugged. If no breakpoints are set, the program executes until it
    crashes or finishes, in which latter case the message Program
    terminated normally is displayed and control returns to DEBUG. (After
    this message is displayed, the program may need to be reloaded before
    it can be executed again.)

    The address parameter can specify any location in memory. If no
    segment is specified, DEBUG uses the target program's CS register. If
    address is omitted, DEBUG transfers to the current address in the
    target program's CS:IP registers. An equal sign (=) must precede
    address to distinguish it from the breakpoints break0...break9.

    The parameters break0...break9 are addresses that represent from 1 to
    10 temporary breakpoints that can be set as part of the G command. A
    breakpoint is an address at which execution stops. Breakpoints can be
    placed in any order, because execution stops at the first breakpoint
    address encountered, regardless of the position of that breakpoint in
    the list. Each breakpoint address must contain the first byte of an
    8086 opcode. DEBUG installs breakpoints by replacing the first byte of
    the machine instruction at each breakpoint address with an INT 03H
    instruction (opcode 0CCH). If the program encounters a breakpoint,
    execution is suspended and control returns to DEBUG. DEBUG then
    restores the original machine code to the breakpoint addresses;
    displays the contents of the registers, the status of the flags, and
    the instruction pointed to by CS:IP; and displays the DEBUG prompt. If
    the program executes to completion without encountering any of the
    breakpoints or stops for any reason other than because it encountered
    a breakpoint, DEBUG does not replace the INT 03H instructions with the
    original machine code, and the Load File or Sectors (L) command must
    be used to reload the original program.

    The G command requires that the target program's SS:SP registers point
    to a valid stack that has at least 6 bytes of stack space available.
    When the G command is executed, it pushes the target program's flags
    and CS and IP registers onto the stack and then transfers control to
    the target program with an IRET instruction. Thus, if the target
    program's stack is not valid or is too small, the system may
    crash.

Examples

    To begin execution of the program in DEBUG's buffer at location
    CS:110AH and set breakpoints at CS:12FCH and CS:1303H, type

    -G =110A 12FC 1303  <Enter>

    To resume execution of the program after a breakpoint has been
    encountered and control has been returned to DEBUG, type

    -G  <Enter>

Messages

    bp Error
    More than 10 breakpoints were specified in a G command. The command
    must be entered again with 10 or fewer breakpoints.

    Program terminated normally
    No breakpoints were encountered and the target program executed to
    completion. If breakpoints were set, the original program should be
    restored with the L command.



DEBUG: H
Perform Hexadecimal Arithmetic


Purpose

    Displays the sum and difference of two hexadecimal numbers.

Syntax

    H value1 value2

    where:

    value1 and value2     are any two hexadecimal numbers from
                        0 through FFFFH.

Description

    The Perform Hexadecimal Arithmetic (H) command displays the sum and
    the difference of two 16-bit hexadecimal numbers--that is, the result
    of the operations value1+value2 and value1-value2. If value2 is
    greater than value1, the difference of the two values is displayed as
    a two's complement number. This command is convenient for quickly
    calculating addresses and other values during an interactive debugging
    session.

Examples

    To display the sum and the difference of the values 4B03H and 104H,
    type

    -H 4B03 104  <Enter>

    This produces the following display:

    4C07  49FF

    If the addition produces an overflow, the four least significant
    digits are displayed. For example, the command line

    -H FFFF 2  <Enter>

    produces the following display:

    0001 FFFD

    If the second number is bigger than the first, the difference is
    displayed in two's complement form. For example, the command
    line

    -H 1 2  <Enter>

    produces the following display:

    0003 FFFF



DEBUG: I
Input from Port


Purpose

    Reads and displays 1 byte from an input/output (I/O) port.

Syntax

    I port

    where:

    port      is an I/O port address from 0 through FFFFH.

Description

    The Input from Port (I) command reads the specified I/O port address
    and displays the data as a two-digit hexadecimal number.

    Warning: The I command should be used with caution because it
    directly accesses the computer hardware and no error checking is
    performed. Input operations directed to the ports assigned to some
    peripheral device controllers may interfere with the proper operation
    of the system. If no device has been assigned to the specified I/O
    port or if the port is write-only, the value displayed by an I command
    is unreliable.

Example

    To read and display the contents of I/O port 10AH, type

    -I 10A  <Enter>

    An example of the output of this command is

    FF



DEBUG: L
Load File or Sectors


Purpose

    Loads a file or individual sectors from a disk into DEBUG's
    memory.

Syntax

    L [address]

    or

    L address drive start number

    where:

    address    is the memory location for the data to be read from the
                disk.

    drive      is the number of the disk drive to read (0 = drive A, 1 =
                drive B, 2 = drive C, and so on).

    start      is the hexadecimal number of the first logical sector to
                load (0-FFFFH).

    number     is the hexadecimal number of consecutive sectors to load
                (0-FFFFH).

Description

    The Load File or Sectors (L) command loads a file or individual
    sectors from a disk. When the L command is entered without parameters
    or with only an address, the file specified in the DEBUG command line
    or the one in the most recent Name File or Command-Tail Parameters (N)
    command line is loaded from the disk into memory. If no segment is
    specified in address, DEBUG uses CS. If the file's extension is .EXE,
    the file is placed in DEBUG's target program buffer at the load
    address specified in the .EXE file's header. If the file's extension
    is .COM, the file is loaded at offset 100H. (If for some reason an
    address other than 100H is entered for a .EXE or .COM file, an error
    message is displayed; if the address is 100H, the specification is
    ignored.) The length of the file or, in the case of a .EXE file, the
    actual length of the program (the length of the file minus the header)
    is placed in the target program's BX and CX registers, with the most
    significant 16 bits in register BX.

    The L command can also be used to bypass the MS-DOS file system and
    directly access logical sectors on the disk. The memory address
    (address), disk drive number (drive), starting logical sector number
    (start), and number of sectors to load (number) must all be specified
    in the command line.

    Note: The L command should not be used to access logical sectors on
    network drives.

Examples

    To load the file specified in the DEBUG command line or in the most
    recent N command into DEBUG's target program buffer, type

    -L  <Enter>

    To load eight sectors from drive B, starting at logical sector 0, to
    memory location CS:0100H, type

    -L 100 1 0 8  <Enter>

Messages

    Disk error reading drive <FI>X
    The specified drive does not exist or the disk in the specified drive
    is defective.

    File not found
    The file specified in the most recent N command cannot be found.



DEBUG: M
Move (Copy) Data


Purpose

    Copies the contents of one area of memory to another.

Syntax

    M range address

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                copied.

    address    is the first byte in which the copied data will be placed.

Description

    The Move (Copy) Data (M) command copies data from one memory location
    to another without altering the data in the original location. If the
    source and destination areas overlap, the data is copied so that the
    resulting copy is correct; the data in the original location is
    changed where the two areas overlap.

    The range parameter specifies either the starting and ending
    addresses or the starting address and length of the memory to be
    copied. The address parameter is the first byte in which the copy
    will be placed. If range does not contain an explicit segment, DEBUG
    uses DS; if address does not contain a segment, DEBUG uses the
    segment used for range.

Example

    To copy the data in locations DS:0800H through DS:08FFH to locations
    DS:0900H through DS:09FFH, type

    -M 800 8FF 900  <Enter>

    or

    -M 800 L100 900  <Enter>



DEBUG: N
Name File or Command-Tail Parameters


Purpose

    Inserts filenames and/or switches into the simulated program segment
    prefix (PSP).

Syntax

    N parameter [parameter...]

    where:

    parameter       is one or more filenames or switches to be placed in
                    the simulated PSP.

Description

    The Name File or Command-Tail Parameters (N) command is used to enter
    one or more parameters into the simulated PSP that is built at the
    base of the buffer holding the program to be debugged. The N command
    can also be used before the Load File or Sectors (L) and Write File or
    Sectors (W) commands to name the file to be read from or written to a
    disk.

    The count of the characters following the N command is placed at
    DS:0080H in the simulated PSP, and the characters themselves are
    copied into the PSP starting at offset 81H. The string is terminated
    by a carriage return (0DH), which is not included in the count. If the
    first and second parameters follow the naming conventions for MS-DOS
    files, they are parsed into the default file control blocks (FCBs) in
    the simulated PSP at offsets 5CH and 6CH, respectively. (Switches
    specified as parameters are stored in the PSP starting at offset 81H
    along with the rest of the command line but are not included in the
    FCBs.)

    If the N command line contains only one filename, any parameters
    placed in the default FCBs by a previous N command are destroyed. If
    the drive specified with the first filename parameter is invalid, the
    AL register is set to 0FFH. If the drive specified with the second
    filename parameter is invalid, the AH register is set to 0FFH. The
    existence of a file specified with the N command is not verified until
    it is loaded with the L command.

Examples

    Assume that DEBUG was started without specifying the name of a target
    program in the command line. To load the program CLEAN.COM for
    execution under the control of DEBUG, use the N and L commands
    together as follows:

    -N CLEAN.COM  <Enter>
    -L  <Enter>

    Then, to place the parameter MYFILE.DAT in the simulated PSP's command
    tail and parse MYFILE.DAT into the first default FCB, type

    -N MYFILE.DAT  <Enter>

    Finally, to execute the program CLEAN.COM, type

    -G  <Enter>

    The result is the same as if the CLEAN.COM program had been run from
    the MS-DOS command level with the entry

    C>CLEAN MYFILE.DAT  <Enter>

    except that the program is executing under the control of DEBUG and
    within DEBUG's memory buffer.



DEBUG: O
Output to Port


Purpose

    Writes 1 byte to an input/output (I/O) port.

Syntax

    O port byte

    where:

    port       is an I/O port address from 0 through FFFFH.

    byte       is a value from 0 through 0FFH to be written to the I/O
                port.

Description

    The Output to Port (O) command writes 1 byte of data to the specified
    I/O port address. The data value must be in the range 00H through
    0FFH.

    Warning: The O command should be used with caution because it
    directly accesses the computer hardware and no error checking is
    performed. Attempts to write to some port addresses, such as those for
    ports connected to peripheral device controllers, timers, or the
    system's interrupt controller, may cause the system to crash or damage
    data stored on disk.

Example

    To write the value C8H to I/O port 10AH, type

    -O 10A C8  <Enter>



DEBUG: P
Proceed Through Loop or Subroutine


Purpose

    Executes a loop, repeated string instruction, software interrupt, or
    subroutine call to completion.

Syntax

    P [=address] [number]

    where:

    address    is the location of the first instruction to be executed.

    number     is the number of instructions to execute.

Description

    The Proceed Through Loop or Subroutine (P) command transfers control
    from DEBUG to the target program. The program executes without
    interruption until the loop, repeated string instruction, software
    interrupt, or subroutine call at address is completed or until the
    specified number of machine instructions have been executed. Control
    then returns to DEBUG, and the contents of the target program's
    registers and the status of the flags are displayed.

    If the address parameter does not include an explicit segment, DEBUG
    uses the target program's CS register; if address is omitted
    entirely, execution begins at the address specified by the target's
    CS:IP registers. The address parameter must be preceded by an equal
    sign (=) to distinguish it from number.

    If the instruction at address is not a loop, repeated string
    instruction, software interrupt, or subroutine call, the P command
    functions just like the Trace Program Execution (T) command. The
    optional number parameter specifies the number of instructions to be
    executed before control returns to DEBUG. If number is omitted, DEBUG
    executes only one instruction. After each instruction is executed,
    DEBUG displays the contents of the target program's registers, the
    status of the flags, and the next instruction to be executed.

    Warning: The P command cannot be used to trace through ROM.

Example

    Assume that the target program's location CS:143FH contains a CALL
    instruction. To execute the subroutine that is the destination of CALL
    and then return control to DEBUG, type

    -P =143F  <Enter>



DEBUG: Q
Quit


Purpose

    Ends a DEBUG session.

Syntax

    Q

Description

    The Quit (Q) command terminates the DEBUG program and returns control
    to MS-DOS or the command shell that invoked DEBUG. Any changes to a
    program or other file that were not saved on disk with the Write File
    or Sectors (W) command are lost.

Example

    To exit DEBUG, type

    -Q  <Enter>



DEBUG: R
Display or Modify Registers


Purpose

    Displays the contents of one or all registers and the status of the
    CPU flags and allows them to be modified.

Syntax

    R [register]

    where:

    register    is the two-character name of an Intel 8086/8088 register
                from the following list:

                AX BX CX DX SP BP SI DI
                DS ES SS CS IP PC

                or the character F, which specifies the CPU flags.

Description

    The Display or Modify Registers (R) command displays the target
    program's register contents and the status of the CPU flags and allows
    them to be modified.

    If R is entered without a register parameter, the contents of all
    registers and the status of the CPU flags are displayed, followed by a
    disassembly of the machine instruction currently pointed to by the
    target program's CS:IP registers.

    If register is included in the R command line, the contents of the
    specified register are displayed; then DEBUG prompts with a colon
    character (:) for a new value. The value is entered by typing one to
    four hexadecimal digits and then pressing the Enter key. Pressing the
    Enter key without entering any values leaves the register contents
    unchanged.

    Note: The register name PC is not fully supported in some versions of
    DEBUG, so the register name IP should be used instead.

    Specifying the character F instead of a register name causes DEBUG to
    display the status of the program's CPU flags as two-character codes
    from the following list:

╓┌───────────────────────┌───────────────────┌───────────────────────────────╖
    Flag Name          Value If Set (1)    Value If Clear (0)
    ──────────────────────────────────────────────────────────────────────
    Overflow           OV (Overflow)       NV (No Overflow)
    Direction          DN (Down)           UP (Up)
    Interrupt          EI (Enabled)        DI (Disabled)
    Sign               NG (Minus)          PL (Plus)
    Zero               ZR (Zero)           NZ (Not Zero)
    Aux Carry          AC (Aux Carry)      NA (No Aux Carry)
    Parity             PE (Even)           PO (Odd)
    Carry              CY (Carry)          NC (No Carry)

    After displaying the flag values, DEBUG displays a hyphen (-)
    prompt on the same line. Any or all flags can then be altered by
    typing one or more codes (in any order and optionally separated by
    spaces) from the list above and pressing the Enter key. Pressing the
    Enter key without entering any codes leaves the status of the flags
    unchanged.

Examples

    To display the contents of the target program's CPU registers and the
    status of the CPU flags, followed by the disassembled mnemonic for the
    next instruction to be executed (pointed to by CS:IP), type

    -R  <Enter>

    This produces a display in the following format:

    AX=0000  BX=0000  CX=00A1  DX=0000  SP=FFFE  BP=0000 SI=0000  DI=0000
    DS=19A5  ES=19A5  SS=19A5  CS=19A5  IP=0100   NV UP EI PL NZ NA PO NC
    19A5:0100 BF8000       MOV   DI,0080

    To display the value of the target program's BX register, type

    -R BX  <Enter>

    If BX contains 0200H, for example, DEBUG displays that value and then
    issues a prompt in the form of a colon:

    BX 0200
    :

    The contents of BX can then be altered by typing a new value and
    pressing the Enter key or left unchanged by pressing the Enter key
    alone.

    To set the direction and carry flags, first type

    -R F  <Enter>

    DEBUG displays the flag values, followed by a hyphen (-) prompt:

    NV UP EI PL NZ NA PO NC  -

    The direction and carry flags can then be set by entering

    -DN CY  <Enter>

Messages

    bf Error
    Bad flag: An invalid code for a CPU flag was entered.

    br Error
    Bad register: An invalid register name was entered.

    df Error
    Double flag: Two values for the same CPU flag were entered in the same
    command.



DEBUG: S
Search Memory


Purpose

    Searches memory for a pattern of 1 or more bytes.

Syntax

    S range list

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area to be searched.

    list       is 1 or more consecutive byte values and/or a string to be
                searched for.

Description

    The Search Memory (S) command searches a designated range of memory
    for a specified list of consecutive byte values and/or a text string.
    The starting address of each set of matching bytes is displayed. The
    contents of the searched area are not altered.

    The range parameter specifies the starting and ending addresses or
    the starting address and length in bytes of the area to be searched.
    If a segment is not included in range, DEBUG uses DS. If a segment is
    specified for the starting address, DEBUG uses the same segment for
    the ending address. If a starting address and length in bytes is
    specified, the starting address plus the length minus 1 cannot exceed
    FFFFH.

    The list parameter specifies one or more consecutive hexadecimal byte
    values and/or a string to be searched for, separated by spaces,
    commas, or tab characters. Strings must be enclosed within single or
    double quotation marks, and case is significant within a string.

Examples

    To search for the string Copyright in the area of memory from
    DS:0000H through DS:1FFFH, type

    -S 0 1FFF 'Copyright'  <Enter>

    or

    -S 0 L2000 "Copyright"  <Enter>

    If matches are found, DEBUG displays the starting address of
    each:

    20A8:0910
    20A8:094F
    20A8:097C

    To search for the byte sequence 3BH 06H in the area of memory from
    CS:0100H through CS:12A0H, type

    -S CS:100 12A0 3B 06  <Enter>

    or

    -S CS:100 L11A1 3B 06  <Enter>



DEBUG: T
Trace Program Execution


Purpose

    Executes one or more instructions, displaying the CPU status after
    each instruction.

Syntax

    T [=address] [number]

    where:

    address    is the location of the first instruction to be executed.

    number     is the number of machine instructions to be executed.

Description

    The Trace Program Execution (T) command executes one or more
    instructions, starting at the specified address, and after each
    instruction displays the contents of the CPU registers, the status of
    the flags, and the instruction pointed to by CS:IP.

    Warning: The T command should not be used to execute any instructions
    that change the contents of the Intel 8259 interrupt mask (ports 20H
    and 21H on the IBM PC and compatibles) or to trace calls made to MS-
    DOS through Interrupt 21H. The Go (G) command should be used
    instead.

    The address parameter points to the first instruction to be executed.
    If address does not include a segment, DEBUG uses the target
    program's CS register; if address is omitted entirely, execution
    begins at the address specified by the target program's CS:IP
    registers. If address is included, it must be preceded by an equal
    sign (=) to distinguish it from number.

    The number parameter specifies the hexadecimal number of instructions
    to be executed before the DEBUG prompt is redisplayed (default = 1).
    Pressing Ctrl-C or Ctrl-Break interrupts execution of a sequence of T
    instructions. Consecutive instructions can then be executed
    individually by entering T commands with no parameters. Pressing Ctrl-
    S suspends execution and pressing any key then resumes the trace.

    Note: The T command can be used to trace through ROM.

Example

    To execute one instruction at location CS:1A00H and then return
    control to DEBUG, displaying the contents of the CPU registers and the
    status of the flags, type

    -T =1A00  <Enter>



DEBUG: U
Disassemble (Unassemble) Program


Purpose

    Disassembles machine instructions into assembly-language mnemonics.

Syntax

    U [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the machine code to be
                disassembled.

Description

    The Disassemble (Unassemble) Program (U) command translates machine
    instructions into assembly-language mnemonics.

    The range parameter specifies the starting and ending addresses or
    starting address and length in bytes of the machine instructions to be
    disassembled. If range does not specify a segment, DEBUG uses CS.
    Note that if the starting address does not fall on an 8086 instruction
    boundary, the disassembly will be incorrect.

    If range does not include a length or ending address, 32 (20H) bytes
    of memory are disassembled beginning at the specified starting
    address. If range is omitted, 32 bytes of memory are disassembled,
    starting at the address following the last instruction disassembled by
    the previous U command. If a U command has not been used before and
    range is omitted, disassembly begins at the address specified by the
    target program's CS:IP registers.

    Note: The actual number of bytes displayed may vary slightly from the
    amount specified in range or from the default of 32 bytes because the
    length of instructions may vary. Also, the U command does not
    understand instructions specific to the 80186, 80286, and 80386
    microprocessors. It displays such instructions as DBs.

    Successive 32-byte fragments of code can be disassembled by entering
    additional U commands without parameters.

Example

    To disassemble 8 bytes of machine instructions starting at CS:0100H,
    type

    -U 100 107  <Enter>

    or

    -U 100 L8  <Enter>



DEBUG: W
Write File or Sectors


Purpose

    Writes a file or individual sectors to disk.

Syntax

    W [address]

    or

    W address drive start number

    where:

    address    is the first memory location of the data to be written.

    drive      is the number of the destination disk drive (0 = drive A,
                1 = drive B, 2 = drive C, and so on).

    start      is the number of the first logical sector to write
                (0-FFFFH).

    number     is the number of consecutive sectors to be written
                (0-FFFFH).

Description

    The Write File or Sectors (W) command transfers a file or individual
    sectors from memory to the disk.

    When the W command is entered without parameters or with only an
    address, the number of bytes specified by the contents of registers
    BX:CX is written from memory into the file named in the most recently
    used Name File or Command-Tail Parameters (N) command or the first
    file specified in the DEBUG command line if the N command has not been
    used. Files with a .EXE or .HEX extension cannot be written with the
    DEBUG W command.

    Note: If a Trace Program Execution (T), Go (G), or Proceed Through
    Loop or Subroutine (P) command has been used or the contents of the BX
    or CX registers have been changed, the contents of BX:CX must be
    restored before the W command is used.

    When address is not included in the command line, the target
    program's CS:0100H is assumed.

    The W command can also be used to bypass the MS-DOS file system and
    directly access logical sectors on the disk. The memory address
    (address), disk drive number (drive), starting logical sector number
    (start), and number of sectors to be written (number) must all be
    provided in the command line in hexadecimal format. The W command
    should not be used to write sectors on network drives.

    Warning: Extreme caution must be used with the W command. The disk's
    file structure can easily be damaged if the wrong parameters are
    entered.

Example

    Assume that the interactive Assemble Machine Instructions (A) command
    was used to create a program in DEBUG's memory buffer that is 32 (20H)
    bytes long, beginning at offset 0100H. This program can be written to
    the file QUICK.COM by using the DEBUG Name File or Command-Tail
    Parameters (N), Display or Modify Registers (R), and Write File or
    Sectors (W) commands sequentially. First, use the N command to specify
    the name of the file to be written:

    -N QUICK.COM  <Enter>

    Next, use the R command to set registers BX and CX to the length to be
    written. Register BX contains the upper, or most significant half, of
    the length, whereas register CX contains the lower, or least
    significant half. Type

    -R CX  <Enter>

    DEBUG displays the contents of register CX and prompts with a colon
    (:). Enter the length after the prompt:

    :20  <Enter>

    To use the R command again to set register BX to zero, type

    -R BX  <Enter>

    followed by

    :0  <Enter>

    Finally, to create the disk file QUICK.COM and write the program into
    it, type

    -W  <Enter>

    DEBUG responds:

    Writing 0020 bytes

Messages

    EXE and HEX files cannot be written
    Files with a .EXE or .HEX extension cannot be written to disk with the
    W command.

    Writing nnnn bytes
    After a successful write operation, DEBUG displays in hexadecimal
    format the number of bytes written to disk.



SYMDEB
Symbolic Debugger


Purpose

    The Symbolic Debugger (SYMDEB) allows a file to be loaded, examined,
    altered, and written back to disk. If the file contains a program, the
    program can be disassembled, modified, traced one instruction at a
    time, or executed at full speed with breakpoints. SYMDEB can also be
    used to read, modify, and write absolute disk sectors.

    The SYMDEB utility is supplied with the Microsoft Macro Assembler
    (MASM) versions 4.0 and earlier. This documentation describes SYMDEB
    version 4.0.

Syntax

    SYMDEB

    or

    SYMDEB [options] [symfile [symfile...]] [filename [parameter...]]

    where:

    symfile        is the name of a symbol file created with the MAPSYM
                    utility (extension = .SYM).

    filename       is the name of the binary or executable program file
                    to be debugged.

    parameter      is a command-line parameter required by the program
                    being debugged.

    options        is one or more of the following switches. Switches
                    can be either upper-case or lowercase and can be
                    preceded by a dash (-) instead of a forward
                    slash (/).

                    /I           (IBM) specifies that the computer is IBM
                                compatible.

                    /K           enables the interactive breakpoint key
                                (Scroll Lock).

                    /N           enables the use of nonmaskable interrupt
                                break systems on IBM-compatible
                                computers (requires special hardware).

                    /S           enables the Screen Swap (\) command on
                                IBM-compatible computers  (the /I
                                switch is also required).

                    /"commands"  specifies one or more SYMDEB commands,
                                separated by semicolons and enclosed in
                                quotation marks.

Description

    The SYMDEB commands and capabilities are a superset of those in DEBUG.
    SYMDEB is also able to load and interpret special symbol files that
    correlate line numbers, symbols, and memory addresses. With the aid of
    such files, SYMDEB enables the user to specify addresses with labels,
    variable names, and expressions, rather than only with absolute
    hexadecimal addresses. SYMDEB's command repertoire also includes I/O
    redirection commands, floating-point number entry and display
    commands, and source-code display capabilities that are not present in
    DEBUG.

    The SYMDEB command line typically includes the filename parameter,
    which is the name of an executable program (with the extension .COM or
    .EXE) to be loaded into SYMDEB's memory buffer. Files with the
    extension .EXE are loaded in a manner compatible with the MS-DOS
    loader. Files with the extension .HEX are converted to binary images
    and loaded at the internally specified address. All other files are
    assumed to be direct memory images and are read directly into memory
    starting at offset 100H. If SYMDEB is entered by itself, no file
    information is read into memory. An appropriate program segment prefix
    (PSP) is synthesized at the head of SYMDEB's buffer for use by the
    target program; the PSP includes a command tail at offset 80H and
    default file control blocks (FCBs) at offsets 5CH and 6CH, constructed
    from the optional parameters following filename. If necessary,
    contents of the file are relocated so that the file is ready to
    execute.

    The command line can also contain the names of one or more symfiles,
    symbol files that contain symbol and line-number information for the
    object modules that constitute the program being debugged. A symbol
    file is created with the MAPSYM utility from a map file produced by
    the Microsoft Object Linker (LINK). A symbol file always has the
    extension .SYM. See PROGRAMMING UTILITIES: MAPSYM; LINK.

    The four command-line switches /I, /K, /N, and /S provide SYMDEB with
    information about the computer on which the utility is running. The /I
    switch is used when the computer is IBM compatible; this causes SYMDEB
    to take full advantage of special hardware features such as the 8259
    Programmable Interrupt Controller or the memory-mapped video display.
    The /K switch enables the interactive breakpoint key (Scroll Lock),
    which can then be pressed at any time to interrupt a program that is
    being traced under the control of SYMDEB.

    Note: The /K switch is not necessary on an IBM PC/AT, because the Sys
    Req key is always active as an interactive break key.

    The /N switch enables the use of the nonmaskable interrupt as a
    breakpoint signal on IBM-compatible computers; this interrupt is
    triggered by hardware-assisted debugging packages such as Periscope
    and Atron Corporation's Software Probe. The /S switch enables the
    Screen Swap (\) command, which allows the output from the program
    being traced to be maintained and displayed on demand on a virtual
    screen separate from the SYMDEB commands and messages.

    Note: The /I, /N, and /S switches are unnecessary on personal
    computers built by IBM Corporation; SYMDEB automatically enables the
    capabilities provided by those switches when SYMDEB finds the IBM
    copyright notice in the machine's ROM.

    After SYMDEB and any files named in the command line are loaded,
    SYMDEB displays its special prompt character, a hyphen (-), and awaits
    a command. SYMDEB commands consist of one or two letters, usually
    followed by one or more parameters. SYMDEB treats uppercase and
    lowercase characters equivalently except when they are contained in
    strings enclosed within single or double quotation marks. SYMDEB does
    not execute commands until the Enter key is pressed.

    The SYMDEB commands discussed in this section are

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
──────────────────────────────────────────────────────────────────────
    A            Assemble machine instructions.
    BC           Clear breakpoints.
    BD           Disable breakpoints.
    BE           Enable breakpoints.
    BL           List breakpoints.
    BP           Set breakpoints.
    C            Compare memory areas.
    D            Display memory.
    DA           Display ASCII.
    DB           Display bytes.
    DD           Display doublewords.
    DL           Display long reals.
    DS           Display short reals.
    DT           Display 10-byte reals.
    DW           Display words.
    E            Enter data.
    EA           Enter ASCII string.
    EB           Enter bytes.
    ED           Enter doublewords.
    EL           Enter long reals.
    ES           Enter short reals.
    ET           Enter 10-byte reals.
    EW           Enter words.
    F            Fill memory.
    G            Go execute program.
    H            Perform hexadecimal arithmetic.
    I            Input from port.
    K            Perform stack trace.
    L            Load file or sectors.
    M            Move (copy) data.
    N            Name file or command-tail parameters.
    O            Output to port.
    P            Proceed through loop or subroutine.
    Q            Quit debugger.
    R            Display or modify registers.
    S            Search memory.
    S+           Enable source display mode.
    S-           Disable source display mode.
    S&           Enable source and machine code display mode.
    T            Trace program execution.
    U            Disassemble (unassemble) program.
    V            View source code.
    W            Write file or sectors.
    X            Examine symbol map.
    XO           Open symbol map.
    Z            Set symbol value.
    <            Redirect SYMDEB input.
    >            Redirect SYMDEB output.
    =            Redirect SYMDEB input and output.
    {            Redirect target program input.
    }            Redirect target program output.
    ~            Redirect target program input and output.
    \            Swap screen.
    .            Display source line.
    ?            Help or evaluate expression.
    !            Escape to shell.
    *            Enter comment.

    One or more SYMDEB commands, separated by semicolons and enclosed in
    double quotation marks, can be included in the original SYMDEB command
    line in the form /"commands" (for example, /"r;d;q"). These commands,
    which must precede the filename of the program being debugged, are
    carried out immediately when SYMDEB is loaded. (This is a convenient
    way to invoke SYMDEB and execute a series of batch commands.)

    The parameters for a SYMDEB command include symbols; line numbers;
    addresses; ranges; and 8-bit, 16-bit, 32-bit, or floating-point
    values, expressions, and lists. Multiple parameters can be separated
    by spaces, tabs, or commas.

    A symbol is a name that represents a register, an absolute value, a
    segment address, or a segment offset. A symbol consists of one or more
    characters but always begins with a letter, an underscore (_), a
    question mark (?), an at sign (@), or a dollar sign ($). The names of
    the various 8086/8088/80286 registers and CPU flags are built into
    SYMDEB and can be used at any time. Other symbols can be used only
    when one or more symbol files have been loaded in conjunction with the
    program to be debugged.

    Note: SYMDEB regards symbols whose spellings differ only in case as
    the same symbol. A unique symbol name that does not conflict with
    programming instructions, register names, or hexadecimal numbers
    should always be used.

    In MASM programs, symbols must be declared PUBLIC in the source code
    in order to be accessible during debugging (except for segment and
    group names, which are PUBLIC by default). In programs compiled with
    the current versions of Microsoft C, FORTRAN, and Pascal, all symbols
    are passed through for debugging if the proper compilation switch is
    used; however, familiarity with the compiler's particular naming
    conventions is necessary (for example, the Microsoft C Compiler adds
    an underscore character to the beginning of every symbol).

    A line number is a combination of decimal numbers, filenames, and
    symbols that specifies a unique line of text in a program source file.
    Line numbers always start with a dot character (.) and take one of the
    following forms:

    .[filename:]linenumber
    .+displacement
    .-displacement
    .symbol[+displacement]
    .symbol[-displacement]

    The second and third variations specify a line relative to the current
    line number; the fourth and fifth specify a line number relative to a
    designated symbol. Line numbers can be used only with programs
    developed with compilers that generate line-number information.
    Programs developed with MASM or an incompatible compiler cannot
    generate line numbers.

    An address identifies a unique location in memory. An address can be a
    simple offset or a complete address consisting of two 16-bit values in
    the form segment:offset. Each component can be a valid symbol
    (including CS, DS, ES, or SS, in the case of segments), a 16-bit
    hexadecimal number in the range 0 through FFFFH, or a symbol plus or
    minus a displacement. When the segment portion of an address is
    absent, the segment specified in the previous instance of the same
    command is used; if no segment was previously specified, SYMDEB uses
    DS unless an A, G, L, P, T, U, or W command is used, in which case
    SYMDEB uses CS.

    A range specifies an area of memory or a number of data items and can
    be expressed as either two addresses or a starting address and a
    length. A length is represented by the letter L followed by a
    hexadecimal value in the range 0 through FFFFH. The meaning of the
    length varies with the SYMDEB command used: The length can signify a
    number of bytes, words, doublewords, real numbers, machine
    instructions, or source-code lines. If a command requires a range and
    the ending address is not supplied, SYMDEB usually assumes 128
    bytes.

    A value represents an integral number and is a combination of one or
    more digits. The default base for values is hexadecimal, except in the
    case of floating-point numbers, but other bases can be used by
    appending a radix character (Y for binary, O or Q for octal, T for
    decimal, H for hexadecimal) in either uppercase or lowercase. For
    example, the following values are equivalent:

    0040             0100Q
    0040H            0100O
    0064t            1000000Y

    Doubleword (32-bit) values are entered as two hexadecimal
    integers separated by a colon character (:). Real numbers are always
    entered in decimal radix, with or without a decimal point or exponent.
    Leading zeros can be omitted.

    An expression is a combination of symbols, numeric constants, and
    operators that evaluates to an 8-, 16-, or 32-bit value. An expression
    can be used in place of a simple value in any command. Unary address
    operators use DS as the default segment for addresses. Expressions are
    evaluated in order of operator precedence; operators with equal
    precedence are evaluated from left to right. Parentheses can be used
    to override the normal operator precedence.

    The available unary operators, listed in order of precedence from
    highest to lowest, are

╓┌──────────────┌────────────────────────────────────────────────────────────╖
    Operator  Meaning
    ──────────────────────────────────────────────────────────────────────
    +         Unary plus
    -         Unary minus
    NOT       One's (bitwise) complement
    SEG       Segment address of operand
    OFF       Offset of operand
    BY        Low-order byte from specified address
    WO        Low-order word from specified address
    DW        Doubleword from specified address
    POI       Pointer from specified address (same as DW)
    PORT      Byte input from specified port
    WPORT     Word input from specified port

    The available binary operators, listed in order of precedence from
    highest to lowest, are

╓┌──────────────┌────────────────────────────────────────────────────────────╖
    Operator  Meaning
    ──────────────────────────────────────────────────────────────────────
    *         Multiplication
    /         Integer division
    MOD       Modulus
    :         Segment override
    +         Addition
    -         Subtraction
    AND       Bitwise Boolean AND
    XOR       Bitwise Boolean Exclusive OR
    OR        Bitwise Boolean Inclusive OR

    A list is composed of one or more values, expressions, or strings,
    separated by spaces or commas. A string is one or more ASCII
    characters, enclosed within single or double quotation marks. Case is
    significant within a string. If the same type of quote character that
    is used to delimit the string occurs inside the string, the character
    must be doubled inside the string in order to be interpreted correctly
    (for example,"A ""quoted"" word").

    In a few cases, SYMDEB displays a specific and informative error
    message in response to an invalid command. In general, though, SYMDEB
    responds in a generic fashion, pointing to the approximate location of
    the error with a caret character (^), followed by the word Error. For
    example:

    -D CS:100,CS:80  <Enter>
                    ^ Error

    SYMDEB maintains a set of virtual CPU registers and flags for a
    program being debugged. These registers can be examined and modified
    with SYMDEB commands. When a program is first loaded for debugging,
    the virtual registers are initialized with the following values:

╓┌──────────────┌───────────────────────────┌────────────────────────────────╖
    Register  .COM Program                .EXE Program
    ──────────────────────────────────────────────────────────────────────
    AX        Valid drive code            Valid drive code
    BX        Upper half of program size  Upper half of program size
    CX        Lower half of program size  Lower half of program size
    DX        Zero                        Zero
    SI        Zero                        Zero
    DI        Zero                        Zero
    BP        Zero                        Zero
    SP        FFFEH or top of available   Size of stack segment
            memory minus 2
    IP        100H                        Offset of entry point within
                                        target program's code segment
    CS        PSP                         Base of target program's code
                                        segment
    DS        PSP                         PSP
    ES        PSP                         PSP
    SS        PSP                         Base of target program's stack
                                        segment

    Note: SYMDEB checks the first three parameters in the command line.
    If the second and third parameters are filenames, SYMDEB checks any
    drive specifications with those filenames to verify that they
    designate valid drives. Register AX contains one of the following
    codes:

╓┌──────────────┌────────────────────────────────────────────────────────────╖
    Code      Meaning
    ──────────────────────────────────────────────────────────────────────
    0000H     The drives specified with the second and third filenames are
            both valid, or only one filename was specified in the
            command line.
    00FFH     The drive specified with the second filename is invalid.
    FF00H     The drive specified with the third filename is invalid.
    FFFFH     The drives specified with the second and third filenames are
            both invalid.

    Before SYMDEB transfers control to the target program, it saves the
    actual CPU registers and then loads them with the current values of
    the virtual registers; conversely, when control reverts to SYMDEB from
    the target program, the returned register contents are stored back
    into the virtual register set for inspection and alteration by the
    SYMDEB user.

Examples

    To prepare the program CLEAN.ASM for debugging with SYMDEB, declare
    all vital labels, procedures, and variable names in the source program
    PUBLIC. To assemble the program, type

    C>MASM CLEAN;  <Enter>

    This produces the relocatable object module CLEAN.OBJ. Then, to link
    the object module, type

    C>LINK /MAP CLEAN;  <Enter>

    This results in the executable program file CLEAN.EXE and the map file
    CLEAN.MAP.

    Note: The /MAP switch must be used even if a map file is specified in
    the command line. Finally, to create the symbol information file
    required by SYMDEB, type

    C>MAPSYM CLEAN  <Enter>

    At this point, begin symbolic debugging by typing

    C>SYMDEB CLEAN.SYM CLEAN.EXE  <Enter>

    Any run-time command-line parameters required by the CLEAN program may
    be placed in the SYMDEB command line after the filename CLEAN.EXE.

    To prepare the program SHELL.C for debugging with SYMDEB, first
    compile the program with the switches that disable optimization and
    cause line-number information to be written to the relocatable object
    module:

    C>MSC /Zd /Od SHELL;  <Enter>

    Next, to convert the object module to an executable program and create
    a map file with line-number information, type

    C>LINK /MAP /LI SHELL;  <Enter>

    To create the symbol information file required by SYMDEB for symbolic
    debugging, type

    C>MAPSYM SHELL  <Enter>

    To begin debugging, type

    C>SYMDEB SHELL.SYM SHELL.EXE  <Enter>

    To use the SYMDEB utility to inspect or modify memory or to read,
    modify, and write absolute disk sectors, type

    C>SYMDEB  <Enter>

Message

    File not found
    The filename supplied as the first parameter in the SYMDEB command
    line cannot be found.



SYMDEB: A
Assemble Machine Instructions


Purpose

    Allows entry of assembler mnemonics and translates them into
    executable machine code.

Syntax

    A [address]

    where:

    address   is the starting location for the assembled machine code.

Description

    The Assemble Machine Instructions (A) command accepts assembly-
    language statements, rather than hexadecimal values, for the Intel
    8086/8088, 80186, and 80286 (running in real mode) microprocessors and
    the Intel 8087 and 80287 math coprocessors and assembles each
    statement into executable machine language.

    The address parameter specifies the location where entry of assembly-
    language mnemonics will begin. If address is omitted, SYMDEB uses the
    last address generated by the previous A command; if there was no
    previous A command, SYMDEB uses the current value of the target
    program's CS:IP registers.

    After the user enters an A command, SYMDEB prompts for each assembly-
    language statement by displaying the address (a segment and an offset)
    in which the assembled code will be stored. When the user presses the
    Enter key, SYMDEB translates the assembly-language statement and
    stores each byte of the resulting machine instruction sequentially in
    memory (overwriting any existing information), beginning at the
    displayed address. SYMDEB then displays the address following the last
    byte of the machine instruction to prompt the user to enter the next
    assembled instruction. The user can terminate assembly mode by
    pressing the Enter key in response to the address prompt.

    The assembly-language statements accepted by the SYMDEB A command have
    some slight syntactic differences and restrictions compared with the
    Microsoft Macro Assembler programming statements. These differences
    can be summarized as follows:

    ■  All numbers are assumed to be hexadecimal integers unless otherwise
        specified with a radix character suffix.

    ■  Segment overrides must be specified by preceding the entire
        instruction with CS:, DS:, ES:, or SS:.

    ■  File control directives (NAME, PAGE, TITLE, and so forth), macro
        definitions, record structures, and conditional assembly directives
        are not supported by SYMDEB.

    ■  When the data type (word or byte) is not implicit in the
        instruction, the type must be specified by preceding the operand
        with BYTE PTR (or BY), WORD PTR (or WO), DWORD PTR (or DW), QWORD
        PTR (or QW), or TBYTE PTR (or TB).

    ■  In a string operation, the size of the string must be specified
        with a B (byte) or W (word) added to the string instruction
        mnemonic (for example, LODSB or LODSW).

    ■  The DB and DW instructions accept a parameter of the type list and
        assemble byte and word values directly into memory.

    ■  The WAIT or FWAIT opcodes for 8087/80287 assembler statements are
        not generated by the system and must be coded explicitly. (Note:
        8087/80287 instructions can be assembled if the system is not
        equipped with a math coprocessor, but the system will crash if an
        attempt is made to execute them.)

    ■  Addresses must be enclosed in square brackets to be differentiated
        from immediate operands.

    ■  Repeat prefixes such as REP, REPZ, and REPNZ can be entered either
        alone on a line preceding the statement they affect or on the same
        line immediately preceding the statement.

    ■  The assembler will generate the optimal form (SHORT, NEAR, or FAR)
        for jumps or calls, depending on the destination address, but these
        can be overridden if the operand is preceded with a NEAR (or NE) or
        FAR prefix.

    ■  The mnemonic for a FAR RETURN is RETF.

    Examples

    To begin assembling code at address CS:0100H, type

    -A 100  <Enter>

    To assemble the instruction sequence

    LODS WORD PTR [SI]
    XCHG BX,AX
    JMP [BX]

    beginning at address CS:0100H, the following dialogue would take
    place:

    -A 100  <Enter>
    1983:0100  LODSW  <Enter>
    1983:0101  XCHG BX,AX  <Enter>
    1983:0103  JMP [BX]  <Enter>
    1983:0105  <Enter>

    To continue assembling at the last address generated by a previous A
    command (1983:0105H in the preceding example), type

    -A  <Enter>



SYMDEB: BC
Clear Breakpoints


Purpose

    Permanently removes sticky breakpoints.

Syntax

    BC *

    or

    BC list

    where:

    *          represents all sticky breakpoints.

    list       is one or more integers (sticky breakpoint numbers) in the
                range 0 through 9.

Description

    The Clear Breakpoints (BC) command permanently clears the sticky
    breakpoints previously set with the Set Breakpoints (BP) command. A
    sticky breakpoint remains in memory throughout a SYMDEB session,
    unlike a breakpoint set with the Go (G) command, which remains in
    effect only while the G command executes.

    If an asterisk character (*) follows the BC command, SYMDEB deletes
    all sticky breakpoints. If a list parameter containing one or more
    sticky breakpoint numbers in the range 0 through 9 follows the BC
    command, SYMDEB selectively deletes sticky breakpoints. Each sticky
    breakpoint is assigned a number when the breakpoint is created with
    the BP command. The List Breakpoints (BL) command can be used to
    display all current sticky breakpoint locations and numbers.
    Breakpoint numbers should be separated by spaces.

    Sticky breakpoints can be temporarily disabled with the Disable
    Breakpoints (BD) command and subsequently re-enabled with the  Enable
    Breakpoints (BE) command.

Examples

    To clear sticky breakpoints 0, 4, and 8, type

    -BC 0 4 8  <Enter>

    To clear all sticky breakpoints, type

    -BC *  <Enter>

Messages

    Bad breakpoint number! (0-9)
    A sticky breakpoint number in the command line was not an integer in
    the range 0 through 9.

    Breakpoint list or '*' expected!
    The BC command was entered without parameters.



SYMDEB: BD
Disable Breakpoints


Purpose

    Temporarily disables sticky breakpoints.

Syntax

    BD *

    or

    BD list

    where:

    *           represents all sticky breakpoints.

    list        is one or more integers (sticky breakpoint numbers) in the
                range 0 through 9.

Description

    The Disable Breakpoints (BD) command temporarily disables the sticky
    breakpoints previously set with the Set Breakpoints (BP) command. A
    sticky breakpoint remains in memory throughout a SYMDEB session,
    unlike a breakpoint set with the Go (G) command, which remains in
    effect only while the G command executes.

    If an asterisk character (*) follows the BD command, SYMDEB disables
    all sticky breakpoints. If a list parameter containing one or more
    sticky breakpoint numbers in the range 0 through 9 follows the BD
    command, SYMDEB selectively disables sticky breakpoints. Each sticky
    breakpoint is assigned a number when the breakpoint is created with
    the BP command. The List Breakpoints (BL) command can be used to
    display all current sticky breakpoint locations and numbers.
    Breakpoint numbers should be separated by spaces.

    Sticky breakpoints disabled with the BD command can be re-enabled with
    the Enable Breakpoints (BE) command. The Clear Breakpoints (BC)
    command can be used to permanently delete a sticky breakpoint.

Examples

    To disable sticky breakpoints 0, 4, and 8, type

    -BD 0 4 8  <Enter>

    To disable all sticky breakpoints, type

    -BD *  <Enter>

Messages

    Bad breakpoint number! (0-9)
    A sticky breakpoint number in the command line was not an integer in
    the range 0 through 9.

    Breakpoint list or '*' expected!
    The BD command was entered without parameters.



SYMDEB: BE
Enable Breakpoints


Purpose

    Enables disabled sticky breakpoints.

Syntax

    BE *

    or

    BE list

    where:

    *          represents all sticky breakpoints.

    list       is one or more integers (sticky breakpoint numbers) in the
                range 0 through 9.

Description

    The Enable Breakpoints (BE) command enables the sticky breakpoints
    disabled with the Disable Breakpoints (BD) command. A sticky
    breakpoint remains in memory throughout a SYMDEB session, unlike a
    breakpoint set with the Go (G) command, which remains in effect only
    while the G command executes.

    If an asterisk (*) character follows the BE command, SYMDEB enables
    all sticky breakpoints. If a list parameter containing one or more
    sticky breakpoint numbers in the range 0 through 9 follows the BE
    command, SYMDEB selectively enables sticky breakpoints. Each sticky
    breakpoint is assigned a number when the breakpoint is created with
    the Set Breakpoints (BP) command. The List Breakpoints (BL) command
    can be used to display all current sticky breakpoint locations and
    numbers. Breakpoint numbers should be separated by spaces.

Examples

    To enable sticky breakpoints 0, 4, and 8, type

    -BE 0 4 8  <Enter>

    To enable all sticky breakpoints, type

    -BE *  <Enter>

Messages

    Bad breakpoint number! (0-9)
    A sticky breakpoint number in the command line was not an integer in
    the range 0 through 9.

    Breakpoint list or '*' expected!
    The BE command was entered without parameters.



SYMDEB: BL
List Breakpoints


Purpose

    Displays information about all sticky breakpoints.

Syntax

    BL

Description

    The List Breakpoints (BL) command lists the current status of each
    sticky breakpoint created with the Set Breakpoints (BP) command. A
    sticky breakpoint remains in memory throughout a SYMDEB session,
    unlike a breakpoint set with the Go (G) command, which remains in
    effect only while the G command executes.

    The BL command lists each sticky breakpoint number, its status code,
    its address in the target program, the number of passes remaining, and
    the initial number of passes specified with the BP command (in
    parentheses). If source display mode was selected with the Enable
    Source Display Mode (S+) command, SYMDEB also displays the source-file
    name and the line number that corresponds to each breakpoint location.
    Breakpoint status codes are

    e   Enabled
    d   Disabled
    v   Virtual

    (A virtual breakpoint is a sticky breakpoint set at a symbol contained
    in a .EXE file that has not yet been loaded into SYMDEB.)

Example

    To view the current status of all breakpoints, type

    -BL  <Enter>

    If the BP commands

    -BP0 _TEXT:_main  <Enter>
    -BP1 _TEXT:_printf  <Enter>

    were previously entered, the BL command displays

    0 e 456E:0010 [_TEXT:_main] dump.C:32
    1 e 456E:0612 [_TEXT:_printf]



SYMDEB: BP
Set Breakpoints


Purpose

    Sets sticky breakpoint locations within the program being
    debugged.

Syntax

    BP[n] address [passcount] ["commands"]

    where:

    n             is the sticky breakpoint number (0-9).

    address       is the location of the breakpoint in the target
                program.

    passcount     is the number of times the instruction at address
                should be executed before the breakpoint is taken.

    "commands"    is one or more SYMDEB commands, separated by
                semicolons. The entire list must be enclosed in double
                quotation marks. (Limit = 30 characters.)

Description

    The Set Breakpoints (BP) command sets a sticky breakpoint in the
    program being debugged. A sticky breakpoint remains in memory
    throughout a SYMDEB session, unlike a breakpoint set with the Go (G)
    command, which remains in effect only while the G command executes.
    When the target program reaches the breakpoint, execution of the
    program is suspended and control returns to SYMDEB. SYMDEB displays
    the contents of the registers and flags, followed by a prompt so that
    the user can enter more commands.

    The optional n parameter associates an integer in the range 0 through
    9, called the breakpoint number, with the sticky breakpoint location.
    If n is omitted, the next available breakpoint number is used. No
    space is allowed between BP and n.

    The address parameter must point to the first byte of a machine
    instruction in the program. This parameter may be a symbol, a literal
    address, or a source-code line number. If a segment is not included,
    SYMDEB uses the target program's CS register.

    The optional passcount parameter is the number of times execution
    should pass through the specified location before the break is taken
    and control is returned to SYMDEB. The value of passcount must be a
    hexadecimal number in the range 0 through FFFFH (default = 0).

    The optional "commands" parameter is one or more SYMDEB commands with
    their associated parameters. Each command must be separated from the
    others by a semicolon character (;) and the entire list enclosed in
    double quotation marks ("). A maximum of 30 characters can be
    specified within the quotation marks. The commands are executed
    whenever the break is taken.

Examples

    To set a sticky breakpoint at location next_file in the target
    program and dump the contents of memory locations DS:0000H through
    DS:00FFH when the breakpoint is reached, type

    -BP NEXT_FILE "DB DS:0 L100"  <Enter>

    To associate the breakpoint number 4 with the location CS:4230H in the
    program being debugged and pass the breakpoint 16 (10H) times before
    suspending execution of the program, type

    -BP4 CS:4230 10  <Enter>

Messages

    Bad breakpoint number! (0-9)
    A sticky breakpoint number in the command line was not an integer in
    the range 0 through 9.

    Breakpoint command too long!
    The "commands" parameter exceeded 30 characters.

    Breakpoint error!
    The BP command was entered without an address parameter.

    Breakpoint redefined!
    A new address was assigned to an existing breakpoint number, or an
    attempt was made to create a breakpoint with the same address as an
    existing breakpoint.

    Duplicate breakpoint ignored!
    An attempt was made to change an existing breakpoint to a breakpoint
    already specified in the breakpoint list.

    Too many breakpoints!
    No more sticky breakpoints are available.



SYMDEB: C
Compare Memory Areas


Purpose

    Compares two areas of memory and reports any differences.

Syntax

    C range address

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the first area of memory
                to be compared.

    address    points to the beginning of the second area of memory to be
                compared.

Description

    The Compare Memory Areas (C) command compares the contents of two
    areas of memory. The location and contents of any differing bytes are
    listed in the following form:

    address1  byte1  byte2  address2

    If no differences are found, the SYMDEB prompt returns.

    The range parameter specifies the first through last addresses or the
    starting address and length in bytes of the first area of memory to be
    compared.

    The address parameter points to the beginning of the second area of
    memory to be compared, which is the same size as range. If a segment
    is not included in either range or address, SYMDEB uses DS.

Example

    To compare the 64 bytes beginning at CS:CE00H with the 64 bytes
    beginning at CS:CF0AH, type

    -C CS:CE00,CE3F CS:CF0A  <Enter>

    or

    -C CS:CE00 L40 CS:CF0A  <Enter>

    If any differences are found, SYMDEB displays them in the following
    format:

    2124:CE06  00  FF  2124:CF10



SYMDEB: D
Display Memory


Purpose

    Displays the contents of an area of memory.

Syntax

    D [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Memory (D) command displays the contents of a specified
    range of memory addresses in the same format used in the most recent
    Display command (DA, DB, DD, DL, DS, DT, or DW). If no Display command
    has previously been entered, the memory is displayed in hexadecimal
    bytes and their ASCII equivalents (the DB format).

    The range parameter specifies the starting and ending addresses of
    the memory area to be displayed or the starting address followed by
    the length of the area, expressed by an L and the hexadecimal number
    of data items to be displayed. When range does not include a segment,
    SYMDEB uses DS.

    The size in bytes of each item and the default value for the length
    depend on the type of Display command used: the Display Byte (DB),
    Display Doubleword (DD), and Display Word (DW) commands default to a
    length of 128 (80H) bytes; Display ASCII (DA) displays 128 bytes or up
    to a null byte, whichever is smaller; Display Short Reals (DS),
    Display Long Reals (DL), and Display 10-Byte Reals (DT) default to the
    display of one floating-point number.

    If a Display command has not previously been used and range is
    omitted from a D command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a D command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command.

Examples

    Assume that the only Display commands used during this SYMDEB session
    are D and DB. To display the contents of the 128 bytes of memory
    beginning at offset 100H in the program's DGROUP, type

    -D DGROUP:0100  <Enter>

    SYMDEB displays the contents of the range of memory addresses in the
    following format:

7F00:0100  20 64 65 76 69 63 65 0D-0A 00 60 39 0D 0A 00 7C  device...'9...|
7F00:0110  39 08 20 08 00 81 39 04-1B 5B 32 4A 42 BD 11 44 9....9..[2JB=.D
7F00:0120  2E 26 45 AF 11 47 B3 11-48 A5 11 4C B8 11 4E D3 .&E/.G3.H%.L8.NS
7F00:0130  11 50 DF 11 51 AB 11 54-DF 1E 56 37 11 5F 9F 16 .P_.Q+.T_.V7._..
7F00:0140  24 C0 11 00 03 4E 4F 54-C1 07 0A 45 52 52 4F 52 $@...NOTA..ERROR
7F00:0150  4C 45 56 45 4C 85 08 05-45 58 49 53 54 18 08 00 LEVEL...EXIST...
7F00:0160  03 44 49 52 03 91 0C 06-52 45 4E 41 4D 45 01 C0 .DIR....RENAME.@
7F00:0170  0F 03 52 45 4E 01 C0 0F-05 45 52 41 53 45 01 68 ..REN.@..ERASE.h

    To view the next 128 bytes of memory, type

    -D  <Enter>

    SYMDEB displays the contents of memory addresses 7F00:0180H through
    7F00:01FFH.



SYMDEB: DA
Display ASCII


Purpose

    Displays the contents of memory in ASCII format.

Syntax

    DA [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display ASCII (DA) command displays the contents of a specified
    range of memory addresses in ASCII format.

    The range parameter specifies the starting and ending addresses of
    the memory area to be displayed in ASCII format or the starting
    address followed by the length of the area, expressed by an L and a
    hexadecimal number of bytes. When range does not include a segment,
    SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DA command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DA command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command.

    When a range is not explicit in a DA command, the display terminates
    after 128 bytes or when a null (zero) byte is encountered. If a range
    is specified, the entire range is displayed, including any null bytes,
    with nonprinting characters displayed as period (.) characters.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 16 bytes of memory (or less if a null byte
    was encountered) represented as an ASCII string.

    See also PROGRAMMING UTILITIES: SYMDEB:EA.

Examples

    If memory beginning at location 7F00:0100H contains the characters
    This is a test string followed by a null (zero) byte, the
    command

    -DA 7F00:0100  <Enter>

    produces the following display:

    7F00:0100  This is a test string

    To view additional memory in the same format, type

    -D  <Enter>



SYMDEB: DB
Display Bytes


Purpose

    Displays the contents of memory as hexadecimal bytes and their
    equivalent ASCII characters.

Syntax

    DB [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Bytes (DB) command displays the contents of a specified
    range of memory addresses as hexadecimal bytes and their ASCII
    character equivalents. This is the default format for the Display
    Memory (D) command.

    The range parameter specifies the starting and ending addresses of
    the memory area to be displayed or the starting address followed by
    the length of the area, expressed by an L and a hexadecimal number of
    bytes. When range does not include a segment, SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DB command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DB command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DB command, the display terminates after 128
    bytes.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 16 bytes of memory represented as
    hexadecimal values separated by spaces (except the eighth and ninth
    values, which are separated by a dash), followed by their ASCII
    character equivalents (if any). In the ASCII section, nonprinting
    characters are displayed as periods.

    See also PROGRAMMING UTILITIES: SYMDEB:EB.

Examples

    To display the contents of the 128 bytes of memory beginning at
    7F00:0100H, type

    -DB 7F00:0100  <Enter>

    The contents of the range of memory addresses are displayed in the
    following format:

7F00:0100  20 64 65 76 69 63 65 0D-0A 00 60 39 0D 0A 00 7C  device...'9...|
7F00:0110  39 08 20 08 00 81 39 04-1B 5B 32 4A 42 BD 11 44 9....9..[2JB=.D
7F00:0120  2E 26 45 AF 11 47 B3 11-48 A5 11 4C B8 11 4E D3 .&E/.G3.H%.L8.NS
7F00:0130  11 50 DF 11 51 AB 11 54-DF 1E 56 37 11 5F 9F 16 .P_.Q+.T_.V7._..
7F00:0140  24 C0 11 00 03 4E 4F 54-C1 07 0A 45 52 52 4F 52 $@...NOTA..ERROR
7F00:0150  4C 45 56 45 4C 85 08 05-45 58 49 53 54 18 08 00 LEVEL...EXIST...
7F00:0160  03 44 49 52 03 91 0C 06-52 45 4E 41 4D 45 01 C0 .DIR....RENAME.@
7F00:0170  0F 03 52 45 4E 01 C0 0F-05 45 52 41 53 45 01 68 ..REN.@..ERASE.h

    To view the next 128 bytes of memory, type

    -D  <Enter>

    SYMDEB displays the contents of memory addresses 7F00:0180H through
    7F00:01FFH.



SYMDEB: DD
Display Doublewords


Purpose

    Displays the contents of memory in hexadecimal doubleword
    format.

Syntax

    DD [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Doublewords (DD) command displays the contents of a
    specified range of memory addresses 4 bytes at a time, as if they were
    FAR memory pointers (offset followed by segment in reverse byte
    order).

    The range parameter specifies the starting and ending addresses of
    the memory to be displayed or the starting address followed by the
    length of the area, expressed by an L and a hexadecimal number of
    doublewords. When range does not include a segment, SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DD command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DD command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DD command, 32 doublewords (128 bytes) are
    displayed.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 16 bytes of memory represented as 4 paired
    16-bit segments and offsets. The 4 bytes that make up the segment and
    offset of each doubleword pointer are displayed in reverse order from
    their actual storage in memory.

    See also PROGRAMMING UTILITIES: SYMDEB:ED.

Examples

    To see how DD represents the 4 bytes that make up a doubleword,
    first type

    -DB 100  <ENTER>

    This produces the following output:

3929:0100  CF 0B 9D 0D 33 0E C3 0E-F2 0E 06 0F 39 0F 49 0F 0...3.C.r...9.I.

    Then type

    -DD 100  <Enter>

    This produces the following output:

    3929:0100  0D9D:0BCF 0EC3:0E33 0F06:0EF2 0F49:0F39

    Notice that DD switches the order of the first 2 bytes in a 4-byte set
    and designates them as the offset; then it switches the order of the
    second 2 bytes in the 4-byte set and designates them as the segment
    address.

    To display the contents of the first 128 (80H) bytes of the system
    interrupt vector table, which is based at address 0000:0000H, type

    -DD 0:0  <Enter>

    This produces the following output:

    0000:0000  2075:03D2 0070:01F0 16F3:2C1B 0070:01F0
    0000:0010  0070:01F0 F000:FF54 F000:9805 F000:9805
    0000:0020  0AE3:0395 16F3:2BAD F000:9805 F000:9805
    0000:0030  0972:0B40 F000:9805 F000:EF57 0070:01F0
    0000:0040  0AE3:03D6 F000:F84D F000:F841 0070:0D43
    0000:0050  F000:E739 F000:F859 F000:E82E F000:EFD2
    0000:0060  F000:E76C 0070:0ADD F000:FE6E 1078:3BEC
    0000:0070  F000:FF53 F000:F0E4 0000:0522 F000:0000

    To view the next 128 bytes of memory in the same format, type

    -D  <Enter>

    SYMDEB displays the contents of memory addresses 0000:0080H through
    0000:00FFH.



SYMDEB: DL
Display Long Reals


Purpose

    Displays the contents of memory as long (64-bit) floating-point
    numbers.

Syntax

    DL [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Long Reals (DL) command displays the contents of a
    specified range of memory addresses 8 bytes at a time, as hexadecimal
    values and their decimal equivalents. The hexadecimal values are
    formatted as 64-bit floating-point numbers. The decimal values have
    the form

    +|-0.decimaldigitsE+|-mantissa

    The sign of the number (+ or -) is followed by a zero, a decimal
    point, and a maximum of 16 decimaldigits; this, in turn, is followed
    by the designator of the mantissa (E) and the mantissa's sign (+ or -)
    and digits.

    The range parameter specifies the starting and ending addresses of
    the memory to be displayed or the starting address followed by the
    length of the area, expressed by an L and a hexadecimal number of 8-
    byte values. When range does not include a segment, SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DL command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DL command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DL command, one 64-bit floating-point number is
    displayed.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 8 bytes of memory represented as a
    hexadecimal value, followed by its decimal floating-point
    equivalent.

    See also PROGRAMMING UTILITIES: SYMDEB:EL.

Examples

    Assume that the memory beginning at location DS:0100H contains the
    value 6.624 * 10^-27 (Planck's constant, in erg-seconds) as a 64-
    bit floating-point number. The command

    -DL 100  <Enter>

    produces the following output:

    43E8:0100  5F A2 20 73 75 66 80 3A  +0.6624E-26

    To view the next 8 bytes of memory in the same format, type

    -D  <Enter>



SYMDEB: DS
Display Short Reals


Purpose

    Displays the contents of memory as short (32-bit) floating-point
    numbers.

Syntax

    DS [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Short Reals (DS) command displays the contents of a
    specified range of memory addresses 4 bytes at a time, as hexadecimal
    values and their decimal equivalents. The hexadecimal values are
    formatted as 32-bit floating-point numbers. The decimal values have
    the form

    +|-0.decimaldigitsE+|-mantissa

    The sign of the number (+ or -) is followed by a zero, a decimal
    point, and a maximum of 16 decimaldigits (only the first 7 digits are
    significant); this, in turn, is followed by the designator of the
    mantissa (E) and the mantissa's sign (+ or -) and digits.

    The range parameter specifies the starting and ending addresses of
    the area of memory to be displayed or the starting address followed by
    the length of the area, expressed by an L and a hexadecimal number of
    4-byte values. When range does not include a segment, SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DS command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DS command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DS command, one 32-bit floating-point number is
    displayed.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 4 bytes of memory represented as a
    hexadecimal value, followed by its decimal floating-point
    equivalent.

    See also PROGRAMMING UTILITIES: SYMDEB:ES.

Examples

    Assume that the memory beginning at location 43E8:0100H contains the
    value 6.02 * 10^+23 (Avogadro's number) as a 32-bit floating-point
    number. The command

    -DS 43E8:100  <Enter>

    produces the following output:

    43E8:0100  F9 F4 FE 66  +0.6020000172718952E+24

    To view the next 4 bytes of memory in the same format, type

    -D  <Enter>



SYMDEB: DT
Display 10-Byte Reals


Purpose

    Displays the contents of memory as 10-byte (80-bit) floating-point
    numbers.

Syntax

    DT [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display 10-Byte Reals (DT) command displays the contents of a
    specified range of memory addresses 10 bytes at a time, as hexadecimal
    values and their decimal equivalents. The hexadecimal values are
    formatted as 80-bit floating-point numbers. (This format is ordinarily
    used by the Intel 8087 math coprocessor only for intermediate results
    during chained floating-point calculations.)  The decimal value has
    the form

    +|-0.decimaldigitsE+|-mantissa

    The sign of the number (+ or -) is followed by a zero, a decimal
    point, and a maximum of 16 decimaldigits; this, in turn, is followed
    by the designator of the mantissa (E) and the mantissa's sign (+ or -)
    and digits.

    The range parameter specifies the starting and ending addresses of
    the area of memory to be displayed or the starting address followed by
    the length of the area, expressed by an L and a hexadecimal number of
    10-byte values. When range does not include a segment, SYMDEB uses
    DS.

    If a Display command has not previously been used and range is
    omitted from a DT command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DT command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DT command, one 10-byte floating-point number is
    displayed.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 10 bytes of memory represented as a
    hexadecimal value, followed by its decimal floating-point
    equivalent.

    See also PROGRAMMING UTILITIES: SYMDEB:ET.

Examples

    Assume that the memory beginning at location DS:0100H contains the
    value 2.99 * 10^+10 (the speed of light in centimeters per second)
    as an 80-bit floating-point number. The command

    -DT 100  <Enter>

    produces the following output:

    43E8:0100  00 00 00 00 60 B9 C5 DE 21 40  +0.299E+11

    To view the next 10 bytes of memory in the same format, type

    -D  <Enter>



SYMDEB: DW
Display Words


Purpose

    Displays the contents of memory as 2-byte (16-bit) words.

Syntax

    DW [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                displayed.

Description

    The Display Word (DW) command displays the contents of a specified
    range of memory addresses 2 bytes at a time, as 16-bit hexadecimal
    integers.

    The range parameter specifies the starting and ending addresses of
    the area of memory to be displayed or the starting address followed by
    the length of the area, expressed by an L and a hexadecimal number of
    words of memory to be displayed. When range does not include a
    segment, SYMDEB uses DS.

    If a Display command has not previously been used and range is
    omitted from a DW command, the display starts at the address specified
    in the target program's CS:IP registers. If a Display command has
    previously been used and range is omitted from a DW command, the
    display starts at the memory address following the last address
    displayed by the most recent Display command. When a range is not
    explicit in a DW command, 64 words are displayed.

    Each line of the display is formatted as a segment and offset,
    followed by the contents of 16 bytes of memory represented as eight 4-
    digit hexadecimal numbers. The 2 bytes that make up each word are
    displayed in reverse order from their actual storage in memory. That
    is, the first byte in a 2-byte word is displayed after the second
    byte.

    See also PROGRAMMING UTILITIES: SYMDEB:EW.

Examples

    To display the contents of the 64 words of memory beginning at
    DS:0080H in word format, type

    -DW 80  <Enter>

    This produces the following output:

    1FEE:0080  6977 646E 776F 5C73 696C 0062 494C 3D42
    1FEE:0090  3A63 6D5C 6373 6C5C 6269 633B 5C3A 6977
    1FEE:00A0  646E 776F 5C73 696C 0062 4D54 3D50 3A63
    1FEE:00B0  745C 6D65 0070 4554 504D 633D 5C3A 6574
    1FEE:00C0  706D 4400 4149 3D4C 3A63 645C 6169 006C
    1FEE:00D0  4350 3346 3D32 3A63 665C 726F 6874 705C
    1FEE:00E0  3363 0032 4350 3350 3D32 3A63 665C 726F
    1FEE:00F0  6874 705C 756C 3373 0032 5255 3146 3D30

    To view the next 64 words of memory in the same format, type

    -D  <Enter>

    SYMDEB displays the contents of memory addresses 1FEE:0100H through
    1FEE:017FH.



SYMDEB: E
Enter Data


Purpose

    Enters data into memory.

Syntax

    E address [list]

    where:

    address    is the first memory location for storage.

    list       is the data to be placed into successive bytes of memory,
                starting at address.

Description

    The Enter Data (E) command enters into memory one or more data items,
    using the same format as the most recent Enter command (EA, EB, ED,
    EL, ES, ET, or EW). If no Enter command has previously been used, the
    data can be entered as either hexadecimal values or ASCII strings (the
    EA or EB format). Any data previously stored at the specified
    locations is lost. If SYMDEB displays an error message, no changes are
    made.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, SYMDEB uses DS. SYMDEB increments
    the address for each byte of data stored.

    The list parameter must meet the requirements of the last Enter
    command used. All SYMDEB Enter commands are described in alphabetic
    order on the following pages. If list is included in the command line,
    the changes are made unless an error is detected in the command line.
    If list is omitted from the command line, the current contents of
    address are displayed, followed by a period (.), and the user is
    prompted for new data. If no value is entered and the Enter key is
    pressed, the original value remains unchanged and the Enter command is
    terminated.

Examples

    The following two examples assume that no previous Enter commands have
    been used or that the most recent Enter command was EA or EB.

    To store the byte values 00H, 0DH, and 0AH into the 3 bytes beginning
    at DS:1FB3H, type

    -E 1FB3 00 0D 0A  <Enter>

    If the command

    -E 2C3 ABC  <Enter>

    is entered and the last Enter command used was EA or EB, the value BCH
    is stored at DS:2C3H, and the leading `A' character on the hexadecimal
    number `ABC' is ignored.



SYMDEB: EA
Enter ASCII String


Purpose

    Enters an ASCII string or hexadecimal byte values into memory.

Syntax

    EA address [list]

    where:

    address    is the first memory location for storage.

    list       is one or more ASCII strings or hexadecimal byte values.

Description

    The Enter ASCII String (EA) command enters data into successive memory
    bytes. The data can be entered as either hexadecimal byte values or
    ASCII strings. Any data previously stored at the specified locations
    is lost. If SYMDEB displays an error message, no changes are made. The
    EA command functions exactly like the Enter Bytes (EB) command.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, SYMDEB uses DS. SYMDEB increments
    the address for each byte of data stored.

    The list parameter is one or more ASCII strings and/or hexadecimal
    byte values, separated by spaces, commas, or tab characters. Extra or
    trailing characters are ignored. Strings must be enclosed within
    single or double quotation marks, and case is significant within a
    string.

    If list is included in the command line, the changes are made unless
    an error is detected in the command line. If list is omitted from the
    command line, the user is prompted byte by byte for new data, starting
    at address. The current contents of a byte are displayed, followed by
    a period. A new value for that byte can be entered as one or two
    hexadecimal digits (extra characters are ignored), or the contents can
    be left unchanged. To display the next byte, the user presses the
    spacebar. If the user enters a minus sign, or hyphen character (-),
    instead of pressing the spacebar, SYMDEB backs up to the previous
    byte. A maximum of 8 bytes can be entered on each input line; a new
    line is begun each time an 8-byte boundary is crossed. Data entry is
    terminated by pressing the Enter key without pressing the spacebar or
    entering any data.

    Text strings can be used only as part of the list parameter in an EA
    command line; they cannot be entered in response to an address prompt.

Example

    To store the string MAIN MENU into memory beginning at address
    ES:0C14H, type

    -EA ES:C14 "MAIN MENU"  <Enter>



SYMDEB: EB
Enter Bytes


Purpose

    Enters hexadecimal byte values or ASCII strings into memory.

Syntax

    EB address [list]

    where:

    address    is the first memory location for storage.

    list       is one or more hexadecimal byte values or ASCII strings.

Description

    The Enter Bytes (EB) command enters data into successive memory bytes.
    The data can be entered as either hexadecimal byte values or ASCII
    strings. Any data previously stored at the specified locations is
    lost. If SYMDEB displays an error message, no changes are made. The EB
    command functions exactly like the Enter ASCII String (EA) command.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, SYMDEB uses DS. SYMDEB increments
    the address for each byte of data stored.

    The list parameter is one or more hexadecimal byte values and/or
    ASCII strings, separated by spaces, commas, or tab characters. Extra
    or trailing characters are ignored. Strings must be enclosed within
    single or double quotation marks, and case is significant within a
    string.

    If list is included in the command line, the changes are made unless
    an error is detected in the command line. If list is omitted from the
    command line, the user is prompted byte by byte for new data, starting
    at address. The current contents of a byte are displayed, followed by
    a period. A new value for the byte can be entered as one or two
    hexadecimal digits (extra characters are ignored), or the contents can
    be left unchanged. To display the next byte, the user presses the
    spacebar. If the user enters a minus sign, or hyphen character (-),
    instead of pressing the spacebar, SYMDEB backs up to the previous
    byte. A maximum of 8 bytes can be entered on each input line; a new
    line is begun each time an 8-byte boundary is crossed. Data entry is
    terminated by pressing the Enter key without pressing the spacebar or
    entering any data.

    Text strings can be used only as part of the list parameter in an EB
    command line; they cannot be entered in response to an address prompt.

Examples

    To store the byte values 00H, 0DH, and 0AH into the 3 bytes beginning
    at DS:1FB3H, type

    -EB 1FB3 00 0D 0A  <Enter>

    To store the string MAIN MENU into memory beginning at address
    ES:0C14H, type

    -EB ES:C14 "MAIN MENU"  <Enter>



SYMDEB: ED
Enter Doublewords


Purpose

    Enters hexadecimal doubleword values into memory.

Syntax

    ED address [value]

    where:

    address    is the first memory location for storage.

    value      is a doubleword (32-bit) hexadecimal value.

Description

    The Enter Doublewords (ED) command enters into memory 32-bit
    hexadecimal doubleword values in the form of FAR memory pointers
    (offset followed by segments in reverse byte order). Any data
    previously stored at the specified locations is lost. If SYMDEB
    displays an error message, no changes are made.

    The address parameter specifies the first memory location to be
    modified. If address does not include a segment, SYMDEB uses DS.

    The value parameter is one doubleword value, entered as two 16-bit
    hexadecimal words separated by a colon character (:). Each value is
    entered in the form segment:offset. The offset portion is stored at
    address, and the segment portion is stored at address+2, both in
    reverse byte order. For example, a value of AABB:CCDDH would be stored
    in memory as DDH, CCH, BBH, and AAH, starting at address. Multiple
    values cannot be used in an ED command line; SYMDEB ignores any values
    after the first value.

    If value is omitted from the command line, SYMDEB prompts the user
    for new data, starting at address. The current contents of the
    location are displayed, followed by a period. The user can then enter
    a new doubleword value and press the Enter key or leave the contents
    unchanged by pressing the Enter key alone, which also terminates the
    ED command. If a new value is entered, SYMDEB increments address and
    displays the next doubleword value.

Example

    To store the doubleword value F000:1392H at the address DS:0200H,
    type

    -ED 200 F000:1392  <Enter>



SYMDEB: EL
Enter Long Reals


Purpose

    Enters 64-bit floating-point numbers into memory.

Syntax

    EL address [value]

    where:

    address    is the first memory location for storage.

    value      is a 64-bit floating-point decimal number.

Description

    The Enter Long Reals (EL) command enters into memory 64-bit floating-
    point numbers in decimal format. Any data previously stored at the
    specified memory locations is lost. If SYMDEB displays an error
    message, no changes are made.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, SYMDEB uses DS.

    The value parameter is a floating-point number entered in decimal
    radix, with or without a decimal point and/or exponent. Multiple
    values cannot be used in an EL command line; SYMDEB ignores any
    values after the first value.

    The 64-bit floating-point decimal value must be entered in the
    form

    [+|-]decimaldigits[E[+|-]mantissa]

    where:

    +|-             is the sign of the long floating-point value or the
                    mantissa.

    decimaldigits   is a decimal number. A maximum of 16 digits is
                    allowed, including digits before and after a decimal
                    point.

    E               denotes the beginning of the mantissa.

    mantissa        is the decimal mantissa value.

    If value is omitted from the command line, SYMDEB prompts the user
    for new data, starting at address. The current contents of the
    location are displayed. The user can enter a new value and press the
    Enter key or leave the contents unchanged by pressing the Enter key
    alone, which also terminates the EL command. If a new value is entered
    and the Enter key is pressed, SYMDEB increments address and displays
    the next long real number.

Example

    To store an approximation of the value pi in the form of a 64-
    bit floating-point number at address DS:0020H, type

    -EL 20 +0.3141592653589793E+1  <Enter>

    or

    -EL 20 3.141592653589793  <Enter>



SYMDEB: ES
Enter Short Reals


Purpose

    Enters 32-bit floating-point numbers into memory.

Syntax

    ES address [value]

    where:

    address    is the first memory location for storage.

    value      is a 32-bit floating-point decimal number.

Description

    The Enter Short Reals (ES) command enters into memory 32-bit floating-
    point numbers in decimal format. Any data previously stored at the
    specified locations is lost. If SYMDEB displays an error message, no
    changes are made.

    The address parameter specifies the first byte to be modified. If
    address does not include a segment, SYMDEB uses DS.

    The value parameter is a floating-point number entered in decimal
    radix, with or without a decimal point and/or exponent. Multiple
    values cannot be used in an ES command line; SYMDEB ignores any values
    after the first value.

    The 32-bit floating-point decimal value must be entered in the
    form

    [+|-]decimaldigits[E[+|-]mantissa]

    where:

    +|-             is the sign of the short floating-point value or the
                    mantissa.

    decimaldigits   is a decimal number. A maximum of 16 digits is
                    allowed, including digits before and after a decimal
                    point.

    E               denotes the beginning of the mantissa.

    mantissa        is the decimal mantissa value.

    Note: For short floating-point values, the last nine decimaldigits
    are not significant. This can be demonstrated by using the Display
    Short Reals (DS) command to check the new value in memory.

    If value is omitted from the command line, SYMDEB prompts the user
    for new data, starting at address. The current contents of the
    location are displayed. The user can then enter a new value and press
    the Enter key or leave the contents unchanged by pressing the Enter
    key alone, which also terminates the ES command. If a new value is
    entered and the Enter key is pressed, SYMDEB increments address and
    displays the next short floating-point number.

Example

    To store an approximation of the value pi in the form of a 32-bit
    floating-point number at address DS:0020H, type

    -ES 20 +0.31415927E+1  <Enter>

    or

    -ES 20 3.1415927  <Enter>



SYMDEB: ET
Enter 10-Byte Reals


Purpose

    Enters 10-byte (80-bit) floating-point numbers into memory.

Syntax

    ET address [value]

    where:

    address    is the first memory location for storage.

    value      is an 80-bit floating-point decimal number.

Description

    The Enter 10-Byte Reals (ET) command enters into memory 10-byte (80-
    bit) floating-point numbers in decimal format. Any data previously
    stored at the specified locations is lost. If SYMDEB displays an error
    message, no changes are made. (This 10-byte format is ordinarily used
    by the Intel 8087 math coprocessor only for intermediate results
    during chained floating-point calculations.)

    The address parameter specifies the first memory location to be
    modified. If address does not include a segment, SYMDEB uses DS.

    The value parameter is a floating-point number entered in decimal
    radix, with or without a decimal point and/or exponent. Multiple
    values cannot be used in an ET command line; SYMDEB ignores any values
    after the first value.

    The 10-byte floating-point decimal value must be entered in the form

    [+|-]decimaldigits[E[+|-]mantissa]

    where:

    +|-             is the sign of the 10-byte floating-point value or
                    the mantissa.

    decimaldigits   is a decimal number. A maximum of 16 digits is
                    allowed, including digits before and after a decimal
                    point.

    E               denotes the beginning of the mantissa.

    mantissa        is the decimal mantissa value.

    If value is omitted from the command, SYMDEB prompts the user for new
    data, starting at address. The current contents are displayed. The
    user can enter a new value and press the Enter key or leave the
    contents unchanged by pressing the Enter key alone, which also
    terminates the ET command. If a new value is entered and the Enter key
    is pressed, SYMDEB increments address and displays the next 10-byte
    floating-point number.

Example

    To store an approximation of the value pi in the form of an 80-
    bit floating-point number at address DS:0020H, type

    -ET 20 +0.31415926535897932384E+1  <Enter>

    or

    -ET 20 3.1415926535897932384  <Enter>



SYMDEB: EW
Enter Words


Purpose

    Enters word values into memory.

Syntax

    EW address [value]

    where:

    address    is the first memory location for storage.

    value      is a word (16-bit) hexadecimal value.

Description

    The Enter Words (EW) command enters into memory 16-bit hexadecimal
    word values. Any data previously stored at the specified locations is
    lost. If SYMDEB displays an error message, no changes are made.

    The address parameter specifies the first memory location to be
    modified. If address does not include a segment, SYMDEB uses DS.

    The value parameter is one word value in the range 0 through FFFFH.
    The value is stored in reverse byte order. For example, a value of
    AABBH would be stored in memory as BBH and AAH, starting at address.
    Multiple values cannot be used in an EW command line; SYMDEB ignores
    any values after the first value.

    If value is omitted from the command line, SYMDEB prompts the user
    word by word for new data, starting at address. The current contents
    are displayed, followed by a period. The user can enter a new word
    value as one to four hexadecimal digits and press the Enter key or
    leave the contents unchanged by pressing the Enter key alone, which
    also terminates the EW command. If a new value is entered, SYMDEB
    increments address and displays the next word value.

Example

    To store the word value 1355H at the address DS:1C00H, type

    -EW 1C00 1355 <Enter>



SYMDEB: F
Fill Memory


Purpose

    Stores a repetitive data pattern into an area of memory.

Syntax

    F range list

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of memory to be filled.

    list       is the data to be used to fill memory.

Description

    The Fill Memory (F) command fills an area of memory with the data from
    a list. The data can be entered in either hexadecimal or ASCII format.
    Any data previously stored at the specified locations is lost. If
    SYMDEB displays an error message, no changes are made.

    The range parameter specifies the starting and ending addresses or
    the starting address and hexadecimal length in bytes of the area of
    memory to be filled. If range does not include an explicit segment,
    SYMDEB uses DS.

    The list parameter is one or more hexadecimal byte values and/or
    strings, separated by spaces, commas, or tab characters. Strings must
    be enclosed in single or double quotation marks, and case is
    significant within a string.

    If the area to be filled is larger than the data list, the list is
    repeated as often as necessary to fill the area. If the data list is
    longer than the area of memory to be filled, the list is truncated to
    fit.

Examples

    To fill the area of memory from DS:0B10H through DS:0B4FH with the
    value 0E8H, type

    -F B10 B4F E8  <Enter>

    or

    -F B10 L40 E8  <Enter>

    To fill the 16 bytes of memory beginning at address CS:1FA0H by
    replicating the 2-byte sequence 0DH 0AH, type

    -F CS:1FA0 1FAF 0D 0A  <Enter>

    or

    -F CS:1FA0 L10 0D 0A  <Enter>

    To fill the area of memory from ES:0B00H through ES:0BFFH by
    replicating the text string BUFFER, type

    -F ES:B00 BFF "BUFFER"  <Enter>

    or

    -F ES:B00 L100 "BUFFER"  <Enter>



SYMDEB: G
Go


Purpose

    Transfers execution control from SYMDEB to the target program being
    debugged.

Syntax

    G[=address] [break0[... break9]]

    where:

    address                is the location at which to begin execution.

    break0 ... break9      specify from 1 to 10 breakpoints.

Description

    The Go (G) command transfers control from SYMDEB to the target
    program. If no breakpoints are set, the program will execute until it
    crashes or until it reaches a normal termination, in which case the
    message Program terminated normally is displayed and control returns
    to SYMDEB. (After this message has been displayed, it may be necessary
    to reload the program before it can be executed again.)

    The address parameter can be any location in memory. If no segment is
    specified, SYMDEB uses the target program's CS register. If address
    is omitted, SYMDEB transfers to the current address in the target
    program's CS:IP registers. An equal sign (=) must precede address to
    distinguish it from the breakpoints break0 ... break9.

    The parameters break0 ... break9 specify from 1 to 10 breakpoints
    that can be set as part of the G command. Breakpoints can be placed in
    any order, because execution stops at the first breakpoint address
    encountered, regardless of the position of that breakpoint in the
    list. Each of the breakpoint addresses must contain the first byte of
    an 8086 opcode. SYMDEB installs breakpoints by replacing the first
    byte of the machine instruction at each breakpoint address with an
    Interrupt 03H instruction (opcode 0CCH). If the program encounters a
    breakpoint, program execution is suspended and control returns to
    SYMDEB. SYMDEB then restores the original machine code in the
    breakpoint locations, displays the contents of the current registers
    and flags and the instruction pointed to by CS:IP, and issues the
    standard SYMDEB prompt. If the target program executes to completion
    and terminates without encountering any of the breakpoints or is
    halted by some means other than a breakpoint, the Interrupt 03H
    instructions are not replaced with the original machine code and the
    Load File or Sectors (L) command must be used to reload the original
    program.

    The G command requires that the target program's SS:SP registers point
    to a valid stack that has at least 6 bytes of stack space available.
    When the G command is executed, it pushes the target program's flags
    and CS and IP registers onto the stack and then transfers control to
    the program with an IRET instruction. Thus, if the target program's
    stack is not valid or is too small, the system may crash.

    The G command also recognizes any sticky breakpoints set with the Set
    Breakpoint (BP) command. These sticky breakpoints are not counted as
    part of the transient breakpoints specified in the G command line and
    are not removed after a breakpoint has been encountered.

Examples

    To begin execution of the program in SYMDEB's buffer at location
    CS:110AH, setting breakpoints at CS:12FCH and CS:1303H, type

    -G =110A 12FC 1303  <Enter>

    To resume execution of the program following a breakpoint, type

    -G  <Enter>

    To begin execution at the label main, setting breakpoints at the
    procedures fopen() and printf(), type

    -G =_main _fopen _printf  <Enter>

Messages

    Program terminated normally
    The program being debugged executed successfully without encountering
    any breakpoints and performed a normal termination with Interrupt 20H,
    Interrupt 21H Function 00H, or Interrupt 21H Function 4CH. If any
    breakpoints were set, the original program should be reloaded with the
    Load File or Sectors (L) command.

    Too many breakpoints!
    More than 10 breakpoints were specified in a Go (G) command. Enter the
    command again with 10 or fewer breakpoints.



SYMDEB: H
Perform Hexadecimal Arithmetic


Purpose

    Displays the sum and difference of two hexadecimal numbers.

Syntax

    H value1 value2

    where:

    value1 and value2     are any two hexadecimal numbers in the range 0
                        through FFFFH.

Description

    The Perform Hexadecimal Arithmetic (H) command displays the sum and
    difference of two 16-bit hexadecimal numbers--that is, the result of
    the operations value1+value2 and value1-value2. If value2 is
    greater than value1, SYMDEB displays their difference as a two's
    complement hexadecimal number. This command is convenient for
    performing quick calculations of addresses and other values during an
    interactive debugging session.

Examples

    To display the sum and difference of the values 4B03H and 104H,
    type

    -H 4B03 104  <Enter>

    This produces the following display:

    4C07  49FF

    If the addition produces an overflow, the four least significant
    digits are displayed. For example, the command line

    -H FFFF 2  <Enter>

    produces the following display:

    0001 FFFD

    If value2 is greater than value1, the difference is displayed in
    two's complement form. For example, the command line

    -H 1 2  <Enter>

    produces the following display:

    0003 FFFF



SYMDEB: I
Input from Port


Purpose

    Reads and displays 1 byte from an input/output (I/O) port.

Syntax

    I port

    where:

    port       is a 16-bit I/O port address in the range 0 through FFFFH.

Description

    The Input from Port (I) command performs a read operation on the
    specified I/O port address and displays the data as a two-digit
    hexadecimal number.

    Warning: This command must be used with caution because it involves
    direct access to the computer hardware and no error checking is
    performed. Input operations directed to the ports assigned to some
    peripheral device controllers may interfere with the proper operation
    of the system. If no device has been assigned to the specified I/O
    port or if the port is write-only, the value that will be displayed by
    an I command is unpredictable.

Example

    To read and display the contents of I/O port 10AH, type

    -I 10A  <Enter>

    An example of the result of this command is

    FF



SYMDEB: K
Perform Stack Trace


Purpose

    Displays the current stack frame.

Syntax

    K [number]

    where:

    number     is the number of parameters supplied to the current
                procedure.

Description

    The Perform Stack Trace (K) command displays the contents of the
    current stack frame. The first line of the display shows the name of
    the current procedure, parameters to the procedure, and the filename
    and line number of the call to the procedure. The subsequent lines
    trace the flow of execution that led to the current procedure.

    In cases where SYMDEB cannot determine the number of parameters for a
    procedure by inspection of the stack frame (for example, if the number
    of parameters sent to a procedure varies), the number option can be
    used in the command to force the display of one or more
    parameters.

    The K command can be used only on procedures that follow the calling
    conventions used by Microsoft high-level-language compilers.

Examples

    Assume that a breakpoint has been set within the C library printf()
    routine, that the breakpoint has been reached, and that the SYMDEB
    prompt has reappeared. The command

    -K  <Enter>

    produces the following output:

    _TEXT:_printf(00D4,0000,0000) from .dump.C:108
    _TEXT:_dump_para(0000,0000,0FB8) from .dump.C:92
    _TEXT:_dump_rec(0FB8,0001,0000,0000) from .dump.C:61
    _TEXT:_main(?)

    In this example, the breakpointed procedure printf() was called by
    the routine dump_para() with three parameters. Dump_para() was
    called by dump_rec(),  which in turn was called by main(). Because
    SYMDEB cannot determine the depth of the stack frame for the routine
    main(), it displays no parameters for it. The display of at least two
    parameters for every procedure can be forced by the command

    -K 2  <Enter>

    which produces the following example display:

    _TEXT:_printf(00D4,0000,0000) from .dump.C:108
    _TEXT:_dump_para(0000,0000,0FB8) from .dump.C:92
    _TEXT:_dump_rec(0FB8,0001,0000,0000) from .dump.C:61
    _TEXT:_main(0002,1044)

    From a knowledge of C conventions, it follows that the first parameter
    for main() is argc, or the number of tokens in the command line that
    invoked the program being debugged; the second parameter is the offset
    within DGROUP of argv, or an array of pointers to each token.



SYMDEB: L
Load File or Sectors


Purpose

    Loads a file or individual sectors from a disk.

Syntax

    L [address]

    or

    L address drive start number

    where:

    address    is the starting address in memory that data read from a
                disk is placed into.

    drive      is the decimal number (0-3) of the disk to read
                (0 = drive A, 1 = drive B, 2 = drive C, 3= drive D).

    start      is the hexadecimal number of the first sector to load
                (0-FFFFH).

    number     is the hexadecimal number of consecutive sectors to load
                (0-FFFFH).

Description

    The Load File or Sectors (L) command loads a file or individual
    sectors from a disk.

    When the L command is entered without parameters or with an address
    alone, the file specified in the SYMDEB command line or with the most
    recent Name File or Command-Tail Parameters (N) command is loaded from
    the disk into memory. If no segment is specified in address, SYMDEB
    uses CS. If the file's extension is .EXE, the file is placed in
    SYMDEB's target program buffer at the load address specified in the
    .EXE file's header; if the file's extension is .COM, the file is
    loaded at offset 100H. (If for some reason an address is entered for a
    .EXE or .COM file and the address is anything but 100H, an error
    message is displayed; if the address is 100H, it will be ignored.) If
    the file has a .HEX extension, the .HEX file's starting address is
    added to address before loading the file. If address is not
    specified, the .HEX file is placed at its own starting address. The
    length of the file or, in the case of a .EXE file, the actual length
    of the program (the length of the file minus the header) is placed in
    the target program's BX and CX registers, with the most significant 16
    bits in register BX.

    The L command can also be used to bypass the MS-DOS file system and
    obtain direct access to logical sectors on the disk. The memory
    address (address), disk drive number (drive), starting logical sector
    number (start), and number of sectors to read (number) must all be
    specified in the command line.

    Note: The L command should not be used to access logical sectors on
    network drives.

Examples

    To load the file specified in the SYMDEB command line or in the most
    recent N command into SYMDEB's target program buffer, type

    -L  <Enter>

    To load eight sectors from drive B, starting at logical sector 0, to
    memory location CS:0100H in SYMDEB's memory buffer, type

    -L 100 1 0 8  <Enter>

Messages

    Disk error reading disk  <FI>X<FS>
    A hardware-related disk error, such as a checksum error or seek
    incomplete, was encountered during the execution of an L command.

    File not found
    The file specified in the most recent N command cannot be found.



SYMDEB: M
Move (Copy) Data


Purpose

    Copies the contents of one area of memory to another.

Syntax

    M range address

    where:

    range      specifies the starting and ending addresses or the
                starting address and length of the area of memory to be
                copied.

    address    is the first byte of the destination of the copy
                operation.

Description

    The Move (Copy) Data (M) command copies data from one location in
    memory to another without altering the data in the original location.
    If the source and destination areas overlap, the data is copied in the
    correct order so that the resulting copy is correct; the data in the
    original location is changed only when the two areas overlap.

    The range parameter specifies the starting and ending addresses or
    the starting address and length of the memory to be copied. The
    address parameter is the first byte in which the copy will be placed.
    If range does not contain an explicit segment, SYMDEB uses DS; if
    address does not contain a segment, SYMDEB uses the same segment used
    for range.

Example

    To copy the data in locations DS:0800H through DS:08FFH to locations
    DS:0900H through DS:09FFH, type

    -M 800 8FF 900  <Enter>

    or

    -M 800 L100 900  <Enter>



SYMDEB: N
Name File or Command-Tail Parameters


Purpose

    Inserts parameters into the simulated program segment prefix
    (PSP).

Syntax

    N parameter [parameter...]

    where:

    parameter       is a filename or switch to be placed into the
                    simulated PSP.

Description

    The Name File or Command-Tail Parameters (N) command is used to enter
    one or more parameters into the simulated PSP that is built at the
    base of the buffer holding the program to be debugged. The N command
    can also be used before the Load File or Sectors (L) and Write File or
    Sectors (W) commands to name a file to be read from a disk or written
    to a disk.

    The count of the characters following the N command is placed at
    DS:0080H in the simulated PSP and the characters themselves are copied
    into the PSP starting at DS:0081H. The string is terminated by a
    carriage return (0DH), which is not included in the count. If the
    second and third parameters follow the naming conventions for MS-DOS
    files, they are parsed into the default file control blocks (FCBs) in
    the simulated PSP, at offset 5CH and offset 6CH, respectively. Note
    that this is different from the N command in DEBUG, which loads the
    first and second parameters into the default FCBs. (Switches and other
    filenames specified as parameters are stored in the PSP starting at
    offset 81H along with the rest of the command line but are not parsed
    into the default FCBs.)

    If the N command line contains only one filename, any parameters
    placed in the default FCBs by a previous N command are destroyed. If
    the drive included with the second filename parameter is invalid, the
    AL register is set to 0FFH. If the drive included with the third
    filename parameter is invalid, the AH register is set to 0FFH. The
    existence of a file specified with the N command is not verified until
    it is loaded with the L command.

    The filename at DS:0081H specifies the file that is read or written by
    a subsequent L or W command.

Example

    Assume that SYMDEB was started without specifying the name of a target
    program in the command line. To load the program CLEAN.COM for
    execution under the control of SYMDEB and include the parameter
    MYFILE.DAT in the simulated PSP's command tail and FCB, use the N and
    L commands together as follows:

    -N CLEAN.COM  MYFILE.DAT  <Enter>
    -L  <Enter>

    To execute the program CLEAN.COM, type

    -G  <Enter>

    The net effect is the same as if the CLEAN.COM program had been run
    from the MS-DOS command level with the command line

    C>CLEAN MYFILE.DAT  <Enter>

    except that the program is executing under the control of SYMDEB and
    within SYMDEB's memory buffer.



SYMDEB: O
Output to Port


Purpose

    Writes 1 byte to an input/output (I/O) port.

Syntax

    O port byte

    where:

    port       is a 16-bit I/O port address in the range 0 through FFFFH.

    byte       is a value to be written to the I/O port (0-0FFH).

Description

    The Output to Port (O) command writes 1 byte of data to the specified
    I/O port address. The data value must be in the range 00H through
    0FFH.

    Warning: This command must be used with caution because it involves
    direct access to the computer hardware and no error checking is
    performed. Attempts to write to some port addresses, such as those for
    ports connected to peripheral device controllers, timers, or the
    system's interrupt controller, may cause the system to crash or may
    even result in damage to data stored on disk.

Example

    To write the value C8H to I/O port 10AH, type

    -O 10A C8  <Enter>



SYMDEB: P
Proceed Through Loop or Subroutine


Purpose

    Executes a loop, string instruction, software interrupt, or subroutine
    to completion.

Syntax

    P[=address] [number]

    where:

    address    is the location of the first instruction to be executed.

    number     is the number of instructions to execute.

Description

    The Proceed Through Loop or Subroutine (P) command transfers control
    to the target program. The program executes without interruption until
    the loop, repeated string instruction, software interrupt, or
    subroutine call at address is completed or until the specified number
    of machine instructions have been executed. Control then returns to
    SYMDEB and the current contents of the target program's registers and
    flags are displayed.

    Warning: The P command should not be used to execute any instruction
    that changes the contents of the Intel 8259 interrupt mask (ports 20H
    and 21H on the IBM PC and compatibles) and cannot be used to trace
    through ROM. Use the Go (G) command instead.

    If the address parameter does not contain a segment, SYMDEB uses the
    target program's CS register; if address is omitted, execution begins
    at the current address specified by the target's CS:IP registers. The
    address parameter must be preceded by an equal sign (=) to
    distinguish it from number.

    The number parameter specifies the number of instructions to be
    executed before control returns to SYMDEB. If number is omitted, one
    instruction is executed.

    When the Enable Source Display Mode (S+) command is selected, the P
    command operates directly on source-code lines, passing over function
    or procedure calls. (The S+ command can be used only with programs
    created by high-level-language compilers that insert line-number
    information into object modules.)

    When source display mode is disabled with the S- command or when the
    program being debugged does not have a .SYM file or has been created
    with the Microsoft Macro Assembler (MASM) or with a compiler that does
    not support line numbers in relocatable object modules, the P command
    behaves like the Trace Program Execution (T) command except that when
    P encounters a loop, repeated string instruction, software interrupt,
    or subroutine call, it executes it to completion and then returns to
    the instruction following the call. For example, if the user wants to
    trace the first three instructions in a program and if the second
    instruction is a subroutine call, a P3 command executes the first
    instruction, goes to the second instruction, identifies it as a CALL
    instruction, jumps to the subroutine and executes the entire
    subroutine, comes back and executes the third instruction, and then
    stops. A T3 command, on the other hand, executes the first
    instruction, executes the second, executes the first instruction of
    the subroutine as its third instruction, and then stops. If the
    instruction at address is not a loop, repeated string instruction,
    software interrupt, or subroutine call, the P command functions just
    like the T command. After each instruction is executed, SYMDEB
    displays the current contents of the target program's registers and
    flags and the next instruction to be executed.

Examples

    Assume that the program being debugged was compiled with Microsoft C,
    a .SYM file was loaded with the executable program to provide line-
    number information, and source-code display has been enabled with the
    S+ command.  To execute the machine instructions corresponding to the
    next four lines of source code, type

    -P 4  <Enter>

    Assume that the target program was created with MASM and location
    CS:143FH contains a CALL instruction. To execute the subroutine that
    is the destination of CALL at full speed and then return control to
    SYMDEB, type

    -P =143F  <Enter>



SYMDEB: Q
Quit


Purpose

    Ends a SYMDEB session.

Syntax

    Q

Description

    The Quit (Q) command terminates the SYMDEB program and returns control
    to MS-DOS or the command shell that invoked SYMDEB. Any changes made
    to a program or other file that were not previously saved to disk with
    the Write File or Sectors (W) command are lost when the Q command is
    used.

Example

    To exit SYMDEB, type

    -Q  <Enter>



SYMDEB: R
Display or Modify Registers


Purpose

    Displays one or all registers and allows a register to be
    modified.

Syntax

    R

    or

    R register [[=] value]

    where:

    register   is the two-character name of an Intel 8086/8088 register
                from the following list:

                AX BX CX DX SP BP SI DI DS ES SS CS IP PC

                or the character F, to indicate the CPU flags.

    =          is an optional equal sign preceding value.

    value      is a 16-bit integer (0-FFFFH) that will be assigned to
                the specified register.

Description

    The Display or Modify Registers (R) command allows the target
    program's register contents and CPU flags to be displayed and
    modified.

    If R is entered without a register parameter, the current contents of
    all registers and CPU flags are displayed, followed by a disassembly
    of the machine instruction currently pointed to by the target
    program's CS:IP registers.

    A register can be assigned a new value in a single command by entering
    both register and value parameters, optionally separated by an equal
    sign (=). If a register is named but no value is supplied, SYMDEB
    displays the current contents of the specified register and then
    prompts with a colon character (:) for a new value to be placed in the
    register. The user can enter the value in any valid radix or as an
    expression and then press the Enter key. If no radix is appended to
    the new value, hexadecimal is assumed. If the user presses the Enter
    key alone in response to the prompt, no changes are made to the
    register contents.

    Note: The PC register name is not supported properly in some versions
    of SYMDEB, so the IP register name should always be used
    instead.

    Use of the character F instead of a register name causes SYMDEB to
    display the current status of the traced program's CPU flags as a set
    of two-character codes from the following list:

╓┌─────────────────┌───────────────────┌─────────────────────────────────────╖
    Flag Name    Value If Set (1)    Value If Clear (0)
    ──────────────────────────────────────────────────────────────────────
    Overflow     OV (Overflow)       NV (No Overflow)
    Direction    DN (Down)           UP (Up)
    Interrupt    EI (Enabled)        DI (Disabled)
    Sign         NG (Minus)          PL (Plus)
    Zero         ZR (Zero)           NZ (Not Zero)
    Aux Carry    AC (Aux Carry)      NA (No Aux Carry)
    Parity       PE (Even)           PO (Odd)
    Carry        CY (Carry)          NC (No Carry)

    After displaying the current flag values, SYMDEB again displays its
    prompt (-). Any or all of the individual flags can then be altered by
    typing one or more two-character flag codes (in any order and
    optionally separated by spaces) from the list above and then pressing
    the Enter key. If the user responds to the prompt by pressing the
    Enter key without entering any codes, no changes are made to the
    status of the flags.

Examples

    To display the current contents of the target program's CPU registers
    and flags, followed by the disassembled mnemonic for the next
    instruction to be executed (pointed to by CS:IP), type

    -R  <Enter>

    This produces the following display:

    AX=0000  BX=0000  CX=00A1  DX=0000  SP=FFFE  BP=0000 SI=0000  DI=0000
    DS=19A5  ES=19A5  SS=19A5  CS=19A5  IP=0100   NV UP EI PL NZ NA PO NC
    19A5:0100 BF8000       MOV   DI,0080

    If the source display mode is enabled, the R command displays the
    following:

    AX=0000  BX=1044  CX=0000  DX=0102  SP=103C  BP=0000  SI=00EA  DI=115E
    DS=2143  ES=2143  SS=2143  CS=1F6E  IP=0010   NV UP EI PL ZR NA PE NC
    32:    int   argc;
    _TEXT:_main:
    1F6E:0010 55             PUSH    BP                            ;BR0

    This format includes the source code that corresponds to the next
    instruction to be executed.

    To set the contents of register AX to FFFFH without displaying its
    current value, type

    -R AX=FFFF  <Enter>

    or

    -R AX -1  <Enter>

    To display the current value of the target program's BX register, type

    -R BX  <Enter>

    If BX contains 200H, for example, SYMDEB displays that value and then
    issues a prompt in the form of a colon:

    BX 0200
    :

    The contents of BX can then be altered by typing a new value and
    pressing the Enter key, or the contents can be left unchanged by
    pressing the Enter key alone.

    To set the direction and carry flags, first type

    -R F  <Enter>

    SYMDEB displays the current flag values, followed by a prompt in the
    form of a hyphen character (-). For example:

    NV UP EI PL NZ NA PO NC  -

    The direction and carry flags can then be set by entering

    -DN CY  <Enter>

    on the same line as the prompt.

Messages

    Bad Flag!
    An invalid code for a CPU flag was entered.

    Bad Register!
    An invalid register name was entered.

    Double Flag!
    Two values for the same CPU flag were entered in the same
    command.



SYMDEB: S
Search Memory


Purpose

    Searches memory for a pattern of one or more bytes.

Syntax

    S range list

    where:

    range      is the starting and ending address or the starting address
                and length in bytes of the area to be searched.

    list       is one or more byte values or a string to be searched for.

Description

    The Search Memory (S) command searches a designated range of memory
    for a sequence of byte values or text strings and displays the
    starting address of each set of matching bytes. The contents of the
    searched area are not altered.

    The range parameter specifies the starting and ending address or the
    starting address and length in bytes of the area to be searched. If a
    segment is not included in range, SYMDEB uses DS. If a segment is
    specified only for the starting address, SYMDEB uses the same segment
    for the ending address. If a starting address and length in bytes are
    specified, the starting address plus the length less 1 cannot exceed
    FFFFH.

    The list parameter is one or more hexadecimal byte values and/or
    strings separated by spaces, commas, or tab characters. Strings must
    be enclosed in single or double quotation marks, and case is
    significant within a string.

Examples

    To search for the string Copyright in the area of memory from
    DS:0000H through DS:1FFFH, type

    -S 0 1FFF 'Copyright'  <Enter>

    or

    -S 0 L2000 "Copyright"  <Enter>

    If a match is found, SYMDEB displays the address of each
    occurrence:

    20A8:0910
    20A8:094F
    20A8:097C

    To search for the byte sequence 3BH 06H in the area of memory from
    CS:0100H through CS:12A0H, type

    -S CS:100 12A0 3B 06  <Enter>

    or

    -S CS:100 L11A1 3B 06  <Enter>



SYMDEB: S+
Enable Source Display Mode


Purpose

    Displays source-code lines, rather than machine instructions.

Syntax

    S+

Description

    The Enable Source Display Mode (S+) command affects the display format
    of certain SYMDEB commands: Proceed Through Loop or Subroutine (P),
    Trace Program Execution (T), and Display or Modify Registers (R). The
    S+ command causes source code, rather than disassembled machine
    instructions, to be displayed by those commands.

    The S+ command is useful only if the program being debugged was
    created with a high-level-language compiler capable of placing line-
    number information into the relocatable object modules processed by
    the Microsoft Object Linker (LINK). When debugging Microsoft Macro
    Assembler (MASM) programs or programs generated by language compilers
    that do not pass line-number information to LINK, the S+ command has
    no effect.

Example

    To enable the display of source-code statements during debugging,
    type

    -S+  <Enter>



SYMDEB: S-
Disable Source Display Mode


Purpose

    Displays disassembled machine instructions, rather than source-code
    lines.

Syntax

    S-

Description

    The Disable Source Display Mode (S-) command affects the display
    format of certain SYMDEB commands: Proceed Through Loop or Subroutine
    (P), Trace Program Execution (T), and Display or Modify Registers (R).
    The S- command causes disassembled machine instructions, rather than
    source code, to be displayed by those commands. By default, SYMDEB
    displays disassembled machine instructions when debugging Microsoft
    Macro Assembler (MASM) programs or programs generated by language
    compilers that do not pass line-number information to the Microsoft
    Object Linker (LINK).

Example

    To disable the display of source-code statements during debugging,
    type

    -S-  <Enter>



SYMDEB: S&
Enable Source and Machine Code Display Mode


Purpose

    Displays both source-code lines and disassembled machine
    instructions.

Syntax

    S&

Description

    The Enable Source and Machine Code Display Mode (S&) command affects
    the display format of certain SYMDEB commands: Proceed Through Loop or
    Subroutine (P), Trace Program Execution (T), and Display or Modify
    Registers (R). The S& command causes both the disassembled machine
    instructions and the corresponding source-code lines to be displayed
    by those commands.

    The S& command is useful only if the program being debugged was
    created with a high-level-language compiler capable of placing line-
    number information into the relocatable object modules processed by
    the Microsoft Object Linker (LINK). When debugging Microsoft Macro
    Assembler (MASM) programs or programs generated by language compilers
    that do not pass line-number information to LINK, the S& command has
    no effect.

Example

    To enable the display of both source-code statements and disassembled
    machine-code statements during debugging, type

    -S&  <Enter>



SYMDEB: T
Trace Program Execution


Purpose

    Executes one or more machine instructions in single-step mode.

Syntax

    T[=address] [number]

    where:

    address     is the location of the first instruction to be executed.

    number      is the number of machine instructions to be executed.

Description

    The Trace Program Execution (T) command executes one or more machine
    instructions, starting at the specified address. If source display
    mode has been enabled with the S+ command, each trace operation
    executes the machine code corresponding to one source statement and
    displays the lines from the source code. If source display mode has
    been disabled with the S- command, each trace operation executes an
    individual machine instruction and displays the contents of the CPU
    registers and flags after execution.

    Warning: The T command should not be used to execute any instruction
    that changes the contents of the Intel 8259 interrupt mask (ports 20H
    and 21H on the IBM PC and compatibles). Use the Go (G) command
    instead.

    The address parameter points to the first instruction to be executed.
    If address does not include a segment, SYMDEB uses the target
    program's CS register; if address is omitted entirely, execution is
    begun at the current address specified by the target program's CS:IP
    registers. The address parameter must be preceded by an equal sign (=)
    to distinguish it from number.

    The number parameter specifies the hexadecimal number of source-code
    statements or machine instructions to be executed before the SYMDEB
    prompt is displayed again (default = 1). If source display mode is
    enabled, the number parameter is required. Execution of a sequence of
    instructions using the T command can be interrupted at any time by
    pressing Ctrl-C or Ctrl-Break and can be paused by pressing Ctrl-S
    (pressing any key resumes the trace).

Examples

    To execute one instruction at location CS:1A00H and then return
    control to SYMDEB, displaying the contents of the CPU registers and
    flags, type

    -T =1A00  <Enter>

    Consecutive instructions can then be executed by entering repeated T
    commands with no parameters.

    If source display mode has been enabled with a previous S+ command, to
    begin execution at the label main and continue through the machine
    code corresponding to four source- code statements, type

    -T =main 4  <Enter>



SYMDEB: U
Disassemble (Unassemble) Program


Purpose

    Disassembles machine instructions into assembly-language
    mnemonics.

Syntax

    U [range]

    where:

    range      specifies the starting and ending addresses or the
                starting address and the number of instructions of the
                machine code to be disassembled.

Description

    The Disassemble (Unassemble) Program (U) command translates machine
    instructions into their assembly-language mnemonics.

    The range parameter specifies the starting and ending addresses or
    the starting address and number of machine instructions to be
    disassembled. If range does not include an explicit segment, SYMDEB
    uses CS. Note that the resulting disassembly will be incorrect if the
    starting address does not fall on an 8086 instruction boundary.

    If range does not include the number of machine instructions to be
    executed or an ending address, eight instructions are disassembled. If
    range is omitted completely, eight instructions are disassembled
    starting at the address following the last instruction disassembled by
    the previous U command, if a U command has been used; if no U command
    has been used, eight instructions are disassembled starting at the
    address specified by the current value of the target program's CS:IP
    registers.

    The display format for the U command depends on the current source
    display mode setting and on whether the program was developed with a
    compatible high-level-language compiler. If the source display mode
    setting is S- or the program was developed with the Microsoft Macro
    Assembler (MASM) or a noncompatible high-level-language compiler, the
    display contains only the address and the disassembled equivalent of
    each instruction within range. (For 8-bit immediate operands, SYMDEB
    also displays the ASCII equivalent as a comment following a
    semicolon.) If the setting is S+ or S& and a compatible symbol file
    containing line-number information was loaded with the program being
    debugged, the display contains both the source-code lines and their
    corresponding disassembled machine instructions.

    Note: The 80286 instructions that are considered privileged when the
    microprocessor is running in protected mode are not supported by
    SYMDEB's disassembler.

Examples

    To disassemble four machine instructions starting at CS:0100H,
    type

    -U 100 L4  <Enter>

    This produces the following display:

    44DC:0100 EC             IN     AL,DX
    44DC:0101 B80200         MOV    AX,0002
    44DC:0104 E86102         CALL   0368
    44DC:0107 57             PUSH   DI

    Successive eight-instruction fragments of machine code can be
    disassembled by entering additional U commands without
    parameters.

    When a program is being debugged with a symbol file that contains
    line-number information and source display mode has been enabled,
    disassembled machine code is accompanied by the corresponding source
    code:

    43:        if (argc != 2)
    28A5:0031 837E0402       CMP    Word Ptr [BP+04],+02
    28A5:0035 7503           JNZ    _main+2A (003A)
    28A5:0037 E91400         JMP    _main+3E (004E)
    44:         {  fprintf(stderr,"\ndump: wrong number of parameters\n");
    28A5:003A B83600         MOV    AX,0036
    28A5:003D 50             PUSH   AX
    28A5:003E B8F600         MOV    AX,00F6
    28A5:0041 50             PUSH   AX
    28A5:0042 E8AC04         CALL   _fprintf
    28A5:0045 83C404         ADD    SP,+04
    45:                return(1);
    28A5:0048 B80100         MOV    AX,0001
    28A5:004B E9AA00         JMP    _main+E8 (00F8)



SYMDEB: V
View Source Code


Purpose

    Displays lines from the source-code file for the program being
    debugged.

Syntax

    V address [length]

    or

    V [.sourcefile:linenumber]

    where:

    address         is the location of an executable instruction in the
                    target program.

    length          is an ending address or the number of source-code
                    lines.

    .sourcefile     is the base name of the source file of the program
                    being debugged, preceded by a period (.).

    linenumber      is the first literal line number of .sourcefile to
                    be displayed.

Description

    The View Source Code (V) command displays lines of source code for the
    program being debugged, beginning at the location specified by
    address. If address does not include a segment, SYMDEB uses the
    target program's CS register.

    The optional length parameter can be an ending address or an L
    followed by a hexadecimal number of source-code lines. If length is
    not specified, eight lines of source code are displayed.

    If the .sourcefile parameter is specified, followed by a colon
    character (:) and a line number, eight lines of source code are
    displayed, starting at linenumber. If the V command is entered
    without parameters after the .sourcefile:linenumber parameter has
    been specified, eight lines are displayed from the current source
    file, beginning with the line after the last line displayed with the V
    command. The .sourcefile parameter must be the name of a high-level-
    language source file in the current directory. Pathnames and
    extensions are not supported. The length option cannot be used with
    the .sourcefile parameter.

    Warning: Specifying a file that does not exist in the current
    directory may cause the system to crash.

    The V command can be used only with programs created by a high-level-
    language compiler that is capable of placing line-number information
    into the relocatable object modules processed by the Microsoft Object
    Linker (LINK). The current source display mode setting (S-, S+, or S&)
    has no effect on the V command.

Examples

    Assume that the program DUMP.EXE is being debugged with the aid of the
    symbol file DUMP.SYM and that the source file DUMP.C is available in
    the current directory. To display eight lines of source code beginning
    at the label main, type

    -V _main  <Enter>

    This produces the following output:

32:        int   argc;
33:        char  *argv[];
34:
35:    {   FILE *dfile;              /* control block for input file */
36:        int status = 0;           /* status returned from file read */
37:        int file rec = 0;         /* file record number being dumped */
38:        long file ptr = 0L;       /* file byte offset for current rec */
39:        char file buf[REC SIZE];  /* data block from file */

    To view eight lines of source code from the file DUMP.C, beginning
    with line 20, type

    -V .DUMP:20  <Enter>

Message

    Source file for filename (cr for none)?
    The current directory does not contain the source file specified with
    the .sourcefile parameter. Enter the correct filename or press Enter
    to indicate no source file.



SYMDEB: W
Write File or Sectors


Purpose

    Writes a file or individual sectors to disk.

Syntax

    W [address]

    or

    W address drive start number

    where:

    address    is the first location in memory of the data to be written.

    drive      is the number of the destination disk drive (0 = drive A,
                1 = drive B, 2 = drive C, 3 = drive D).

    start      is the number of the first logical sector to be written
                (0-FFFFH).

    number     is the number of consecutive sectors to be written (0-
                FFFFH).

Description

    The Write File or Sectors (W) command transfers a file or individual
    sectors from memory to disk.

    When the W command is entered without parameters or with an address
    alone, the number of bytes specified by the contents of registers
    BX:CX are written from memory to the file named by the most recent
    Name File or Command-Tail Parameters (N) command or to the first file
    specified in the SYMDEB command line if the N command has not been
    used.

    Note: If a Go (G), Proceed Through Loop or Subroutine (P), or Trace
    Program Execution (T) command was previously used or the contents of
    the BX or CX registers were changed, BX:CX must be restored before the
    W command is used.

    When address is not included in the command line, SYMDEB uses the
    target program's CS:0100H. Files with a .EXE or .HEX extension cannot
    be written with the W command.

    The W command can also be used to bypass the MS-DOS file system and
    obtain direct access to logical sectors on the disk. To use the W
    command in this way, the memory address (address), disk unit number
    (drive), starting logical sector number (start), and number of sectors
    to be written (number) must all be provided in the command line in
    hexadecimal format.

    Warning: Extreme caution should be used with the W command. The
    disk's file structure can easily be damaged if the command is entered
    incorrectly. The W command should not be used to write logical sectors
    to network drives.

Example

    Assume that the interactive Assemble Machine Instructions (A) command
    was used to create a program in SYMDEB's memory buffer that is 32
    (20H) bytes long, beginning at offset 100H. This program can be
    written into the file QUICK.COM by sequential use of the Name File or
    Command-Tail Parameters (N), Display or Modify Registers (R), and
    Write File or Sectors (W) commands. First, use the N command to
    specify the name of the file to be written:

    -N QUICK.COM  <Enter>

    Next, use the R command to set registers BX and CX to the length to be
    written. Register BX contains the upper half or most significant part
    of the length; register CX contains the lower half or least
    significant part. Type

    -R CX  <Enter>

    SYMDEB displays the current contents of register CX and issues a colon
    character (:) prompt . Enter the length after the prompt:

    :20  <Enter>

    To use the R command again to set the BX register to zero, type

    -R BX  <Enter>

    Then type

    :0  <Enter>

    To create the disk file QUICK.COM and write the program into it,
    type

    -W  <Enter>

    SYMDEB responds:

    Writing 0020 bytes

Messages

    EXE and HEX files cannot be written
    Files with a .EXE or .HEX extension cannot be written to disk with the
    W command.

    Writing nnnn bytes
    After a successful write operation, SYMDEB displays in hexadecimal
    format the number of bytes written to disk.



SYMDEB: X
Examine Symbol Map


Purpose

    Displays names and addresses in the symbol maps.

Syntax

    X[*]

    or

    X? [map!] [segment:] [symbol]

    where:

    map!        is the name of a symbol file, without the .SYM extension,
                followed by an exclamation point (!).

    segment:    is the name of a segment within the currently open or
                specified map, followed by a colon character (:).

    symbol      is a symbol name within the specified segment.

Description

    The Examine Symbol Map (X) command displays the addresses and names of
    symbols in the currently open symbol maps. (SYMDEB maintains a symbol
    map for each symbol file specified in the SYMDEB command line.)

    If the X command is followed by the asterisk wildcard character (*),
    the map names, segment names, and segment addresses for all currently
    loaded symbol maps are displayed. If X is entered alone, the
    information is displayed only for the active symbol map.

    Information from the symbol maps can be displayed selectively by
    following the X? command with the map!, segment:, and symbol
    parameters. The three parameters may be used individually or in
    combination, but at least one parameter must be specified.

    The map! parameter must be terminated by an exclamation point and
    consists of the name, without the extension, of a previously loaded
    symbol file. If map! is omitted, SYMDEB uses the currently open symbol
    map. If more than one .SYM file is specified in the command line, the
    one with the same name as the program being debugged is opened first.

    The segment: parameter must be terminated with a colon; it is the name
    of a segment declared within the specified or currently open symbol
    map.

    The symbol parameter is the name of a label, variable, or other
    object within the specified segment.

    Any or all parameters can consist of or include the asterisk wildcard
    character. For example, X?* displays everything in the current map.

Examples

    Assume that the program DUMP.EXE is being debugged with the symbol
    file DUMP.SYM. If the following is typed

    -X  <Enter>

    SYMDEB displays:

    [456E DUMP]
        [456E _TEXT]
            4743 DGROUP

    This indicates that the program contains one executable code segment
    (named _TEXT), which is loaded at segment 456EH, and one NEAR DATA
    group and segment (named DGROUP), which is loaded at segment 4743H.

    To display the addresses of all procedures in the same example program
    whose names begin with the character f, type

    -X? _TEXT:_F*  <Enter>

    This produces the following listing:

    _TEXT: (456E)
    0428 _fclose           04CB _fopen            04F1 _fprintf
    0528 _fread            0ACB _fflush           0BC2 _free
    19AD _flushall

    Note: Unlike the Microsoft C Compiler, SYMDEB is not case
    sensitive.



SYMDEB: XO
Open Symbol Map


Purpose

    Selects the active symbol map and/or segment.

Syntax

    XO [map!] [segment]

    where:

    map!       is the name of a symbol file, without the .SYM extension,
                followed by an exclamation point (!).

    segment    is the name of the segment that will become the active
                segment in the current symbol map.

Description

    The Open Symbol Map (XO) command selects the active symbol map and/or
    the active segment within the current symbol map to be used during
    debugging.

    The optional map! parameter must be terminated by an exclamation point
    and must be the name, without the extension, of a symbol file
    specified in the original SYMDEB command line. If map! is omitted, no
    changes are made to the active symbol map.

    The optional segment parameter must be the name of a segment within
    the current or specified symbol map. All segments in the active symbol
    map are accessible; the active segment is searched first for symbols
    specified in other SYMDEB commands. If segment is omitted and a new
    active symbol map is specified, the segment with the smallest address
    in the new active symbol map will become the active segment.

Examples

    Assume that the program SHELL.EXE has been loaded with the two symbol
    files SHELL.SYM and VIDEO.SYM. To use the information loaded from
    VIDEO.SYM as the active symbol map for debugging, type

    -XO VIDEO!  <Enter>

    Subsequent entry of the command

    -XO _TEXT  <Enter>

    causes the segment _TEXT within the symbol map VIDEO to be searched
    first for symbol names.

Message

    Symbol not found
    The specified symbol map or segment does not exist.



SYMDEB: Z
Set Symbol Value


Purpose

    Assigns a value to a symbol.

Syntax

    Z [map!] symbol value

    where:

    map!       is the name of a symbol file, without the .SYM extension,
                followed by an exclamation point (!).

    symbol     is an existing symbol name in the active symbol map or in
                the symbol map specified by map!.

    value      is the new address of symbol (0-FFFFH).

Description

    The Set Symbol Value (Z) command allows the address associated with a
    name in one of the loaded symbol maps to be overridden by a new
    value.

    Note that altering the address of a symbol at debugging time will not
    affect other addresses or values that were derived from the value of
    the same symbol at compilation or assembly time.

    The optional map! parameter must be terminated by an exclamation point
    and must be the name, without the extension, of a symbol file
    specified in the original SYMDEB command line. If map! is omitted,
    SYMDEB uses the active symbol map.

    The symbol parameter specifies the name of a label, variable, or
    other object in map! or the active symbol map.

    The value parameter specifies a new address to be associated with
    symbol.

    To debug programs created with older versions of FORTRAN and Pascal
    (Microsoft versions earlier than 3.3 or IBM versions earlier than
    2.0), the user must start SYMDEB, locate the first procedure of the
    program being debugged, and then use the Z command to set the address
    of DGROUP to the current value of the DS register. (Later versions of
    FORTRAN and Pascal do this by default.)

Examples

    To change the segment address for the symbol DGROUP to 5000H, type

    -Z DGROUP 5000  <Enter>

    The actual data associated with the label DGROUP must be moved to the
    new address before debugging can continue.

    To change the segment address for the symbol CODE in the inactive
    symbol map COUNT to 0F00H, type

    -Z COUNT! CODE F00  <Enter>



SYMDEB: <
Redirect SYMDEB Input


Purpose

    Redirects input to SYMDEB.

Syntax

    < device

    where:

    device     is the name of any MS-DOS device or file.

Description

    The Redirect SYMDEB Input (<) command causes SYMDEB to read its
    commands from the specified text file or character device, rather than
    from the keyboard (CON).

    The device parameter specifies the name of any MS-DOS device or file
    from which commands will be read. If the device parameter is a
    filename, the file must be an ASCII text file and each command in the
    file must be on a separate line.

    If input will be taken from a terminal attached to one of the serial
    communications ports (AUX, COM1, or COM2), the port must be properly
    configured with the MODE command before the SYMDEB session is
    started.

    When SYMDEB commands are redirected from a file, the last entry in the
    file must be either the < CON command, which restores the keyboard as
    the input device, or the Quit (Q) command.  Otherwise, SYMDEB will
    lock and the system will have to be restarted.

Examples

    Assume that the text file FILL.TXT contains the following SYMDEB
    commands:

    F CS:0100 L100 00
    D CS:0100 L100
    R
    Q

    To process FILL.TXT during a SYMDEB session (which in turn exits
    SYMDEB with the Quit [Q] command), type

    -< FILL.TXT  <Enter>

    Assume that the text file SEARCH.TXT contains the following SYMDEB
    commands:

    S BUFFER L2000 "error"
    < CON

    To process SEARCH.TXT during a SYMDEB session and return control to
    the console, type

    -< SEARCH.TXT  <Enter>



SYMDEB: >
Redirect SYMDEB Output


Purpose

    Redirects SYMDEB's output to a device or file.

Syntax

    > device

    where:

    device     is the name of any MS-DOS device or file.

Description

    The Redirect SYMDEB Output (>) command causes SYMDEB to send all its
    messages to the specified device or file, rather than to the video
    display (CON). This is useful for creating a record of a debugging
    session that can be viewed later with an editor or listed on a
    printer.

    After SYMDEB output is redirected, commands typed on the keyboard are
    not echoed to the video display. Therefore, the user must know in
    advance which commands to use and which parameters to supply.

    The device parameter specifies the name of an MS-DOS device or file
    to receive SYMDEB's output. If output will be redirected to one of the
    serial communications ports (AUX, COM1, or COM2), the port must be
    properly configured with the MODE command before the SYMDEB session is
    started.

    Output can be restored to the video display by entering the > CON
    command or by terminating SYMDEB with the Quit (Q) command.

Examples

    To cause SYMDEB to send all prompts and messages to the file
    SESSION.TXT, type

    -> SESSION.TXT  <Enter>

    After this command, new commands are still accepted by SYMDEB, but the
    keypresses are not echoed to the screen until the command

    -> CON  <Enter>

    is entered or SYMDEB is terminated with the Quit (Q) command.

    To cause SYMDEB to send all its prompts and messages to the standard
    printing device, PRN, type

    -> PRN  <Enter>



SYMDEB: =
Redirect SYMDEB Input and Output


Purpose

    Redirects both input and output for SYMDEB.

Syntax

    = device


    where:

    device     is the name of any MS-DOS device.

Description

    The Redirect SYMDEB Input and Output (=) command causes SYMDEB to read
    its commands from and send its output to the specified device, rather
    than reading from the keyboard and sending output to the video display
    (CON). This command is especially useful for debugging programs that
    run in graphics mode; the SYMDEB commands can be entered on a terminal
    attached to the computer's serial port while the graphics program has
    the full use of the system's video display.

    The device parameter specifies the name of any MS-DOS device. If
    input and output will be redirected to one of the serial
    communications ports (AUX, COM1, or COM2), the port must be properly
    configured with the MODE command before the SYMDEB session is started.

    Input and output can be restored to the standard settings with the =
    CON command.

Example

    To redirect SYMDEB's input and output to the first serial
    communications port (COM1), type

    -= COM1  <Enter>



SYMDEB: {
Redirect Target Program Input


Purpose

    Redirects input to the program being debugged.

Syntax

    { device

    where:

    device     is the name of any MS-DOS device or file.

Description

    The Redirect Target Program Input ({) command causes read operations
    by the program being debugged to be taken from the specified file or
    device when the program is executed, rather than from the keyboard
    (CON).

    The device parameter specifies the name of an MS-DOS device or file
    from which the target program will read. If the device parameter is a
    filename, the file must be an ASCII text file and each command in the
    file must be on a separate line.

    If input will be taken from a terminal attached to one of the serial
    communications ports (AUX, COM1, or COM2), the port must be properly
    configured with the MODE command before the SYMDEB session is
    started.

Example

    To cause input for the program being debugged to be taken from the
    file TEST.TXT, type

    -{ TEST.TXT  <Enter>



SYMDEB: }
Redirect Target Program Output


Purpose

    Redirects the output of the program being debugged.

Syntax

    } device

    where:

    device     is the name of any MS-DOS device or file.

Description

    The Redirect Target Program Output (}) command causes write operations
    by the program being debugged to be redirected to the specified device
    or file when the program is executed, rather than to the video display
    (CON). This is useful for capturing the output of a program in a file
    for later listing on a printer.

    The device parameter specifies the name of an MS-DOS device or file
    to receive the target program's output. If output will be redirected
    to one of the serial communications ports (AUX, COM1, or COM2), the
    port must be properly configured with the MODE command before the
    SYMDEB session is started.

Example

    To send the output from the program being debugged to the file
    SESSION.TXT, type

    -} SESSION.TXT  <Enter>



SYMDEB: ~
Redirect Target Program Input and Output


Purpose

    Redirects both input and output for the program being debugged.

Syntax

    ~ device

    where:

    device     is the name of any MS-DOS device.

Description

    The Redirect Target Program Input and Output (~) command causes all
    read and write operations by the program being debugged to be
    redirected to the specified character device.

    The device parameter specifies the name of an MS-DOS device that the
    target program will read from and write to. If input and output are
    redirected to one of the serial communications ports (AUX, COM1, or
    COM2), the port must be properly configured with the MODE command
    before the SYMDEB session is started.

Example

    To redirect input and output for the program being debugged to the
    first serial communications port (COM1), type

    -~ COM1  <Enter>



SYMDEB: \
Swap Screen


Purpose

    Exchanges the SYMDEB display for the target program's display.

Syntax

    \

Description

    The Swap Screen (\) command causes the SYMDEB status display to be
    exchanged for the virtual screen used by the program being debugged.
    After the program's output has been inspected on the virtual screen,
    the SYMDEB display can be restored by pressing any key. This command
    is useful for debugging programs that perform direct screen access or
    run in graphics mode.

    Note: Any information on the display when SYMDEB was invoked will
    also appear on the virtual screen. When SYMDEB is terminated, the
    current display is set to match the virtual screen.

    The Swap Screen command is available only if the /S switch (or the /I
    switch, if the computer is IBM compatible) preceded the names of the
    symbol and program files in the original SYMDEB command line.

Example

    To exchange the SYMDEB status display for the virtual screen of the
    program being debugged, type

    -\  <Enter>

    To restore the SYMDEB display, press any key.



SYMDEB: .
Display Source Line


Purpose

    Displays the current source-code line.

Syntax

    .

Description

    The Display Source Line (.) command displays the line from the source-
    code file that corresponds to the machine instruction currently
    pointed to by the target program's CS:IP registers.

    The . command is independent of the current Source Display Mode status
    (S+, S-, or S&). However, if the program being debugged was not
    created with a high-level-language compiler that inserts line numbers
    into the object modules, the . command has no effect.

Example

    To display the source-code line corresponding to the next instruction
    to be executed, type

    -.  <Enter>

    This produces output in the following form:

    56:        printf( '\nDump of file: %s ', argv[1] );



SYMDEB: ?
Help or Evaluate Expression


Purpose

    Displays the help screen or the value of an expression.

Syntax

    ? [expression]

    where:

    expression      is any valid combination of symbols, addresses,
                    numbers, and operators.

Description

    When ? is entered alone, a help screen summarizing all valid SYMDEB
    commands, operators, and types is displayed.

    When ? is followed by the expression parameter, expression is
    evaluated and the value is displayed. The expression parameter can
    include any valid combination of symbols, addresses, numbers, and
    operators.

    The form and content of the resulting display depends on the type of
    expression entered. If expression is a symbol or an address
    (optionally including operators), the value is shown first as a FAR
    address pointer in the form segment:offset, then as a 32-bit
    hexadecimal number representing the value's physical location in
    memory (followed by its decimal equivalent in parentheses), and
    finally as the physical location's ASCII character equivalents
    displayed as a string enclosed in quotation marks (which have no
    practical value if expression is an address or symbol).

    If expression includes numbers (interpreted as signed hexadecimal
    values unless a radix is specified) and operators, the resulting value
    is shown first as a 16-bit hexadecimal value, then as a 32-bit
    hexadecimal value (followed by its decimal equivalent in parentheses),
    and finally as the value's ASCII character equivalents displayed as a
    string enclosed in quotation marks.

    (The ASCII characters within the string are displayed as dots if their
    value is less than 20H [32] or greater than 7EH [126].)

Examples

    Assume that the pointer array argv in the program DUMP.C is located
    at address 4743:029CH. The command

    -? _argv+4  <Enter>

    produces the following display:

    4743:02A0h  000476D0  (292560)

    To display the result of an exclusive OR operation between the values
    0FCH and 14H, type

    -? FC XOR 14  <Enter>

    SYMDEB displays

    00E8h  000000E8  (232)



SYMDEB: !
Escape to Shell


Purpose

    Invokes the MS-DOS command processor.

Syntax

    ! [command]

    where:

    command         is the name of any MS-DOS command, program, or batch
                    file and its required parameters.

Description

    The Escape to Shell (!) command loads a copy of the system's command
    processor (COMMAND.COM), optionally passing it the name of a program
    or batch file to be executed. This allows MS-DOS functions such as
    listing or copying files to be carried out without losing the context
    of the debugging session.

    If the ! command is entered alone, an additional copy of COMMAND.COM
    gains control and displays the system prompt. Control can be returned
    to SYMDEB by leaving the new shell with the EXIT command.

    If the ! character is followed by a command parameter that specifies
    any valid MS-DOS command, program name, or batch-file name, the
    specified command is executed immediately and control returns directly
    to SYMDEB.

    The SYMDEB statement connector (;) cannot be used on the same line as
    the ! command; all text encountered after this command is passed to
    COMMAND.COM and is interpreted as an MS-DOS command line.

Example

    To list the files in the current directory, type

    -! DIR /W  <Enter>

Messages

    COMMAND.COM not found!
    SYMDEB could not find COMMAND.COM because it was not present in the
    directory location specified in the environment block's COMSPEC
    variable.

    Not enough memory!
    Free memory in the transient program area (TPA) is insufficient to
    execute the requested command or program. This is a common occurrence
    when debugging a large program with symbol files.



SYMDEB: *
Enter Comment


Purpose

    Allows insertion of a comment that will be ignored by SYMDEB's command
    interpreter.

Syntax

    *text

    where:

    text       is any ASCII text up to and including a carriage return.

Description

    The Enter Comment (*) command causes the remainder of the text on that
    line to be ignored, thereby providing a means of commenting a SYMDEB
    debugging session. SYMDEB echoes any text following the asterisk to
    the screen or redirected output device, providing the user with a
    convenient way to comment program output redirected to a file or a
    printer. A maximum of 78 characters can be included on each comment
    line. Comment lines are also useful for documenting lines within a
    text file that SYMDEB will use as redirected input for the program
    being debugged.

Example

    To echo the reminder Errors in program output start here: to the
    screen or redirected output device, type

    -*Errors in program output start here:  <Enter>

    A line in a text file that will be used by SYMDEB for redirected input
    to the program being debugged may be "commented out" by inserting an
    asterisk at the beginning of the line. For example:

    *EB CS:1200 90



CodeView
Window-Oriented Debugger


Purpose

    Allows the controlled execution of an assembly-language program or
    high-level-language program for debugging purposes. Both source code
    and the corresponding unassembled machine code can be displayed as
    program execution is traced. In addition, watch variables, CPU
    registers and flags, and program output can be examined in separate
    debugging windows. CodeView is supplied with the Microsoft Macro
    Assembler (MASM), C Compiler, Pascal Compiler, and FORTRAN Compiler.
    This documentation describes CodeView version 2.0.

Syntax

    CV [options] exe_file [parameters]

    where:

    exe_file        is the name of the executable file containing the
                    program to be debugged (default extension = .EXE).

    parameters      is one or more filenames or switches required by the
                    program being debugged.

    options         is one or more switches from the following list.
                    Switches can be either uppercase or lowercase and
                    can be preceded by a dash (-) instead of a forward
                    slash (/).

                    /2           Allows the use of two video displays for
                                debugging.

                    /43          Enables 43-line display mode. (An IBM-
                                compatible computer with an enhanced
                                graphics adapter [EGA] and an enhanced
                                color display is required for this
                                option.)

                    /B           Forces the attached monitor to use two
                                shades of color when displaying
                                information.

                    /Ccommands   Executes the specified list of startup
                                commands when CodeView is invoked. If
                                the list of startup commands contains
                                any spaces, the entire list must be
                                enclosed in double quotation marks (").
                                Commands in the list must be separated
                                by a semicolon character (;).

                    /D           Turns off nonmaskable interrupt trapping
                                and Intel 8259 interrupt trapping.
                                (This switch prevents system crashes on
                                some IBM-compatible machines that do
                                not support certain IBM-specific
                                interrupt trapping functions.)

                    /E           Stores the symbolic information of the
                                program in expanded memory.

                    /F           Enables the screen-flipping method of
                                switching between the debugging display
                                and the virtual output display. Screen
                                flipping is the default method for IBM-
                                compatible computers with color/graphics
                                adapters.

                    /I           Enables nonmaskable interrupt trapping
                                and Intel 8259 interrupt trapping on
                                computers that are not IBM-compatible.

                    /M           Disables mouse support within CodeView.

                    /P           Enables palette register restore mode,
                                which allows non-IBM EGAs to restore
                                the proper colors upon return from the
                                virtual output screen.

                    /R           Enables Intel 80386 debugging registers.

                    /S           Enables the screen-swapping method of
                                switching between the debugging display
                                and the virtual output display. Screen
                                swapping is the default method for IBM-
                                compatible computers with monochrome
                                adapters.

                    /T           Disables window mode. This switch is
                                necessary for some non-IBM computers or
                                when a sequential debugging session is
                                desired.

                    /W           Enables window mode. This switch allows
                                CodeView to operate in multiple windows
                                on the same screen. (This option is not
                                the default for some computers.)

Description

    CodeView is a window-oriented menu-driven debugger that allows tracing
    and debugging of high-level-language programs and assembly-language
    programs. In general, any valid C, FORTRAN, BASIC, Pascal, or MASM
    source code can be debugged with CodeView.

    To prepare a program for debugging under CodeView, the program must be
    compiled and linked so that the resulting executable file has the
    extension .EXE and contains line-number information, a symbol table,
    and executable code. (To a limited extent, text files and .COM files
    can also be examined under CodeView.) During the debugging session,
    the program source file must remain in the current directory if
    source-code display is desired.

    The CodeView screen contains four windows that display information
    about the pro- gram being debugged: the display window, which contains
    program source code and (if requested) the unassembled machine code
    corresponding to the source code; the dialog window, where line-
    oriented commands similar (and in some cases identical) to SYMDEB can
    be entered and viewed (see PROGRAMMING UTILITIES: SYMDEB);
    the register window (optional), which contains the current status of
    the microprocessor's registers and flags; and the watch window
    (optional), which contains program variables or memory locations to be
    examined during program execution. CodeView also provides a virtual
    output screen (stored internally) that contains all display output
    generated during the CodeView session.

    A typical CodeView debugging screen looks like this:


            ╔══════════════════════════════════════════╗
            ║                                          ║
            ║  The CodeView display is found on page   ║
            ║ 1159 in the printed version of the book. ║
            ║                                          ║
            ╚══════════════════════════════════════════╝


    The CodeView display.

Display window commands

    Commands that control the display window are available in nine pull-
    down menus whose names appear in a menu bar near the top of the
    screen. Commands can be selected with the keyboard or the mouse.
    Commands are selected with the keyboard by pressing the Alt key,
    pressing the first letter in the menu name, and then pressing the
    first letter of the command. Commands are selected with the mouse by
    pulling down the menu with the mouse pointer, highlighting the
    command, and then releasing the mouse button. Commands with small
    double arrows to the left of the command name are currently active.
    The CodeView menus and commands are described below.

    File menu
    The File menu includes commands that manipulate the current source or
    program file. To select the File menu with the keyboard, press Alt-F.

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
    ──────────────────────────────────────────────────────────────────────
    Open...      Opens the specified source file, include file, or text
                file in the display window.

    DOS Shell    Exits to the shell temporarily. Type exit to return to
                CodeView.

    Exit         Ends the current CodeView session.


    View menu
    The View menu includes commands that select source or assembly modes
    and commands that select the debugging screen or the virtual output
    screen. To select the View menu with the keyboard, press Alt-V.

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
    ──────────────────────────────────────────────────────────────────────
    Source       Displays only the high-level-language or assembly-
                language source code corresponding to the program being
                debugged.

    Mixed        Displays both the unassembled machine code and the source
                code corresponding to the program being debugged.

    Assembly     Displays only the unassembled machine code corresponding
                to the program being debugged.

    Registers    Displays or removes the optional register window.

    Output       Replaces the debugging screen with the virtual output
                screen. Press any key to return to the debugging screen.


    Search menu
    The Search menu includes commands that search through text files for
    text strings and through executable code for labels. To select the
    Search menu with the keyboard, press Alt-S.

╓┌───────────────────────┌───────────────────────────────────────────────────╖
    Command            Action
    ──────────────────────────────────────────────────────────────────────
    Find...            Searches the current source file or other text file
                        for the specified expression.

    Next               Searches forward through the file for the next
                        match of the last expression specified with the
                        Find... command.

    Previous           Searches backward through the file for the next
                        match of the last expression specified with the
                        Find... command.

    Label...           Searches the executable code for the specified
                        procedure name or program label.


    Run menu
    The Run menu includes commands that run the program being debugged. To
    select the Run menu with the keyboard, press Alt-R.

╓┌───────────────────────┌───────────────────────────────────────────────────╖
    Command            Action
    ──────────────────────────────────────────────────────────────────────
    Start              Runs the program at full speed from the first
                        instruction.

    Restart            Reloads the program and moves to the first
                        instruction.

    Execute            Runs the program at reduced speed from the current
                        instruction.

    Clear Breakpoints  Clears all breakpoints.


    Watch menu
    The Watch menu includes commands that add watch statements to and
    delete watch statements from the watch window. Watch statements
    describe expressions or areas of memory to be examined during program
    execution. To select the Watch menu with the keyboard, press Alt-W.

╓┌───────────────────────┌───────────────────────────────────────────────────╖
    Command            Action
    ──────────────────────────────────────────────────────────────────────
    Add Watch...       Adds the specified watch-expression statement to
                        the watch window.

    Watchpoint...      Adds the specified watchpoint statement to the
                        watch window. A watchpoint is a conditional
                        breakpoint that is taken when the expression
                        becomes nonzero (true).

    Tracepoint...      Adds the specified tracepoint statement to the
                        watch window. A tracepoint is a conditional
                        breakpoint that is taken when a given expression
                        or range of memory changes.

    Delete Watch...    Deletes the specified statement from the watch
                        window.

    Delete All Watch   Deletes all statements from the watch window.


    Options menu
    The Options menu contains commands that affect the general behavior of
    CodeView. To select the Options menu with the keyboard, press Alt-O.

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
    ──────────────────────────────────────────────────────────────────────
    Flip/Swap    When on (the default), enables screen swapping or screen
                flipping (whichever option CodeView was started with);
                when off, disables swapping or flipping. Either method
                can be used to display the CodeView virtual output
                screen.

    Bytes Coded  When on (the default), displays the instructions,
                instruction addresses, and the bytes for each
                instruction; when off, displays only the instructions.

    Case Sense   When on, causes CodeView to assume that symbol names are
                case sensitive; when off, causes CodeView to assume that
                symbol names are not case sensitive. This option is on
                by default for C programs and off by default for
                FORTRAN, BASIC, and assembly programs.

    386           When on, allows instructions that reference 32-bit
                instructions to be assembled and executed and the
                register window to display 32-bit values. When off, does
                not allow Intel 80386 instructions and registers to be
                supported.


    Language menu
    The Language menu contains commands that select the language-dependent
    expression evaluator or instruct CodeView to select it for you. To
    select the Language menu with the keyboard, press Alt-L.

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Command      Action
    ──────────────────────────────────────────────────────────────────────
    Auto         Forces CodeView to select the expression evaluator of the
                source file being loaded, based on the extension of the
                source file.

    Basic        Uses a BASIC expression evaluator to determine the value
                of source-level expressions.

    C            Uses a C expression evaluator to determine the value of
                source-level expressions.

    Fortran      Uses a FORTRAN expression evaluator to determine the
                value of source-level expressions.


    Calls menu
    The Calls menu is different from other menus in that its contents vary
    depending on the status of the program. The Calls menu lists the names
    of specific routines that will be displayed on the screen when that
    routine name is selected. Routine names in the Calls menu can be
    selected by typing the number displayed immediately to the left of a
    routine name. The cursor will move to the line at which the selected
    routine was last executing.

    The current value of each parameter, if any, is shown in parentheses
    following the name of the routine in the Calls menu. The menu expands
    to accommodate the parameters of the widest line. Parameters are shown
    in the current radix (default = decimal). If the program contains more
    active routines than will fit on the screen or if the routine
    parameters are too wide, the menu expands to the left and right.

    To select the Calls menu with the keyboard, press Alt-C.

    Help menu
    The Help menu lists the major topics in the CodeView "linked-list"
    help system. For help, pull down the Help menu and then select the
    topic of interest. To select the Help menu with the keyboard, press
    Alt-H.

╓┌───────────────────────┌───────────────────────────────────────────────────╖
    Command            Action
    ──────────────────────────────────────────────────────────────────────
    Intro to Help      Displays information about the "linked-list" help
                        system.

    Keyboard/Mouse     Displays information about keyboard and mouse
                        commands.

    Run commands       Displays information about Run commands.

    Display cmds.      Displays information about Display commands.

    Watch/Break        Displays information about setting, listing, and
                        deleting watchpoints and breakpoints.

    Memory Ops         Displays information about viewing and modifying
                        memory.

    System cmds.       Displays information about system and environment
                        commands.

    About CodeView     Displays information about the current CodeView
                        version, time, and date.


Key commands

    CodeView supports a variety of function keys and key combinations that
    modify the active window.

╓┌─────────────────┌─────────────────────────────────────────────────────────╖
    Key          Action
    ──────────────────────────────────────────────────────────────────────
    F1           Displays the introductory help screen.

    F2           Displays or removes the register window.

    F3           Changes the display in the display window to source,
                mixed, or assembly mode.

    F4           Displays the virtual output screen (press any key to
                return).

    F5           Executes to the next breakpoint or to the end of the
                program if no breakpoint is encountered.

    F6           Toggles between the display window and the dialog window.

    F7           Sets a temporary breakpoint on the line containing the
                cursor and executes to that line (or the next
                breakpoint).

    F8           Executes a trace command, stepping through program calls
                if present.

    F9           Sets or clears a breakpoint on the line containing the
                cursor.

    F10          Executes the next source line (in source mode) or the
                next instruction (in assembly mode), stepping over
                program calls if present.

    Ctrl+G       Increases the size of the display window or the dialog
                window, whichever is active.

    Ctrl+T       Decreases the size of the display window or the dialog
                window, whichever is active.


Dialog window commands

    After CodeView and the specified executable file are loaded, CodeView
    displays its special prompt character (>) at the bottom of the dialog
    window and awaits a dialog command. CodeView dialog commands consist
    of one, two, or three characters, usually followed by one or more
    parameters. CodeView treats uppercase and lowercase characters the
    same except when they are contained in strings enclosed within single
    or double quotation marks. The default radix for dialog command
    parameters is 10 (decimal). Dialog commands are executed when the
    Enter key is pressed.

    A detailed explanation of CodeView dialog commands and parameters is
    not presented in this entry. CodeView dialog commands and parameters
    are similar to SYMDEB commands and parameters. See PROGRAMMING
    UTILITIES: SYMDEB. Additional information about using CodeView
    dialog commands and parameters can be found in the CodeView
    documentation supplied with the Microsoft Macro Assembler (MASM), C
    Compiler, Pascal Compiler, and FORTRAN Compiler. A sample debugging
    session using CodeView dialog commands and window commands is
    documented in this book. See PROGRAMMING IN THE MS-DOS ENVIRONMENT:
    PROGRAMMING TOOLS: Debugging in the MS-DOS Environment.

    The dialog commands available with CodeView are as follows:

╓┌─────────────────┌─────────────────────────┌───────────────────────────────╖
    Command      Syntax                    Action
    ──────────────────────────────────────────────────────────────────────
    !            ! [command]               Escape to shell.
    "            "                         Pause redirected file
                                            execution.
    #            #number                   Set display window tabs.
    *            *comment                  Echo comment to output device.
    .            .                         Display current source line.
    /            /[searchtext]             Search for regular expression.
    7            7                         Display 8087 registers.
    :            :[:]...[:]                Delay redirected file
                                            execution.
    <            < device                  Redirect dialog window input.
    =            = device                  Redirect dialog window input
                                            and output.
    >            [T] > [>] device          Redirect dialog window output.
    ?            ? expression[,format]     Evaluate expression.
    @            @                         Redraw screen.
    A            A [address]               Assemble machine instructions.
    BC           BC [*] [list]             Clear breakpoints.
    BD           BD [*] [list]             Disable breakpoints.
    BE           BE [*] [list]             Enable breakpoints.
    BL           BL                        List breakpoints.
    BP           BP [address [passcount]   Set breakpoints.
                ["cmds"]]
    C            C range address           Compare memory areas.
    D            D [range]                 Display (dump) memory.
    DA           DA [range]                Display ASCII.
    DB           DB [range]                Display bytes.
    DD           DD [range]                Display doublewords.
    DI           DI [range]                Display integers.
    DL           DL [range]                Display long reals.
    DS           DS [range]                Display short reals.
    DT           DT [range]                Display 10-byte reals.
    DU           DU [range]                Display unsigned integers.
    DW           DW [range]                Display words.
    E            E address [list]          Enter data.
    EA           EA address [list]         Enter ASCII string.
    EB           EB address [list]         Enter bytes.
    ED           ED address [value]        Enter doublewords.
    EI           EI address [list]         Enter integers.
    EL           EL address [value]        Enter long reals.
    ES           ES address [value]        Enter short reals.
    ET           ET address [value]        Enter 10-byte reals.
    EU           EU address [value]        Enter unsigned integers.
    EW           EW address [value]        Enter words.
    F            F range list              Fill memory.
    G            G [breakpoint]            Go execute program.
    H            H                         Display help screen.
    I            I port                    Input from port.
    K            K [number]                Perform stack trace.
    L            L [parameters]            Reload program.
    M            M range address           Move (copy) data.
    N            N [radix]                 Change current radix.
    O            O port byte               Output to port.
    O            O                         Display all options.
    O3           O3[+|-]                   Toggle Intel 80386 option.
    OB           OB[+|-]                   Toggle bytes coded option.
    OC           OC[+|-]                   Toggle case-sense option.
    OF           OF[+|-]                   Toggle flip/swap option.
    P            P [count]                 Step through program (over
                                            calls).
    Q            Q                         Quit debugger.
    R            R [register [value]]      Display or modify registers.
    RF           RF [flags]                Display or modify flags.
    S            S range list              Search memory.
    S            S                         Display current display mode.
    S+           S+                        Display source code.
    S-           S-                        Display assembly language.
    S&           S&                        Display source code and
                                            assembly language.
    T            T [count]                 Trace program execution
                                            (through calls).
    TP           TP [type] range           Set memory-tracepoint
                                            statement.
    TP?          TP? expression[,format]   Set tracepoint-expression
                                            statement.
    U            U [range]                 Disassemble (unassemble)
                                            program.
    USE          USE [language]            Switch expression evaluators.
    V            V [.[filename:]linenumber View source code.
    W            W                         List watchpoints and
                                            tracepoints.
    W            W [type] range            Set memory-watch statement.
    W?           W? expression[,format]    Set watch-expression statement.
    WP?          WP? expression[,format]   Set watchpoint.
    X            X[?[module!]              Examine program symbols.
                [routine.]symbol|*]
    Y            Y [*] [list]              Delete watch statements.
    \            \                         Display virtual output screen.


Examples

    To prepare the source file SHELL.C for debugging with CodeView, first
    compile the source file with the switches that disable optimization
    and cause symbol-table and line-number information to be written to
    the relocatable object module:

    C>MSC /Zi /Od SHELL;  <Enter>

    Next, to convert the object module to an executable program and
    prepare it for CodeView, type

    C>LINK /CO SHELL;  <Enter>

    To begin debugging, type

    C>CV SHELL  <Enter>

    To start CodeView in 43-line mode with TEST.EXE as the executable file
    and INFO.DAT as the command-tail parameter, type

    C>CV /43 TEST INFO.DAT  <Enter>

    In both examples the source file corresponding to the specified
    executable file must be in the current directory if source-code
    display is desired.

Messages

    Argument to IMAG/DIMAG must be simple type
    An invalid parameter to an IMAG or DIMAG function, such as an array
    with no subscripts, was specified.

    Array must have subscript
    An array without any subscripts was specified in an expression, such
    as IARRAY + 2. A correct example is IARRAY[1] + 2.

    Bad address
    An invalid address was specified. For example, an address containing
    hexadecimal characters might have been specified when the radix is
    decimal.

    Bad breakpoint command
    An invalid breakpoint number was specified with the BC, BD, or BE
    dialog command. The breakpoint number must be in the range 0 through
    19.

    Bad flag
    An invalid flag mnemonic was specified with the RF dialog command.

    Bad format string
    An invalid format specifier was used following an expression.
    Expressions used with the ?, W?, WP?, and TP? dialog commands can have
    format specifiers set off from the expression by a comma. The valid
    format specifiers are c, d, e, E, f, g, G, i, o, s, u, x, and X. Some
    format specifiers can be preceded by the prefix h (to specify a 2-byte
    integer) or l (to specify a 4-byte integer).

    Bad integer or real constant
    An invalid numeric constant was specified in an expression.

    Bad intrinsic function
    An invalid intrinsic function name was specified in an expression.

    Badly formed type
    The type information in the symbol table of the file being debugged is
    incorrect. This is a serious problem. Note the circumstances of the
    failure and notify Microsoft Corporation.

    Bad radix (use 8, 10, or 16)
    An invalid radix was specified with the N dialog command. Use an
    octal, decimal, or hexadecimal radix.

    Bad register
    An invalid register name was specified with the R dialog command. Use
    AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, or IP. If your machine
    is equipped with an Intel 80386 microprocessor, use EAX, EBX, ECX,
    EDX, ESP, EBP, ESI, EDI, DS, ES, FS, GS, SS, CS, or IP.

    Bad subscript
    An invalid subscript expression was specified for an array, such as
    IARRAY (3.3) or IARRAY ((3,3)). The correct expression for this
    example (in BASIC or FORTRAN) is IARRAY (3,3).

    Bad type cast
    Incompatible types of operands were specified in an expression.

    Bad type (use one of 'ABDILSTUW')
    An invalid type was used in a Display (D, DA, DB, DF, DU, DW, DD, DS,
    DL, or DT) dialog command. The valid types are ASCII (A), byte (B),
    integer (I), unsigned (U), word (W), doubleword (D), short real (S),
    long real (L), and 10-byte real (T).

    Breakpoint # or '*' expected
    The BC, BD, or BE dialog command was entered without a parameter.

    Cannot cast complex constant component into REAL
    An incompatible real or imaginary component was specified in a COMPLEX
    constant. Both real and imaginary components must be compatible with
    type REAL.

    Cannot cast IMAG/DIMAG argument to COMPLEX
    An invalid parameter was specified with an IMAG or DIMAG function.
    IMAG and DIMAG parameters must be simple numeric types.

    Cannot use struct or union as scalar
    A struct or union variable was used as a scalar value in a C
    expression. Such variables must be followed by a file specifier or
    preceded by the address-of (&) operator.

    Can't find filename
    CodeView could not find the executable file specified in the command
    line.

    Character constant too long
    A character constant that is too long for the FORTRAN expression
    evaluator was specified. The limit is 126 bytes.

    Character too big for current radix
    A radix that is larger than the current CodeView radix was specified
    in a constant. Use the N dialog command to change the radix.

    Constant too big
    An unsigned constant number larger than 4,294,967,295 (FFFFFFFFH) was
    specified.

    CPU not an 80386
    The 386 option was selected but a machine without an Intel 80386
    microprocessor is being used.

    Divide by zero
    An expression in a parameter of a dialog command attempted to divide
    by zero.

    EMM error
    CodeView failed to use the Expanded Memory Manager (EMM) correctly.
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    EMM hardware error
    The Expanded Memory Manager (EMM) routines reported a hardware error.
    Check your expanded memory board for defects.

    EMM memory not found
    The /E option was used but expanded memory has not been installed.
    Install software that accesses the memory according to the
    Lotus/Intel/Microsoft  Expanded Memory Specification (LIM EMS).

    EMM software error
    The Expanded Memory Manager (EMM) routines reported a software error.
    Reinstall the EMM software.

    Expression too complex
    An expression given as a dialog-command parameter is too complex.

    Extra input ignored
    Too many parameters were specified with a command. CodeView evaluates
    the valid parameters and ignores the rest. In this situation, CodeView
    often does not evaluate the parameters as intended.

    Flip/Swap option off--application output lost
    The program being debugged is writing to the screen, but the output
    cannot be displayed because the flip/swap option has been disabled.

    Floating point error
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    Illegal instruction
    This message usually indicates that a machine instruction attempted to
    divide by zero.

    Index out of bound
    A subscript value was specified that is outside the bounds declared
    for the array.

    Insufficient EMM memory
    Expanded memory is insufficient to hold the program's symbol table.

    Internal debugger error
    This is a serious problem. Note the circumstances of the failure and
    notify Microsoft Corporation.

    Invalid argument
    An invalid CodeView expression was specified as a parameter.

    Invalid executable file format--please relink
    The executable file was not linked with the version of LINK released
    with this version of the CodeView debugger. Relink with the
    appropriate version of LINK.

    Invalid option
    An invalid switch was specified with the O command.

    Missing ' " '
    A string specified as a parameter to a dialog command did not have a
    closing double quotation mark.

    Missing '('
    A parameter to a dialog command was specified as an expression
    containing a right parenthesis but no left parenthesis.

    Missing ')'
    A parameter to a dialog command was specified as an expression
    containing a left parenthesis but no right parenthesis.

    Missing ']'
    A parameter to a dialog command was specified as an expression
    containing a left bracket but no right bracket, or a regular
    expression was specified with a right bracket but no left
    bracket.

    Missing '(' in complex constant
    An opening parenthesis of a complex constant in an expression was
    expected but was not found.

    Missing ')' in complex constant
    A closing parenthesis of a complex constant in an expression was
    expected but was not found.

    Missing ')' in substring
    A closing parenthesis of a substring expression was expected but was
    not found.

    Missing '(' to intrinsic
    An opening parenthesis for an intrinsic function was expected but was
    not found.

    Missing ')' to intrinsic
    A closing parenthesis for an intrinsic function was expected but was
    not found.

    No closing single quote
    A character was specified in an expression used as a dialog-command
    parameter, but the closing single quotation mark is missing.

    No code at this line number
    A breakpoint was set on a source line that does not correspond to
    machine code. (In other words, the source line does not contain an
    executable statement.) For example, the line might be a data
    declaration or a comment.

    No free EMM memory handles
    CodeView could not find an available EMM handle. Expanded Memory
    Manager (EMM) software allocates a fixed number of memory handles
    (usually 256) to be used for specific tasks.

    No match of regular expression
    No match was found for the regular expression specified with the
    Search (S) dialog command or with the Find... command from the Search
    menu.

    No previous regular expression
    The Previous command was selected from the Search menu, but CodeView
    found no previous match for the last regular expression specified.

    No source lines at this address
    The address specified as a parameter for the V dialog command does not
    have any source lines. For example, it could be an address in a
    library routine or an assembly-language module.

    No such file/directory
    The specified file or directory does not exist.

    No symbolic information
    The executable file specified is not in the CodeView format. The
    program cannot be debugged in source mode unless the file is created
    in the CodeView format. The program can be debugged in assembly
    mode.

    Not an executable file
    The file specified to be debugged when CodeView started is not an
    executable file with a .EXE or .COM extension.

    Not a text file
    An attempt was made to load a file with the Open... command from the
    File menu or with the V dialog command, but the file is not a text
    file. CodeView determines if a file is a text file by checking the
    first 128 bytes for characters that are not in the ASCII ranges 9
    through 13 and 20 through 126.

    Not enough space
    The ! dialog command or the DOS Shell command from the File menu was
    chosen, but free memory is insufficient to execute COMMAND.COM.
    Because memory is released by code in the FORTRAN startup routines,
    this error always occurs if the ! command is used before executing any
    code. Use any of the code-execution dialog commands (T, P, or G) to
    execute the FORTRAN startup code; then try the ! command again. This
    message also occurs with assembly-language programs that do not
    specifically release memory.

    Object too big
    A TP? dialog command was entered with a data object (such as an array)
    that is larger than 128 bytes.

    Operand types incorrect for this operation
    An operand in a FORTRAN expression had a type incompatible with the
    operation applied to it. For example, if P is declared as CHARACTER P
    (10), then ? P+5 would produce this error, because a character array
    cannot be an operand of an arithmetic operator.

    Operator must have a struct/union type
    One of the C member-selection operators (-, >, or .) was used in an
    expression that does not reference an element of a structure or
    union.

    Operator needs lvalue
    An expression was specified that does not evaluate to a memory
    location in an operation that requires one. (An lvalue is an
    expression that refers to a memory location.) For example,
    buffer (count) is correct; it represents a symbol in memory.
    However, I .EQV. 10 is invalid because it evaluates to TRUE or
    FALSE instead of to a single memory location.

    Overlay not resident
    An attempt was made to unassemble machine code from a function that is
    currently not in memory.

    Program terminated normally (exitcode)
    The program terminated execution normally. The number displayed in
    parentheses is the exit code returned to MS-DOS by the program.

    Radix must be between 2 and 36 inclusive
    A radix that is outside the allowable range was specified.

    Register variable out of scope
    An attempt was made to specify a register variable by using the period
    (.) operator and a routine name.

    Regular expression too complex
    The regular expression specified is too complex for CodeView to
    evaluate.

    Regular expression too long
    The regular expression specified is too long for CodeView to
    evaluate.

    Restart program to debug
    The program being debugged has executed to the end.

    Simple variable cannot have argument
    A parameter to a simple variable was specified in an expression. For
    example, given the declaration INTEGER NUM, the expression NUM(I) is
    not allowed.

    Substring range out of bound
    A character expression exceeded the length specified in the CHARACTER
    statement.

    Syntax error
    An invalid command line was specified for a dialog command, or an
    invalid assembly-language instruction was entered with the A dialog
    command.

    Too few array bounds given
    The bounds specified in an array subscript do not match the array
    declaration. For example, given the array declaration INTEGER
    IARRAY(3,4), the expression IARRAY(I) would produce this error
    message.

    Too many array bounds given
    The bounds specified in an array subscript do not match the array
    declaration. For example, given the array declaration INTEGER
    IARRAY(3,4), the expression IARRAY(I,3,J) would produce this error
    message.

    Too many breakpoints
    An attempt was made to specify more than 20 breakpoints; CodeView
    permits only 20.

    Too many files
    Too few file handles were specified for CodeView to operate correctly.
    Specify more files in your CONFIG.SYS file.

    Type clash in function argument
    The type of an actual parameter does not match the corresponding
    formal parameter, or a subroutine that uses alternate returns was
    called and the values of the return labels in the actual parameter
    list are not 0.

    Type conversion too complex
    An attempt was made to typecast an element of an expression in a type
    other than the simple types or with more than one level of
    indirection. An example of a complex type would be typecasting to a
    struct or union type. An example of two levels of indirection is
    char **.

    Unable to open file
    A file specified in a command parameter or in response to a prompt
    cannot be opened.

    Unknown symbol
    An identifier that is not in CodeView's symbol table was specified, or
    a local variable was used in a parameter when not in the routine where
    the variable is defined, or a subroutine that uses alternate returns
    was called and the values of the return labels in the parameter list
    are not 0.

    Unrecognized option option
    Valid options: /B /C<command> /D /E /F /I /M /P /R /S /T /W /43 /2
    An invalid switch was entered when starting CodeView.

    Usage: cv [options] file [arguments]
    An executable file was not specified when starting CodeView.

    Video mode changed without /S option
    The program changed video modes (either to or from graphics modes)
    when screen swapping was not specified. Use the /S option to specify
    screen swapping when debugging graphics programs. Debugging can be
    continued after receiving this message, but the output screen of the
    debugged program may be damaged.

    Warning: packed file
    CodeView was started with a packed file as the executable file. The
    program cannot be debugged in source mode because all symbolic
    information is stripped from a file when it is packed with LINK's
    /EXEPACK option or the EXEPACK utility. Try to debug the program in
    assembly mode. (The packing routines at the start of the program might
    make this difficult.)

    Wrong number of function arguments
    An incorrect number of parameters was specified when evaluating a
    function in a CodeView expression.

Return to The MS-DOS Encyclopedia: Contents