FIX: Operator "." and the Operator "*" (27835)
The information in this article applies to:
- Microsoft Macro Assembler (MASM) 5.0
- Microsoft Macro Assembler (MASM) 5.1
- Microsoft Macro Assembler (MASM) 5.1a
This article was previously published under Q27835 SYMPTOMS
When using scaled indexed addressing in the following Microsoft Macro
Assembler (MASM) 5.0, 5.1, or 5.1a instruction, the opcode generated is
incorrect. Note that the variable "esi" is being used as an index into a
structure and "eax" is the base.
mov eax,[eax.esi*2]
The opcodes generated by MASM indicate that MASM is not using scaled
indexed addressing. The code generated by MASM is effectively the same as:
mov eax,[eax+esi]
CAUSE
The problem occurs because the "." operator has a higher precedence than
the "*" operator. MASM turns:
[eax.esi*2]
into
[(eax+esi)*2]
as a result of the precedence. MASM evaluates "(eax+esi)" as a constant
instead of a register. Thus, the result of the constant expression
"(eax+esi)" is multiplied by two and the addressing mode is lost. This
results in MASM interpretting the operand as [eax+esi]
RESOLUTION
One workaround is to use the "+" operator which has lower precedence than
the "." operator and produces the correct result. Alternately parenthesis
can be used to give higher precedence to the "*" operator.
STATUS
Microsoft has confirmed this to be a problem in MASM version 5.0, 5.1, and
5.1a. This problem was corrected in MASM version 6.0.
Modification Type: | Major | Last Reviewed: | 10/17/2003 |
---|
Keywords: | kbfix KB27835 |
---|
|