ID Number: Q29735
5.10 5.10a | 5.10 5.10a
MS-DOS | OS/2
buglist5.10 buglist5.10a fixlist6.00
Summary:
SYMPTOMS
The program example below demonstrates a problem with the LES
instructions in Microsoft Macro Assembler (MASM) versions 5.1 and
5.1a. The first LES instruction (Parm1) assembles correctly, but
the second instruction (Parm2) generates the error message:
error A2056: Immediate mode illegal
The only difference between the two instructions is the order of
the arguments. In earlier versions of MASM, they produced
identical code.
CAUSE
The problem is with the type operator and the way it handles
registers inside brackets ([]). The type operator makes things a
constant on the left of the expression.
Parm1 works because it handles registers inside brackets
differently. "TYPE x" turns bp into a constant; +10 then turns it
back into an addressing mode.
However, in Parm2, bp+10 has been turned into an addressing mode,
which is then turned into a constant by "TYPE x". This difference
is demonstrated in the sample code below.
STATUS
Microsoft has confirmed this to be a problem in MASM versions 5.1
and 5.1a. This problem was corrected in MASM version 6.0.
Sample Code
-----------
; Assemble options needed: none
.MODEL small
x STRUC
y DD ?
x ENDS
Parm1 EQU DWORD PTR [bp+TYPE x+10]
Parm2 EQU DWORD PTR [bp+10+TYPE x]
.CODE
begin:
les di,Parm1
les di,Parm2
END begin
Additional reference words: 5.10 5.10a