A2006: phase error May Be Caused By Incorrect NOP

ID Number: Q59754

5.10 5.10a | 5.10 5.10a

MS-DOS | OS/2

buglist5.10 buglist5.10a fixlist6.00

Summary:

SYMPTOMS

Using the "SEG" directive in conjunction with forward reference to

a procedure or a segment name will produce the error

A2006 : phase error between passes

CAUSE

The assembler incorrectly places a "NOP" instruction in the code

generated during Pass 1. This NOP is not generated in Pass 2, so

the assembler generates a phase error. This phase error will most

often happen on the next instruction that is associated with a

fixup.

STATUS

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

and 5.10a. This problem was fixed in MASM version 6.00.

RESOLUTION

To work around this problem, introduce a NOP that is seen by the

assembler only during the second pass.

More Information:

The following code produces the errors. The errors do not occur when

the ax register is used. They occur when the bx, cx, and dx registers

are used. The workaround is shown in commented out lines.

Sample Code:

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

;Assemble options needed: none

;filler MACRO ;macro that codes a nop

; if2 ;in the second pass of the

; nop ;assembler

; endif

;ENDM

_text SEGMENT PARA PUBLIC 'CODE'

ASSUME CS:_TEXT

MOV cx, SEG proc1 ;error using cx, bx or dx

; filler

MOV ax, SEG proc1 ;no error using ax

MOV cx, SEG stackseg ;error using cx, bx, or dx

; filler

MOV ax, SEG stackseg ;no error using ax

STACKSEG SEGMENT PARA PUBLIC 'STACK'

db 100 dup (?)

STACKSEG ENDS

proc1 PROC FAR

ret

proc1 ENDP

_text ENDS

END