masm icon indicating copy to clipboard operation
masm copied to clipboard

MASM 6.11 : Microsoft.

	    Microsoft(R) Macro Assembler Package
		      Version 5.10
	   Copyright 1988, Microsoft Corporation

Text files on the Macro Assembler disks are tabbed to save disk space. If your printer does not automatically handle tabs during printing, you must use a print program that expands tabs. For example, use the DOS PRINT program to print this and other document or source files on the disk.

	The Microsoft Macro Assembler (MASM)

Mixed-Language Support for Variables and Procedures

All EXTRN, PUBLIC, and PROC items, as well as uses of the .MODEL directive, support a language type. The language type of EXTRN and PUBLIC variables determine whether or not an underscore is prefixed to the name (an underscore is prefixed only for variables with a C language type), and the language type of a procedure determines its calling and naming conventions. For an explanation of calling and naming conventions, see the Microsoft Mixed-Language Programming Guide.

The language type consists of the word "C" or "Pascal" and uses the following syntax (lowercase items are placeholders, and bracketed items are optional):

EXTRN [] : PUBLIC [] procName PROC [NEAR|FAR] [] [USES ,]

For example, the C and Pascal keywords are used correctly in the following example:

.MODEL	SMALL,C
EXTRN	Pascal DosOpen:FAR
PUBLIC	C myVar

myOpen PROC Pascal fName:PTR, mode:WORD . . . myOpen ENDP

EVEN and ALIGN Directives

Padding for EVEN and ALIGN is now optimized. Data segments are padded with zeros. Code segments are padded with special two-byte NOP instructions where possible. The two-byte NOP consists of the instruction XCHG BX,BX (87 DB hexadecimal) which is executed faster than two one-byte NOP instructions.

/B Option Ignored

The /B option is now ignored, because its effect is irrelevant, given the new file buffering mechanism. However, the option is still accepted for the purposes of compatibility.

The PTR Operator

The PTR operator can be used to specify the size of a register indirect operand for a CALL or JMP instruction. However, the size cannot be specified with NEAR or FAR. Use WORD or DWORD instead. (In 80386 32-bit segments, use DWORD or FWORD.) Examples are shown below:

  ; 8086, 80826, or 80386 16-bit mode

  jmp  WORD PTR	[bx]	    ; Legal near jump
  call NEAR PTR	[bx]	    ; Illegal near call
  call DWORD PTR [bx]	    ; Legal far	call
  jmp  FAR PTR [bx]	    ; Illegal far jump

  ; 80386 32-bit mode only

  jmp  DWORD PTR [bx]	    ; Legal near jump
  call NEAR PTR	[bx]	    ; Illegal near call
  call FWORD PTR [bx]	    ; Legal far	call
  jmp  FAR PTR [bx]	    ; Illegal far jump

This limitation only applies to register indirect operands. NEAR or FAR can be applied to operands associated with labels. Examples are shown below:

  jmp  NEAR PTR	pointer[bx] ; Legal
  call FAR PTR location	    ; Legal

Assembler Behavior Change

Some errors and questionable practices that were ignored by earlier versions are now flagged as errors. As a result, existing source code may produce errors or warnings. The following are examples:

  - Labels defined only during pass 1 cause errors if
    used in expressions.
  - A CS ASSUME that changes from pass 1 to pass 2 causes
    an error.
  - Constants are now checked for type overflow.
  - Reserved words used	as labels produce warnings.
  - The	OFFSET operator	used with a constant causes an error.

The STACK Combine Type

The description of the STACK combine type in Section 5.2.2.3 does not explain how multiple initialized stack segments are combined. The total size of the stack is the total size of all stack definitions. LINK puts initialized data for each defined stack segment at the end of the stack. Data initialized in the last segment linked override data initialized in previous segments. This behavior is usually not relevant, since most programs only define one stack of uninitialized data. Stack data cannot be initialized with simplified segment directives.

Clarification of Parsing Error

The following error can be difficult to interpret because of the way the assembler parses (analyzes) source code:

A2015: Symbol already different kind:

Typically, the assembler generates this error message when a symbol is used in a way inconsistent with how it was declared: for example, a symbol is declared as an external absolute but then used as a local code label. However, the assembler also generates this error when a symbol in the second source-code field can be interpreted as either an operation or an operand. The following example illustrates this problem:

SYM1 MACRO structName, varName varName structName <> ENDM

SYM2 STRUCT field1 DB field2 DW SYM2 ENDS

SYM1 SYM2,

The last line of code causes error A2015 to be generated. The assembler first looks at the second field of the line, which contains the symbol SYM2. Since SYM2 is a structure, the assembler considers SYM2 to be an operation rather than an operand, and therefore it considers SYM1 to be a label (rather than an operation). The way to avoid this error is simply code the instruction as:

SYM1 <SYM2>,

HIGH and LOW Operators

The HIGH and LOW operators work reliably only with constants and with offsets to external symbols. HIGH and LOW operations are not supported for offsets to local symbols.

Mixed-Mode Programming (386 Only)

When assembling code for .386 mode, the assembler now supports direct- addressing modes between segments with different USE sizes. (Segments can have the USE16 or USE32 attribute; these attributes refer to the default size of offsets.) Direct-addressing references to labels in other segments are correctly resolved. In the following example, the assembler correctly uses a 32-bit offset to access the data at label a32:

.386 SEG32 SEGMENT USE32 a32 DD ? SEG32 ENDS

SEG16 SEGMENT USE16 assume ds:seg32 mov eax,a32 SEG16 ENDS

You can also execute a CALL or a JMP to a label in a segment with a different USE size. However, the label must be declared FAR, and the CALL or JMP must not be a forward reference. The following example shows the correct method for executing such a CALL or JMP:

.386 COD16 SEGMENT USE16 'CODE' proc16 PROC FAR ret proc16 ENDP

lab16 LABEL FAR COD16 ENDS

COD32 SEGMENT USE32 'CODE' call proc16 jmp lab16 COD32 ENDS

Additional Error Messages

19 Wrong type of register

The register specified in the operand field was incompatible with the directive or instruction in the operation field. For example, the following instruction causes this error because you cannot increment the code segment:

inc cs

36 Extra NOP inserted

During pass 1 the assembler did not have enough information to correctly infer the length of the encoding for the instruction. During pass 2 the encoding was found to be shorter than the space allocated from pass 1, so one or more NOP instructions were inserted as padding. It may be possible to generate a smaller amount of code by eliminating a forward reference to a symbol.

   The Microsoft Cross-Reference Utility (CREF)

New Feature

Cross-reference listing files created with CREF now have an additional symbol. A line number followed by + indicates that a symbol is modified at the given line. For example:

  TST .	. . . .	. . . .	. . . .	.  134#	  237	 544+

The symbol TST is defined at line 134, used at line 237, and modified at line 544.

                      The Mouse Driver

If you use the Microsoft Mouse with the Microsoft CodeView(R) debugger you must have Version 6.0 or later of the Microsoft Mouse. If you do not, use the version of the MOUSE.COM driver provided in this package. Copy MOUSE.COM to the appropriate mouse directory. When you are ready to use the mouse, type

mouse

at the DOS command level. If you want to install the mouse driver automatically every time you reboot, insert the "mouse" command in your AUTOEXEC.BAT file.

Note that in earlier releases of Microsoft C, both the MOUSE.SYS and the MOUSE.COM driver were provided. If you have been using an earlier version of the MOUSE.SYS driver, delete the following line from your CONFIG.SYS file:

device=\<directory>\mouse.sys

where is the directory where the earlier mouse driver resides.

		      Microsoft CodeView Debugger

New Command-Line Option

If you have an IBM Personal System/2, then you can use the /50 command-line option to start the CodeView debugger in 50-line mode. Note that you must be in 25-line mode to effectively use either the /43 or /50 command-line option.

CONFIG.SYS Setting for CVP

To run the protected-mode CodeView debugger (CVP.EXE), you must have the following line in your CONFIG.SYS file:

IOPL=YES

Using the 7 Command in Protected Mode

If you are using OS/2 protected mode and have a math coprocessor, then you need to use a patch before you can use the CVP 7 command. To apply the patch, use the OS2PATCH.EXE and PTRACE87.PAT files that come on the same disk that CVP.EXE comes on. You also need to locate the PATCH.EXE file that comes with OS/2 and make sure that this file is in a directory listed in your PATH environment variable. Then follow these steps:

  1. Change the current drive and directory to the root directory of the boot disk. (If the boot disk is a floppy, make sure it is inserted in the drive you used to boot from.)

  2. Give the following command line at the DOS prompt:

    OS2PATCH /A PTRACE87.PAT

Note that you may need to give the complete path names for the OS2PATCH.EXE and for the PTRACE87.PAT file. You do not need to give a path name for the OS2PATCH.EXE file if you have placed this file in a directory listed in your PATH environment variable.

Using the Real-Mode Debugger in the Compatibility Box

When running the real-mode CodeView debugger in the DOS 3.x compatibility box, start the debugger with the /S command-line option. Otherwise, the mouse pointer will not appear.

Using the CodeView Debugger with BIND

The real-mode CodeView debugger cannot debug bound (dual-mode) applications. However, the protected-mode CodeView debugger, CVP, can debug bound applications.

Expression Evaluator for BASIC Programs

In the BASIC expression evaluator, "+" is not supported for string concatenation.

Stack Trace Command

In order for the Stack Trace command (or the Calls menu) to work reliably, you need to execute to at least the beginning of the main function or procedure, and the current module should have full CodeView information (a module has full CodeView information if compiled or assembled with /Zi).

Error Messages

The error message "? cannot display" indicates that the Display Expression command (?) has been passed a valid symbol that it cannot display. In previous versions of the debugger, structures could not be displayed. With current version of the debugger, only the enums type cannot be displayed.

The error message "Expression not a memory address" occurs when the Tracepoint command is given without a symbol that evaluates to a single memory address. For example, the commands "TP?1" and "TP?a+b" each produce this error message. The proper way to put a tracepoint on the word at address 1 is with the command "TPW 1".

The error message "Function call before 'main'" occurs when you attempt to evaluate a program-defined function before you have entered the main function. Execute to at least to the beginning of the main function before attempting to evaluate program-defined functions.

The error message "Bad emulator info" occurs when CodeView cannot read data from the floating-point emulator.

The error message "Floating point not loaded" has a special meaning for CVP (in addition to the explanation given in the CodeView and Utilities manual). Each thread has its own floating-point emulator. This message is issued when the current thread has not initialized its own emulator.

Microsoft Pascal Programs

In this release, Microsoft Pascal programs cannot be debugged with the CodeView debugger.

		     Exit Codes for Utilities

The exit codes for LINK and the utilities in the Microsoft CodeView and Utilities manual should appear as follows:

LINK

Code	Meaning

0	No error.

2	Program error--something was wrong with the commands
	or files input to the linker.

4	System error.  The linker

	- ran out of space on output files
	- was unable to reopen the temporary file
	- experienced an internal error
	- was interrupted by the user

LIB, EXEPACK, EXEMOD, MAKE, and SETENV

Code	Meaning

0	No error.

2	Program error--something was wrong with the commands
	or files input to the utility.

4	System error.  The utility ran out of memory, was
	interrupted by the user, or experienced an internal
	error.

	    Microsoft Overlay Linker (LINK)

Overlay Restrictions

You cannot use long jumps (using the longjmp library function) or indirect calls (through a function pointer) to pass control to an overlay. When a function is called through a pointer, the called function must be in the same overlay or in the root.

Changed LINK Error Messages

The explanation for fatal-error message L1008 is changed as follows:

The /SEGMENTS option specified a limit greater than 3072 on the
number of segments allowed.

Error message L1009 has been changed to read as follows:

L1009	<number> : CPARMAXALLOC : illegal value

Error message L1053 has been changed to read as follows:

L1053   out of memory for symbol table

The program had more symbolic information (such as public, external,
segment, group, class, and file names) than the amount that could fit
in available real memory.

Try freeing memory by linking from the DOS command level instead of
from a MAKE file or from an editor. Otherwise, combine modules or
segments and try to eliminate as many public symbols as possible.

Warning message L4050 has been changed as follows:

L4050	too many public symbols for sorting

The linker uses the stack and all available memory in the
near heap to sort public symbols for the /MAP option.  If
the number of public symbols exceeds the space available
for them, this warning is issued, and the symbols are not
sorted in the map file but are listed in arbitrary order.

New LINK Error Messages

L1003 /QUICKLIB, /EXEPACK incompatible

You cannot link with both the /QU option and the /E option.

L1006 : stack size exceeds 65535 bytes

The value given as a parameter to the /STACKSIZE option exceeds the maximum allowed.

L1063 out of memory for CodeView information

The linker was given too many object files with debug information, and the linker ran out of space to store it. Reduce the number of object files that have debug information.

L1115 /QUICKLIB, overlays incompatible

You specified overlays and used the /QUICKLIB option. These cannot be used together.

L2013 LIDATA record too large

An LIDATA record contained more than 512 bytes. This is probably a compiler error.

L2024 : special symbol already defined

Your program defined a symbol name that is already used by the linker for one of its own low-level symbols. (For example, the linker generates special symbols used in overlay support and other operations.) Choose another name for the symbol in order to avoid conflict.

L2025 : segment with > 1 class name not allowed with /INC

Your program defined a segment more than once, giving the segment different class names. Different class names for the same segment are not allowed when you link with the /INCREMENTAL option. Normally, this error should never appear unless you are programming with MASM. For example, if you give the two MASM statements

_BSS segment 'BSS'

and

_BSS segment 'DATA'

then the statements have the effect of declaring two distinct segments. ILINK does not support this situation, so it is disallowed when the /INCREMENTAL option is used.

L2041 stack plus data exceed 64K

The total of near data and requested stack size exceeds 64K, and the program will not run correctly. Reduce the stack size. The linker only checks for this condition if /DOSSEG is enabled, which is done automatically in the library startup module.

L2043 Quick Library support module missing

When creating a Quick library, you did not link with the required QUICKLIB.OBJ module.

L2044 : symbol multiply defined, use /NOE

The linker found what it interprets as a public-symbol redefinition, probably because you have redefined a symbol that is defined in a library. Relink with the /NOEXTDICTIONARY (/NOE) option. If error L2025 results for the same symbol, then you have a genuine symbol-redefinition error.

L4003 intersegment self-relative fixup at in segment pos: Record type: 9C target external ''

The linker found an intersegment self-relative fixup. This error may be caused by compiling a small-model program with the /NT option.

L4034 more than 239 overlay segments; extra put in root

Your program designated more than the limit of 239 segments to go in overlays. Starting with the 234th segment, they are assigned to the root (that is, the permanently resident portion of the program).

	Microsoft Library Manager (LIB)

New Option

There is a new option for LIB: /NOIGNORECASE (abbreviated as /N). This option tells LIB to not ignore case when comparing symbols. names. By default, LIB ignores case. Multiple symbols that are the same except for case can be put in the same library. An example of this is: "_Open" and "_open". Normally you could not add both these symbols to the same library.

Note that if a library is built with /NOI, the library is internally "marked" to indicate /NOI. All libraries built with earlier versions of LIB are not marked.

If you combine multiple libraries, and any one of them is marked /NOI, then /NOI is assumed for the output library.

In addition, LIB also supports the option /IGNORECASE (/I), which is completely analogous to /NOIGNORECASE. /I is the default. The only reason to use it would be if you have an existing library marked /NOI that you wanted to combine with other libraries which were not marked, and have the output library be not marked. If you don't use /IGNORECASE, the output is marked /NOI (see above).

Changed LIB Error Messages

Warning messages U4152, U4155, and U4157-U4159 for LIB are now nonfatal error messages U2152, U2155, and U2157-U2159, respectively.

Warning message U4151 has been changed to read as follows:

U4151	'<name>' : symbol defined in module <name>, redefinition ignored

New LIB Error Messages

The following new warning messages have been added for LIB:

U4155 : module not in library

A module specified to be replaced does not already exist in the library. LIB adds the module anyway.

U4157 insufficient memory, extended dictionary not created U4158 internal error, extended dictionary not created

For the reason indicated, LIB could not create an extended dictionary. The library is still valid, but the linker is not able to take advantage of the extended dictionary to speed linking.

	Microsoft Program Maintenance Utility (MAKE)

New Error Message

U1015: : error redirection failed

This error occurs if the /X option is given and error output cannot be redirected to the given file (for example, because the file is read-only).

Inference Rules

You cannot have inference rules in both the TOOLS.INI and the description file that use both the same inextension and outextension. For example, you cannot place the following inference rule in the TOOLS.INI file:

.c.obj:
	cl /c /Zi /Od $*.c

while also placing the following line in the description file:

.c.obj:
	cl /Ot $*.c

However, you can define the same macro in both the TOOLS.INI and the description file. In such cases, the definition in the description file takes precedence.

Backslash () as Continuation Character

Note that MAKE considers a backslash immediately followed by a new-line character to be a continuation character. When it finds this combination in a description file, MAKE concatenates the line immediately following the combination with the line where the combination appears.

If you define a macro that ends in a backslash, make sure that you put a space after the terminating backslash. For example, if you want to define macros for the path C:\SRC\BIN and C:\SRC\LIB, you must use the format illustrated below:

BINPATH=C:\SRC\BIN\<space><newline>
LIBPATH=C:\SRC\LIB\<space><newline>

To illustrate the problems that can result if you do not put a space before the new-line character, assume that the macros above appear as shown below instead:

BINPATH=C:\SRC\BIN\<newline>
LIBPATH=C:\SRC\LIB\<newline>

Because a new-line character appears immediately after the backslash at the end of the first macro, MAKE assumes that you are defining the single macro shown below:

BINPATH=C:\SRC\BIN\LIBPATH=C:\SRC\LIB\



    Microsoft STDERR Redirection Utility (ERROUT)

The ERROUT utility does not accept batch files. To redirect standard-error output from a batch file, you must enter a command of the following form:

ERROUT COMMAND /c <batchcommand> 

If no /f option is given, then ERROUT redirects standard-error output to the standard-output device.

		Mixed-Language Programming

Setting Up Calls to High-Level Languages

Section 6.6 of the Microsoft Mixed-Language Programming Guide gives in- structions for setting up a call to a high-level language from assembly language. Before you execute a call to a BASIC, Pascal, or FORTRAN routine, remember to declare an additional parameter if the return value is noninteger. This additional parameter must contain the offset address of the return value, for which you must allocate room within the stack segment (normally DGROUP, the same as the default data segment).

                   The BIND Utility

Specifying Libraries

You need to include DOSCALLS.LIB on the BIND command line. If DOSCALLS.LIB is not in the current directory, you must give the complete path name to DOSCALLS.LIB.

BIND automatically searches for API.LIB by looking in directories listed in the LIB environment variable. However, if API.LIB is specified on the command line, then BIND will not check the LIB environment variable; instead, you will need to give the complete path name.

For example, the following command line successfully uses BIND, if API.LIB is located in a directory listed in the LIB environment variable:

BIND FOO.EXE \LIB\DOSCALLS.LIB

Using BIND with Packed Files

The version of BIND released with this package does not work with files that have been linked with the /EXEPACK linker option.

Running Bound Files with DOS 2.1

A dual-mode executable file produced with BIND can be run in both DOS 3.x and DOS 2.x environments. However, if you change the name of an executable file produced by BIND, then it will not run under DOS 2.1.

             The Microsoft Incremental Linker (ILINK)

ILINK Fatal Error Messages

.sym seek error .sym read error

The .SYM file is corrupted.  Do a full link.  If the error
persists, contact Microsoft.

.sym write error

The disk is full or the .SYM file already exists with the
READONLY attribute.

map for segment exceeds 64K

The symbolic information associated with the given segment
exceeds 64K bytes, which is more than ILINK can handle.

can't ilink library

    You tried to incrementally link an altered library.
ILINK does not link .LIB files but only .OBJ files.
Use a full link instead.

.obj close error

The operating system returned an error when ILINK attempted
to close one of the .OBJ files.  Do a full link.  If the error
persists, contact Microsoft.

too many LNAMES in

An object module has more than 255 LNAME records.

too many SEGDEFs in

The given object module has more than 100 SEGDEF records.

too many GRPDEFs in

The given object module has more than 10 GRPDEF records.

symbol multiply defined

The given symbol is defined more than once.

#3

Please report this error to Microsoft.

Out of Memory

ILINK ran out of memory for processing the input.  If you
are running ILINK under MAKE, try running it from the shell.
Otherwise, do a full link.

could not run exec

ILINK was unable to find the file EXEC.EXE, which should be
placed somewhere in the search path or in the current
directory.

.exe file too big, change alignment

The segment sector alignment value in the .EXE file is too
small to express the size of one of the segments.  Do a full
link and increase the alignment value with the /ALIGNMENT
option to LINK.

.ilk seek error

The .ILK file is corrupted.  Do a full link.  If the error
persists, contact Microsoft.

Too many defined segments

ILINK has a limit of 255 defined segments, which are segments
defined in an object module as opposed to an executable segment.
Reduce the number of segments if you want to use ILINK.

too many library files

ILINK has a limit of 32 runtime libraries (.LIB files).  Reduce
the number of libraries.

too many modules

ILINK has a limit of 1204 modules in a program.  Reduce the
number of modules.

.ilk write error

The disk is full, or else ILINK cannot write to the .SYM file
because a .SYM file currently exists and has the READONLY attribute.

file does not exist

ILINK was unable to open the given file.  The file named was
in the file list in the .ILK file.

seek error on library

A .LIB file was corrupted.  Do a full link and check your .LIB
files.

library close error

The operating system returned an error when ILINK attempted
to close one of the .LIB files.  Do a full link.  If the error
persists, contact Microsoft.

error closing EXE file

The operating system returned an error when ILINK attempted
to close the .EXE file.  Do a full link.  If the error
persists, contact Microsoft.

Invalid module reference

The program makes a dynamic link reference to a dynamic link
module which is not represented in the .EXE file.

could not update time on

The operating system returned an error when ILINK attempted
to update the time on the given file.  Possibly the file had
the READONLY attribute set.

invalid flag only one -e command allowed

The ILINK command syntax is incorrect.

User Abort

The user issued CTRL+C or CTRL+BREAK.

file write protected

The .EXE, .ILK, or .SYM file needed to be updated and has the
READONLY attribute.  Change attribute to READWRITE.

file missing

One of the .OBJ files specified on the command line is missing.

file invalid .OBJ format file has invalid record

The given .OBJ file has an invalid format or one that is not
recognized by ILINK.  This may have been caused by a compiler
or assembler.

file was not full linked

An .OBJ file was specified as input to ILINK, which was not in
the list of files in the original full link.

LOBYTE seg-relative fixups not supported

This error message should occur only with MASM files.  See the
Microsoft Macro Assembler 5.0 Programmer's Guide. This type of
object module is not supported by ILINK.

undefined symbols

The given number of symbols were referred to in fixups but
never publicly defined in the program.

Incremental Violations

These errors cause a full link to occur if the -e option is used and -i is not used, else they are fatal errors:

symbol deleted

A symbol was deleted from an incrementally-linked module.

contains new SEGMENT

A segment was added to the program.

contains changed segment

The segment contribution (code or data which the module
contributes to a segment) changed for the given module:	it
contributed to a segment it didn't previously contribute to,
or a contribution was removed.

's segment grew too big

The given segment grew beyond the padding for the given module.

contains new GROUP

A new group was defined, via the GROUP directive in assembly
language or via the /ND C compiler option.

redefines group to include

The members of the given group changed.

symbol changed

The given data symbol was moved.

can't add new communal data symbol

A new communal data symbol was added as an uninitialized variable
in C or with the COMM feature in MASM.

communal variable grew too big

The given communal variable changed size too much.

invalid symbol type for

A symbol which was previously code became data, or vice versa.

too many COMDEFS too many EXTDEFS

The limit on the total of COMDEF records (communal data variables)
and EXTDEF records (external references) is 2000.

invalid CodeView information in .EXE file

The CodeView information found is invalid.

contains new Codeview symbolic info

A module previously compiled without -Zi was compiled with -Zi.

contains new linnum info

A module previously compiled without -Zi or -Zd was compiled
with -Zi or -Zd.

contains new public CV info

New information on public-symbol addresses was added.

invalid .exe file

The .EXE file is invalid.  Make sure you are using an up-to-date
linker.  If the error persists, contact Microsoft.

invalid .ilk file .ilk read error .ilk seek error

The .ILK file is invalid.  Make sure you are using an up-to-date
linker.  If the error persists, contact Microsoft.

.SYM/.ILK mismatch

The .SYM and .ILK files are out of sync.  Make sure you are using
an up-to-date linker.  If the error persists, contact Microsoft.

has changed

The given library has changed.

can't link 64K-length segments

ILINK cannot handle segments greater than 65,535 bytes long.

can't link iterated segments

ILINK cannot handle programs linked with /EXEPACK.

Entry table expansion not implemented

The program call tree changed in such a way that ILINK could
not handle it.

file does not exist

The .EXE, .SYM, or .ILK files are missing.

has changed

The given library module name has changed.

ILINK Warning messages

Fixup frame relative to an (as yet) undefined symbol - assuming ok

See documentation for LINK error messages L4001 and L4002,
in the Microsoft CodeView and Utilities manual.

contains TYPEDEFs - ignored contains BLKDEFs - ignored

The .OBJ file contains records no longer supported by Microsoft
language compilers.

old .EXE free information lost

The free list in the .EXE file has been corrupted.  The free
list keeps track of "holes" of free space in the EXE file.  These
holes are made available when segments are moved to new locations.

file has no useful contribution

The given module makes no contribution to any segment.

Main entry point moved

The program starting address changed.  You may want to consider
doing a full link.


                         Microsoft Editor

Installing the Editor

The Microsoft Editor does not come with an MESETUP program. Instead, run the setup program for the assembler. This program offers you choices about how to set up the editor.

Keystroke Configurations

Some of the keystroke configurations listed in Table A.2 of the Microsoft Editor User's Guide may need to be changed.

In the Quick/WordStar configuration, the Sinsert function is assigned to ALT+INS, not CTRL+INS.

In the BRIEF configuration, the Plines function is assigned to CTRL+Z, and the Refresh function is assigned to CTRL+].

In the EPSILON configuration, the Ppage function is assigned to PGDN, and the Sdelete function is assigned to DEL and CTRL+D.

The Compile Function

The commands

Arg streamarg Compile
    Arg textarg Compile

each use the command specified by the extmake:text switch. The editor does not check the extension of the file name given as an argument, but instead uses the "text" extension. The streamarg or textarg replaces a %s in the command. These commands are typically used to invoke MAKE.

The Setfile Function

The commands that use Setfile, along with a streamarg or textarg, accept a variety of input: either the name of a file, a file name with a wild-card character (* or ?), the name of a directory, or the name of a disk drive. File names can also include environment variables, such as $INIT. If the streamarg or textarg is a directory name, then the editor changes the current directory. If the argument is a drive name, then the editor changes the current drive. Environment variables are translated into directories to be searched for a file. For example, the following macro directs the editor to search the $INIT environment variable in order to find the tools.ini file:

tools.ini := Arg "$INIT:tools.ini" Setfile
tools.ini :ctrl+j

Entering Strings in Macros

When you enter a text argument directly, no characters have special meaning (except when the argument is interpreted as a regular expression). However, when you enter text as part of a macro, then strings inside of quotes are interpreted according to the C string format. This format uses a backslash followed by double quotes (") to represent double quotes and it uses two backslashes (\) to represent a single backslash. Therefore, to find the next occurrence of the string

She wrote, "Here is a backslash: \ "

you could use the following macro definition:

findit := Arg "She wrote, \"Here is a backslash: \\ \"" Psearch

Note that to indicate a backslash for a regular expression that is also part of a macro definition, you must use four consecutive backslashes.

Using Text Switches

The text switches extmake and readonly each take a special kind of syntax that allows you to specify drive, file name, base name, or file extension. The syntax consists of the characters:

%|F

where consists of any of the following: "p" for path, "d" for drive, "f" for file base name, or "e" for file extension. For example, if you are editing the file c:\dir1\sample.c, and you make the following switch assignment:

extmake:c cl /Fod:%|pfF %|dfeF

then each time you give the command <Arg><Compile>, the editor performs the following system-level command:

cl /Fod:\dir1\sample c:sample.c

The expression "%s" is equivalent to "%|feF" except that the former only works once, whereas the latter can appear any number of times in the extmake switch assignment. The expression "%|F" is equivalent to "%|dpfeF".

The Filetab Switch

The filetab switch is a numeric switch that determines how the editor translates tabs when loading a file into memory. The value of the switch gives the number of spaces associated with each tab column. For example, the setting "filetab:4" assumes a tab column every 4 positions on each line. Every time the editor finds a tab character in a file, it loads the buffer with the number of spaces necessary to get to the next tab column. Depending on the value of the entab switch, the editor also uses the filetab switch to determine how to convert spaces into tabs when writing to a file. The default value of filetab is 8.

Functions Callable by C Extensions

The following list summarizes functions from the standard compact- memory-model library, which should work when called by a C-extension module. (The technique of programming C extensions is presented in Chapter 8 of the Microsoft Editor User's Guide.) The memory model of the extension is assumed to be /Asfu (small code pointers, far data pointers, and stack segment unequal to data segment). This list uses the function categories from Chapter 4 of the Microsoft C Optimizing Compiler Run-Time Library Reference (Version 4.0 or later.)

Buffer Manipulation: All functions can be called.

Character Classification and Conversion: All functions can be called.

Data Conversion: All functions can be called except for

 strtod()

Directory Control: All functions can be called except for

 getcwd()

File Handling: All functions can be called.

Low-Level I/O Routines: All functions can be called, but write() will not work in binary mode.

Console and Port I/O: All functions can be called except for

 cgets()
 cprintf()
 cscanf()

Searching and Sorting: All functions can be called except for

 qsort()

String Manipulation: All functions can be called except for

 strdup()

BIOS Interface: All functions can be called.

MS-DOS Interface: All functions can be called except for

 int86()
 int86x()

Time: All functions can be called except for

 ctime()
 gmtime()
 localtime()
 utime()

Miscellaneous: All functions can be called except for

 assert()
 getenv()
 perror()
 putenv()
 _searchenv()

Linking Extensions in Protected Mode

To link C extension modules in protected mode, link with the object file EXTHDRP.OBJ, instead of the real-mode header EXTHDR.OBJ.