KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q44746: .MODEL and FAR_STACK, LOCAL_STACK in Quick Assembler

Article: Q44746
Product(s): See article
Version(s): 2.01
Operating System(s): MS-DOS
Keyword(s): ENDUSER | | mspl13_masm
Last Modified: 26-JUN-1989

Prior to Quick Assembler Version 2.01, the .MODEL directive expanded
into instructions that assumed that SS=DS=DGROUP. This situation is
not upheld at the start of a stand-alone assembly program (initially,
SS is set to the stack segment, and SP is set to the size of the
stack). The startup code of all Microsoft high-level languages sets
SS=DGROUP and adjusts SP accordingly.

Two new attributes have been added to the .MODEL directive:

1. FAR_STACK

2. LOCAL_STACK  (the default, if neither is specified)

These new options are designed to simplify setting up segments for
DS=SS and DS!=SS.

LOCAL_STACK is the default, and will direct .MODEL and .STACK to
behave as they have previously, i.e., set up segments assuming DS=SS.

FAR_STACK will direct the .MODEL and .STACK to do the correct setup
for a DS!=SS environment.

The following lists the expansion of a sample .MODEL and .STACK
directive:

.MODEL small = _data  SEGMENT WORD PUBLIC 'data'
               dgroup GROUP  _data
               _data  ENDS
               _text  SEGMENT WORD PUBLIC 'text'
               _text  ENDS
                      ASSUME cs:_text, ds:_data, ss:dgroup

.STACK 100h  = stack  SEGMENT PARA STACK 'stack'
               dgroup GROUP  stack
                      org 100h
               stack  ENDS

This setup assumes that DS==SS, which is the default. Specifying
".MODEL small, LOCAL_STACK" expands to the same instructions.

If you specify FAR_STACK in the above example, the expansion is as
follows:

.MODEL small, FAR_STACK
               _data  SEGMENT WORD PUBLIC 'data'
               dgroup GROUP  _data
               _data  ENDS
               _text  SEGMENT WORD PUBLIC 'text'
               _text  ENDS
                      ASSUME cs:_text, ds:_data, ss:NOTHING

.STACK 100h
               stack  SEGMENT PARA STACK 'stack'
                      ASSUME  SS:stack
                      org 100h
               stack  ENDS

Please note that the stack segment is not placed in DGROUP when
FAR_STACK is specified. Additionally, the "assume" generated by the
.MODEL assumes NOTHING for SS, and the .STACK performs an "assume" to
the stack segment.

An error is generated if FAR_STACK is specified along with the TINY
memory model.

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.