MSM9107013:A2154 If Structure Member in Control-Flow Directive

ID Number: Q74666

6.00 6.00a | 6.00 6.00a

MS-DOS | OS/2

buglist6.00 buglist6.00a

Summary:

SYMPTOMS

The Microsoft Macro Assembler (MASM) versions 6.0 and 6.0a provide

several Control-Flow directives such as the .WHILE, .REPEAT, and

.IF constructs. When structure members are accessed inside of these

constructs, MASM may incorrectly generate the following error:

error A2154: syntax error on control-flow directive

RESOLUTION

The sample program below illustrates this problem. As a workaround,

a register or a temporary variable may be used to hold the

structure member, as demonstrated below in Sample Code 2.

STATUS

Microsoft has confirmed this to be a problem in MASM versions 6.0

and 6.0a. We are researching this problem and will post new

information here as it becomes available.

More Information:

Sample Code 1

-------------

; Assemble options needed: none

.MODEL small, c, os_dos

.STACK

.DATA

STRUCT1 STRUCT

SMember SWORD 0

STRUCT1 ENDS

var1 STRUCT1 <0>

.CODE

.STARTUP

mov bx, offset var1

.WHILE ((STRUCT1 PTR [bx]).SMember != 1000)

inc (STRUCT1 PTR [bx]).SMember

.ENDW

.REPEAT

dec (STRUCT1 PTR [bx]).SMember

.UNTIL ((STRUCT1 PTR [bx]).SMember == 0)

.IF ((STRUCT1 PTR [bx]).SMember == 0)

nop

.ENDIF

.EXIT 0

END

Sample Code 2

-------------

.MODEL small, c, os_dos

.STACK

.DATA

STRUCT1 STRUCT

SMember SWORD 0

STRUCT1 ENDS

var1 STRUCT1 <0>

.CODE

.STARTUP

mov bx, offset var1.SMember

.WHILE (SWORD PTR [bx] != 1000)

inc SWORD PTR [bx]

.ENDW

.REPEAT

dec SWORD PTR [bx]

.UNTIL (SWORD PTR [bx] == 0)

.IF (SWORD PTR [bx] == 0)

nop

.ENDIF

.EXIT 0

END