Microsoft Macro Assembler Package
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.
Note to DOS 3.0 Users
Because of an incompatibility between DOS 3.0 and the batch
file enhancer on this disk, you cannot run the setup batch
files under DOS 3.0. Instead, follow the setup instructions in
Chapter 1 of the Programmer's Guide. You can run the CodeView
demo on Disk 2. Type DEMO to run DEMO.BAT.
==( MASM.EXE )==
The /LA option has been added to specify a complete listing
of all symbols, macros, and false conditionals. It is
equivalent to using the .LIST, .LFCOND, .LALL, and .CREF
directives throughout the source file. The option overrides
any conflicting directives in the source file.
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
When evaluating expressions, MASM does 16-bit arithmetic except
when the 80386 processor is enabled. If the .386 or .386P
directive has been given, MASM does 32-bit arithmetic. This
behavior is consistent with earlier versions of MASM, which
always did 16-bit arithmetic. The notes in Sections 9.2.1 and
184.108.40.206 of the Programmer's Guide are incorrect. They should say
that MASM always does 16-bit arithmetic.
The description of declaring external symbols in Section 8.2
is incomplete and the example is incorrect. You cannot
access the segment of an external far data variable with the
@FARDATA equate. Instead you must use the SEG operator as
EXTRN fvar:WORD ; FAR variable in far data
start: ASSUME es:SEG fvar ; Tell the assembler
mov ax,SEG fvar ; Tell the processor
This is the same limitation described for communal variables
in Section 8.4. The reason is that under the DOS segment
conventions, multiple far data segments share the same name
(FAR_DATA) and have private combine type. Segments with the
same name can only be distinguished indirectly using the SEG
The .286P and .386P processor directives enable instructions
that are normally used in systems programming. However,
some of these instructions do not necessarily require that
the processor be in privileged or protected mode.
Public absolute symbols must be declared during pass 1. This
means that aliases for absolute symbols or other forward
references to them will cause errors. For example, the
following code generates an error:
lines EQU rows
rows EQU 25
This behavior is different than in previous versions of MASM
and contrary to the note in Section 8.1.
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 will cause errors if
used in expressions.
- A CS assume that changes from pass 1 to pass 2 causes
- Constants are now checked for type overflow.
- Reserved words used as labels produce warnings.
- The OFFSET operator used with a constant causes an error.
==( CREF.EXE )==
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.
==( MASM.EXE and LINK.EXE )==
The description of STACK combine type in Section 220.127.116.11
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 overrides data initialized in
previoussegments. This behavior is usually not relevant, since
most programs only define one stack of uninitialized data.
Stack data cannot be initialized with simplified segment
==( CodeView Debugger )==
The /R option has been added to enable the CodeView debugger
to use the debug registers (DR0, DR1, DR2, and DR3) of the
80386 processor. The option is ignored if you do not have an
The display does not change to indicate that the debug
registers are in use, but debugger operations with
tracepoint or trace memory statements (but not with
watchpoint statements) will be much faster. Any of the
following conditions will prevent the debugger from using
1) /E is used.
2) More than four tracepoints are set.
3) A tracepoint watches more than four bytes of memory.
4) A watchpoint is set.
The Pascal expression evaluator described in the CodeView
and Utilities manual is not implemented in this version of
the CodeView debugger. It will be implemented in the
debugger supplied with the next version of Pascal, which
will also produce executable files with CodeView symbolic
information. Current versions of Pascal do not work with the
Section 4.2, "FORTRAN Expressions," of the CodeView and
Utilities manual should mention that FORTRAN relational
operators do not work with string variables or constants.
Some versions of the GENOA EGA short card are incompatible
with CodeView when used with a mouse. You can work around this
problem by turning off the mouse with /M.
==( LINK.EXE )==
The following new LINK message warns about a practice that is
legal in real mode, but illegal in protected mode:
warning L4003: intersegment self-relative fixup at <position>
In assembly-language, the warning only occurs if the DOSSEG
directive or /DOSSEG linker option is used. It indicates a
16-bit jump to an address in another segment. For example,
the following code produces the error:
doit PROC NEAR
The warning usually indicates a fatal error in high-level-
language programs. It can occur when the /NT option is used
to compile a small-model C program.
==( Mixed-Languages Programming Guide )==
Naming convention rules on page 10 are incomplete. If you
combine BASIC with other high-level languages, avoid using
symbolic names longer than eight characters. Pascal and C
will recognize only the first eight characters, whereas
BASIC will recognize more than eight characters.
The example programs for BASIC in Chapter 6 will not work
with QuickBASIC Versions 2.0 or 3.0. They will work if you
rewrite the function as a subprogram, and omit the DECLARE
statement. Functions and DECLARE statements will be supported
in future versions of Microsoft BASIC compilers.
==( Macro Files )==
Macro files have been added to the Macro Assembler package.
The following files are provided:
MIXED.INC For defining assembler procedures
that can be called from high-level
MIXED.DOC Documentation for the macros in
DOS.INC For calling common DOS interrupts
BIOS.INC For calling common BIOS interrupts
used on IBM and IBM-compatible computers
MACRO.DOC Description, syntax, and reference
for using the macros in DOS.INC and