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