Operator "." and the Operator "*"

ID Number: Q27835

5.00 5.10 5.10a | 5.10 5.10a

MS-DOS | OS/2

buglist5.00 buglist5.10 buglist5.10a fixlist6.00

Summary:

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.

More Information:

Under Microsoft MASM 6.0 the following error will be generated.

error A2026: constant expected

Sample Code

-----------

; Assemble options needed: none

.386

_TEXT SEGMENT PARA PUBLIC USE16 'CODE'

ASSUME cs:_TEXT

start:

mov eax,[eax+esi*2] ; This is the desired instruction

; Note the use of "+" instead of "."

mov eax,[eax.(esi*2)] ; This is also the desired instruction

; Note the use of () around the "*"

mov eax,[eax.esi*2] ; This is the format that is misinterpreted

; Under MASM 6.0 this generates an A2026

mov eax,[eax+esi] ; This is what is incorrectly generated

; by MASM 5.0, 5.1, and 5.1a

mov ax, 4C00h

int 21h

_TEXT ENDS

END start