MSM9112001: Incorrect Code Generated If Operand Is

ID Number: Q78862

6.00 | 6.00

MS-DOS | OS/2

buglist6.00 fixlist6.00a

Summary:

PROBLEM ID: MSM9112001

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]

CAUSE

The operand [eax][eax] is available only when using the .386 or

.486 directives.

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.

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 reference words: 6.00