From news.sas.ab.ca!rover.ucs.ualberta.ca!news.bc.net!vanbc.wimsey.com!news.mindlink.net!agate!howland.reston.ans.net!news.sprintlink.net!news.dgsys.com!DGS.dgsys.com!raymoon Mon Mar 27 16:41:41 1995
Path: news.sas.ab.ca!rover.ucs.ualberta.ca!news.bc.net!vanbc.wimsey.com!news.mindlink.net!agate!howland.reston.ans.net!news.sprintlink.net!news.dgsys.com!DGS.dgsys.com!raymoon
From: raymoon@dgsys.com (Raymond Moon)
Newsgroups: comp.lang.asm.x86,alt.lang.asm
Subject: x86 Assembly Language FAQ - TASM
Followup-To: poster
Date: 25 Mar 1995 23:20:08 GMT
Organization: Digital Gateway Systems
Lines: 269
Distribution: world
Expires: Thu, 20 Apr 1995 23:59:59 GMT
Message-ID: <3l28f8$1j8@news.dgsys.com>
Reply-To: raymoon@dgs.dgsys.com
NNTP-Posting-Host: dgs.dgsys.com
Summary: This is the FAQ for the x86 Assembly Language programmers
 for the alt.lang.asm and comp.lang.asm.x86 newsgroups.  This
 particular section of the FAQ contains x86 assembly information
 specific to the Borland TASM assembler.
Keywords: ASM FAQ TASM
X-Newsreader: TIN [version 1.2 PL2]
Xref: news.sas.ab.ca comp.lang.asm.x86:6024 alt.lang.asm:4556

Archive-name: asm_x86_faq/tasm
Alt-lang-asm-archive-name: asm_x86_faq/tasm
Comp-lang-asm-x86-archive-name: asm_x86_faq/tasm
Posting-Frequency: monthly (21st of every month)
Last-modified: 1995/03/22

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

Subject: 1. Introduction and Intent

This is the x86 Assembly Language FAQ for the comp.lang.asm.x86 and
alt.lang.asm and newsgroups.  This FAQ is posted monthly on or about
the 21st of the month on both newsgroups and news.answers, alt.answers
and comp.answers.  It also is archived at the normal FAQ archival
sites.  Currently, this FAQ is broken into four sections.  The
following are the section filenames (hopefully, once the FAQ as a
whole is approved) and the scope of each section of the FAQ.

asm_x86_faq/gen_part1 - This is the basic portion of the FAQ that
    contains information of interest to all assembly language
    programmers.  In general, the information contained in this
    portion of the FAQ is not specific to any particular assembler.

asm_x86_faq/gen_part2 - This is a continuation of the above FAQ.

asm_x86_faq/masm - This portion of the FAQ contains information
    specific for the Microsoft MASM.

asm_x86_faq/tasm - This portion of the FAQ contains information
    specific for the Borland TASM.

asm_x86_faq/A86 - This portion of the FAQ contains information
    specific for the A86 Shareware Assembler.

The scope and content of this FAQ is to go beyond just answering the
frequently asked questions.  I am including pointers to assembly
language treasure troves that are hidden out on the internet.  I
believe that this will enhance the FAQ's value not only to the novices
but also to the old hands.

Any subject listed as "OPEN" means that this topic as been requested
but no one has come forth and volunteered to write this section. 
Volunteers please indicate your intentions to the author listed below
either by posting to either newsgroup or by sending e-mail to the
author at the below address.

The general guidelines for submission are:
 *  accuracy and conciseness;
 *  pointers to where on the internet more detailed information is
    available; and
 *  any code submitted will be generic so that most assemblers can
    assemble successfully.

Any subject listed as "UNDER CONSTRUCTION" has a volunteer currently
writing that subject.  If you desire to assist or have some
information that you believe would be of help in writing that
particular subject, contact the contributor of that subject or post to
both newsgroups.  Once a subject is submitted to me, I will post it on
both newsgroups for comment.  After any changes that may be necessary
are made, I will include it in the next posting of the FAQ.

For the ease of determining what has changed since the last FAQ, the
Table of Contents will have "REVISED" at the end of the subject line
for all revised subjects.  If more than one FAQ revision has been
missed, the "Last Changed:" entry at the end of each subject can be
used to determine which subjects have been revised during the
intervening time frame.

The information in this FAQ is free for all to use as long as you
acknowledge the source.  This FAQ can be reproduced in part or in its
entirety as long as the copyright is included.  This FAQ can be made
available on public servers, like ftp, gopher or WWW servers.  Please
do not modify the file, such as converting it into some other format,
without prior permission of the author.

Suggestions for changes and comments are always welcome.  They can be
posted to either newsgroup or e-mailed directly to the me.

As I had to break this section of the FAQ into two parts, I probably
will have to start the approval process all over again.  That is about
a two month process.  So, do not use the above filenames until this
FAQ is approved.

Author: Raymond Moon, raymoon@dgs.dgsys.com
Copyright 1995 - Raymond Moon
ALL RIGHTS RESERVED
Last Changed: 22 Mar 95

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

Subject: 2. Table of Contents

1.  Introduction And Intent                 REVISED
2.  Table Of Contents                               
3.  TASM Ideal Mode

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

Subject: 3. TASM Ideal Mode

3.1  SUMMARY

TASM, Borland's assembler, supports an alternative to MASM emulation. 
This is known as Ideal mode and provides several advantages over MASM. 
The key (questionable) disadvantage, of course, is that MASM style
assemblers cannot assemble Ideal mode programs.

3.2  MEMORY CONTENTS

Square brackets are used consistently to refer to memory contents.
Notice that size qualifiers are not necessary when TASM has enough
information by context to figure out the data size involved.  Here are
some examples without segment details:

    ByteVal db  ?           ; "ByteVal" is name of byte variable

    mov     ax, bx          ; OK:  Move value of BX to AX

    mov     ax, [bx]        ; OK:  Move word at address BX to AX
                            ; Size of destination is used to generate
                            ; proper object code

    mov     ax, [word bx]   ; OK:  Same as above with unnecessary
                            ; size qualifier

    mov     ax, [word ptr bx]
                            ; OK:  Same as above with unnecessary
                            ; size qualifier and redundant pointer
                            ; prefix

    mov     al, [bx]        ; OK:  Move byte at address BX to AL.
                            ; Size of destination is used to
                            ; generate proper object code

    mov     [bx], al        ; OK:  Move AL to location BX

    mov     ByteVal, al     ; Warning: "ByteVal" needs brackets

    mov     [ByteVal], al   ; OK:  Move AL to memory location named
                            ; "ByteVal"

    mov     [ByteVal], ax   ; Error: unmatched operands

    mov     al, [bx + 2]    ; OK:  Move byte from memory location
                            ; BX + 2 to AL

    mov     al, bx[2]       ; Error: indexes must occur with "+" as
                            ; above

    mov     bx, Offset ByteVal
                            ; OK: Offset statement does not use
                            ; brackets

    mov     bx, Offset [ByteVal]
                            ; Error:  offset cannot be taken of
                            ; the contents of memory

    lea     bx, [ByteVal]   ; OK:  Load effective address of "ByteVal"

    lea     bx, ByteVal     ; Error:  brackets required

    mov     ax, 01234h      ; OK:  Move constant word to AX

    mov     [bx], 012h      ; Warning: size qualifier needed to
                            ; determine whether to populate byte or
                            ; word

    mov     [byte bx], 012h ; OK:  constant 012h is moved to byte at
                            ; address BX

    mov     [word bx], 012h ; OK:  constant 012h is moved to word at
                            ; address BX

STRUCTURE REFERENCES

Ideal mode handles structured records beautifully.  When referring
to structure members the dot operator is used.  The name to the left
of the dot is always the address of a structure and the name to
right is always a structure member.  Ideal mode permits member names
to be duplicated in different structures.  Here is a simple example,
again without segment details:

    Struc PosType
        Row     dw  ?
        Col     dw  ?
    Ends PosType

    Union PosValType
        Pos     PosType     ?
        Val     dd          ?
    Ends PosValType

    Point   PosValType  ?

    mov     [Point.Pos.Row], bx     ; OK:  Move BX to Row component of
                                    ; Point

    mov     [Point.Pos.Row], bl     ; Error:  mismatched operands

INDIRECTION

Ideal mode enforces type-size checking even with indirected
references.  Using the above structure, here is how indirection is
handled.  BX is assumed to point to an instance of PosValType in
memory.  Indirection is used frequently when pointers are passed to
procedures.

    mov     [(PosValType bx).Pos.Row], ax
                            ; OK: Move AX to Row component of
                            ; PosValType instance pointed to by BX

    mov     [bx + PosValType.Pos.Row], ax
                            ; OK: same as above

    mov     [bx + PosValType.Pos.Row], al
                            ; Error:  mismatched operands

SEGMENT GROUPS

The Offset operator always evaluates the offset of a data instance
relative to its group, not its segment.  This allows Offset to be
used without qualifying each reference with the appropriate group
name.  Labels in a segment could be used to determine segment
offsets if needed.

RESOURCES

Books and files which will be of interest to programmers wishing to
know more about the Ideal mode of Borland's TASM assembler include
the following:

    Turbo Assembler User's Guide / Borland International.
    ------------------------------------------------------------------
    Naturally, this is the definitive text on Ideal mode.  Its focus
    is strictly on using TASM; it does not cover assembly language or
    the x86 instruction set.  Exasperatingly, the examples in the book
    all use MASM emulation mode, and only one of the four complete
    program examples included with TASM (at least version 3.1) uses
    Ideal mode.  The example that does use Ideal mode is a very
    flexible WHEREIS program.  Studying this 13 file example should be
    sufficient for anyone wishing to understand Ideal mode.

    Mastering Turbo Assembler / Tom Swan.
    Indianapolis, IN:  Hayden Books, c 1989.
    ------------------------------------------------------------------
    This book is not just another Microsoft Assembler book reprinted
    with a Turbo Assembler cover.  Swan uses and promotes Ideal mode
    throughout.  This is a great beginning text for programmers who
    are still hassling with the ubiquitous non-reentrant interrupt
    handler known as DOS.  It includes an overview of the x86
    instruction set.

    SKEL32.ZIP / Bill Magaletta.
    Obtainable by ftp at hobbes.nmsu.edu:/os2/32bit/program as well as
    ftp-os2.cdrom.com and CompuServe
    ------------------------------------------------------------------
    This is a standalone 32 bit OS/2 Ideal mode program, the
    simplicity of which will make converts of DOS programmers dealing
    with interrupts and segments.  It includes an overview of the
    initial register states of DOS and OS/2 programs.  This example
    illustrates the fact that TASM for DOS can be used to produce
    object files for OS/2.

Contributor: Kurt Jung, kwjung@vela.acs.oakland.edu
Last changed: 17 Jan 95
 
 



