FIX: Incorrect Code Generated If Operand Is [eax][eax]

ID: Q78862


The information in this article applies to:
  • Microsoft Macro Assembler for MS-DOS, version 6.0
  • Microsoft Macro Assembler for OS/2, version 6.0


SYMPTOMS

In the Microsoft Macro Assembler (MASM) version 6.0, incorrect code is generated for instructions, such as the following, using the operand [eax][eax]:

lea edi, [eax][eax]
mov edi, [eax][eax]


RESOLUTION

A workaround for this problem is to embed the opcode for the instruction directly in the code. The sample code below demonstrates this method.


STATUS

Microsoft has confirmed this to be a problem in MASM version 6.0. This problem was corrected in MASM version 6.0a.


MORE INFORMATION

A listing file from the following program will show that the instruction lea edi, [eax][eax] is encoded as 8D 3C 3A. However, the code actually placed into the executable is 8D 3C. The correct code in the case of lea edi, [eax][eax] is 8D 3C 00. Note that the operand [eax][eax] is available only when using the .386 or .486 directives.

Sample Code


; Assembler options needed: none

.386
.MODEL small

CODE32 SEGMENT DWORD PUBLIC USE32 'CODE'
ASSUME CS:CODE32
main PROC
    lea edi, [eax][eax] ; Replace this by BYTE 8Dh, 3Ch, 00h
                        ; since the code generated by it is
                        ; 8D 3C 3A, which is incorrect.
    mov edi, [eax][eax] ; Replace this by BYTE 8Bh, 3Ch, 00h
                        ; since the code generated by it is
                        ; 8B 3C 3A, which is incorrect.
    ret
main ENDP
CODE32 ENDS

END main 

Additional query words: 6.00 buglist6.00 fixlist6.00a

Keywords :
Version : :6.0
Platform :
Issue type :


Last Reviewed: January 5, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.