FIX: Operator "." and the Operator "*"Last reviewed: September 10, 1997Article ID: Q27835 |
5.00 5.10 5.10a | 5.10 5.10a
MS-DOS | OS/2kbtool kbfixlist kbbuglist The information in this article applies to:
SYMPTOMSWhen 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] CAUSEThe 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]
RESOLUTIONOne 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.
STATUSMicrosoft 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 INFORMATIONUnder 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:_TEXTstart: 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
|
Additional reference words: 5.00 5.10 5.10a buglist5.00 buglist5.10
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |