ID Number: Q74925
6.00
MS-DOS
buglist6.00 fixlist6.00a
Summary:
SYMPTOMS
The Microsoft Macro Assembler (MASM) version 6.0 includes a
predefined macro in DOS.INC called @ShowStr that displays a
$-terminated string. When the argument to @ShowStr is a string
literal and there are no segment directives or ends directives
following the occurrence of @ShowStr, the assembler will generate
the following error:
fatal error A1010: unmatched block nesting: _DATA
RESOLUTION
To work around this problem, make sure that a simplified segment
directive or ends directive follows the @ShowStr macro.
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:
When @ShowStr is passed a string literal, the macro generates the
following code:
sseg TEXTEQU @CurSeg ; save current segment
.DATA ; change segment
msg BYTE ofset, "$" ; terminate string with a '$'
sseg SEGMENT ; restore segment
mov dx, OFFSET msg
mov ah, 9
int 21h ; display '$' terminated string
The line "sseg SEGMENT" restores the segment but the macro never
closes the segment; it relies on the user subsequently closing the
segment with the appropriate ends directive or by opening another
segment with a simplified segment directive. If the segment is left
open, an A1010 error is generated.
In the sample code below, @ShowStr is in a segment started with .CODE.
In the macro expansion, that segment is ended and the next segment
begun with .DATA. The code segment is restored with the statement
_TEXT SEGMENT. This segment is not closed in the macro or in the
subsequent code, so the A1010 error is produced. The error can be
eliminated by uncommenting either of the commented lines.
Sample Code
-----------
; Assemble options needed: none
.MODEL small, OS_DOS
INCLUDE dos.inc
.STACK
.CODE
.STARTUP
@ShowStr "Hello"
.EXIT
; uncomment one of the following lines to work around the problem
; _TEXT ENDS
; .DATA
END