From: raymoon@dgsys.com (Raymond Moon)
Newsgroups: alt.lang.asm,comp.lang.asm.x86,news.answers,alt.answers,comp.answers
Subject: x86 Assembly Language FAQ - General Part 2/3
Supersedes: <5jglp6$ijs@news.dgsys.com>
Followup-To: alt.lang.asm,comp.lang.asm.x86
Date: 22 May 1997 00:24:11 GMT
Organization: MoonWare
Lines: 898
Approved: news-answers-request@MIT.EDU
Distribution: world
Expires: Fri, 20 Jun 1997 23:59:59 GMT
Message-ID: <5m03nb$fof@news.dgsys.com>
Reply-To: raymoon@moonware.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 is part two of three parts that contain x86 assembly language information common to all assemblers.
Keywords: x86 Assemby Language ASM FAQ General

Archive-Name: assembly-language/x86/general/part2
Posting-Frequency: monthly (21st of every month)
Last-modified: 1997/05/21

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

Subject: 15. Accessing 4 Gigs of Memory in Real Mode

Flat real mode is a popular name for a technique used to access up to 4 GB
of memory, while remaining in real mode.  This technique requires a 80386
or higher processor.  The address space really is not flat, actually, this
technique allows you treat one or more segments as large (32-bit) segments,
thereby accessing memory above 1 MB.

When the CPU accesses memory, the base address of the segment used is not
described by the value currently in the appropriate register.  The value is
stored internally in a structure known as the descriptor cache.  Changing
the value of a segment register results in that segment's entry in the
descriptor cache being recalculated according to the rules of the current
mode.  In real mode, the value of the segment register is shifted left four
bits to find the base address of the segment, and the size of the segment
is always 64k.  In protected mode, the value in the segment register is
used as an index into a descriptor table located in memory, and the base
address and size (which may be as small as 4 KB, or as large as 4 GB) from
the descriptor table are loaded into the descriptor cache.

When the processor changes modes, the contents of the processor's internal
descriptor cache are not changed.  The reason is because changing them
would result in (at the very least) the code segment being recalculated
according to the new mode's rules, most likely causing your program to
crash.  Thus the program must load the segment registers with sensible
values after the mode switch occurs.  Consider an example where real mode
code is located in segment 1000h.  If switching modes caused an immediate
recalculation of the descriptor cache, the processor would attempt to read
entry 1000h of the descriptor table immediately upon switching to protected
mode.  Even if this were a valid descriptor (unlikely), it would have to
have a base address identical to real mode segment 1000h (i.e., 10000h),
and a size limit of 64 KB to prevent a probable crash.  An invalid
descriptor would cause an immediate processor exception.

Normally, aside from preventing situations like that in the above example,
there is little to be said about this feature.  After all, as soon as you
reload new values into the segment register, the descriptor cache entry for
that segment will be reset according to the rules of the current mode. 
After switching from protected mode to real mode, however, when you load
the segment registers with their new values, the segment's base address is
recalculated according to real mode rules, but the size limit is not
changed.  After setting the 4 GB limit (which must be done in protected
mode), it will stay in place until changed by another protected mode
program, regardless of what values are loaded in the segment register in
real mode.

So, the steps to using this technique are as follows:
    1.  Set up a bare bones global descriptor table, with a null entry, and
a single entry for a 4 GB segment.  The base address of this segment is not
important.
    2.  If you don't wish to define an interrupt descriptor table (IDT),
you must disable interrupts before switching to protected mode.  You do not
need a full-fledged protected mode environment for this, so it is easiest
just to disable interrupts and not worry about the IDT.
    3.  Switch to protected mode. 
    4.  Load the segment registers you wish to change with the selector for
the 4 GB segment.  I recommend using FS and/or GS for this purpose, for
reasons I'll describe below.
    5.  Return to real mode.
    6.  Re-enable interrupts.

After these steps, you can then load your segment registers with any value
you wish.  Keep in mind that the base address will be calculated according
to real mode rules.  Loading a value of 0 into a segment register will
result in a 4 GB segment beginning at physical address 0.  You can use any
of the usual 32-bit registers to generate offsets into this segment.

Some points to keep in mind:
    1.  Some software depends on 64 KB segment wrap-around.  While rare, it
is possible that you will encounter software that crashes if the older
segments (DS or ES) are 4 GB in size.  For that reason, I recommend only
using FS and/or GS for this purpose, as they are not used as widely as the
others.
    2.  You should never change the limit of the code segment.  The
processor uses IP (not EIP) to generate offsets into the code segment in
real mode; any code beyond the 64 KB mark would be inaccessible, regardless
of the segment size.
    3.  You should never change the limit of the stack segment.  This is
similar to the above; the processor uses SP in real mode, rather than ESP.
    4.  Because of the necessity of switching to protected mode, this
technique will not work in a virtual 8086 mode "DOS box" from Windows,
OS/2, or any other protected mode environment.  It only works when you
start from plain, real mode DOS.  Many memory managers also run DOS in V86
mode, and prevent the switch to protected mode.  It is possible to use VCPI
to work around this, but if you go to that length you will probably find
that you have implemented a complete protected mode environment, and would
not need to return to real mode anyway.
    5.  This technique will not work in the presence of any protected mode
software that changes segment size limits.  When that software returns
control to your real mode program, the limits will be the values to which
the protected mode code set them.  If these limits are different that what
your program used, problems can result.  At the very least, your program
will return incorrect results when accessing data stored in extended
memory.  At worst, your program will crash and burn.

The benefits of this technique are many.  Most importantly, you can access
extended memory without resorting to slow BIOS calls or having to implement
a complete DOS extender.  If your program uses interrupts extensively
(timer interrupts for animation or sound, for example), real mode is a
better choice because protected mode handles interrupts slower.  DOS itself
uses this technique in HIMEM.SYS as a fast, practical method of providing
access to extended memory.

Code demonstrating this technique is available in the file, realmem.zip. 
This file is available using anonymous ftp from x2ftp.oulu.fi in the
directory, pub/msdos/programming/memory.

For further reading on this topic, I suggest "DOS Internals," by Geoff
Chappell.  It is published by Addison-Wesley as part of the Andrew Schulman
Programming Series.  The ISBN number is 0-201-60835-9.

Contributor: Sherm Pendley, grinch@access.mountain.net
Last changed: 15 Jan 95

Return to the Table Of Contents

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

Subject: 16. What Is Available at developer.intel.com

16.1 PENTIUM & PENTIUM PRO INFORMATION

The gateway for information on the Pentium and Pentium Pro at Intel are:

    http://developer.intel.com/design/pentium
    http://developer.intel.com/design/pro

Information linked to this page are: Application Notes, Datasheets,
Manuals, Specification Updates, and much more.  

16.2 INTEL DEVELOPMENT TOOLS

The below page has links to software, hardware, evaluation kits and
documentation on Intel OEM products.  Areas covered are Intel Software
Performance Products, Internet Technologies, Multimedia and Intel Products.

    http://developer.intel.com/design/develop.htm

16.3 INTEL TECHNOLOGIES

Intel has overviews, in-depth system architecture tutorials and
specifications on a variety of PC platform and communicatins technologies. 
Areas covered are MMX Technology, Intelligent I/O, WinSock 2, and much
more.

    http://developer.intel.com/design/tech.htm

16.4 GET INTEL'S WEB SITE ON CDROM

Have you been spending a long time on line downloading one of the many
manual available from Intel's Developer Web Site.  Now you can get the
entire Technology and Product portions of that web site available on CDROM. 
You access the CDROMs with your browser.  It now takes longer to launch the
Acrobat reader than to download a Meg .pdf file.

Call Intel Sales: 1-800-628-8686 (US & Canada), 1-916-356-7599 (Outside US)

The order number is 273000-002.

The current version is Jan 97 but is quite up to date for manuals.  You can
sign up for updates.

I wish to thank Christian Ludloff for posting the above information.

Contributor: Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 18 Mar 97

Return to the Table Of Contents

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

Subject: 17. Interrupts and Exceptions

    "(with interrupts) the processor doesn't waste its time looking for
    work - when there is something to be done, the work comes looking for
    the processor."
                                    - Peter Norton

INTERRUPTS AND EXCEPTIONS

Interrupts and exceptions both alter the program flow. The difference
between the two is that interrupts are used to handle external events
(serial ports, keyboard ) and exceptions are used to handle instruction
faults, (division by zero, undefined opcode).

Interrupts are handled by the processor after finishing the current
instruction. If it finds a signal on its interrupt pin, it will look up the
address of the interrupt handler in the interrupt table and pass that
routine control.  After returning from the interrupt handler routine it
will resume program execution at the instruction after the interrupted
instruction.

Exceptions on the other hand are divided into three kinds.  These are
Faults, Traps and Aborts.  Faults are detected and serviced by the
processor before the faulting instructions.  Traps are serviced after the
instruction causing the trap. User defined interrupts go into this
category and can be said to be traps, this includes the MS-DOS INT 21h
software interrupt, for example.  Aborts are used only to signal severe
system problems, when operation is no longer possible.

See the below table for information on interrupt assignments in the Intel
386, 486 SX/DX processors, and the Pentium processor. Type specifies the
type of exception.

_____________________________________________________________________
Vector number   Description
_____________________________________________________________________
     0          Divide Error (Division by zero)
     1          Debug Interrupt (Single step)
     2          NMI Interrupt
     3          Breakpoint
     4          Interrupt on overflow
     5          BOUND range exceeded
     6          Invalid Opcode
     7          Device not available (1)
     8          Double fault
     9          Not used in DX models and Pentium (2)
    10          Invalid TSS
    11          Segment not present
    12          Stack exception
    13          General protection fault
    14          Page fault
    15          Reserved
    16          Floating point exception (3)
    17          Alignment check (4)
    18 - 31     Reserved on 3/486, See (5) for Pentium
    32 - 255    Maskable, user defined interrupts
_____________________________________________________________________
(1) Exception 7 is used to signal that a floating point processor is not
    present in the SX model. Exception 7 is used for programs and OSes that
    have floating point emulation. Also the DX chips can be set to trap
    floating point instructions by setting bit 2 of CR0.
(2) Exception 9 is Reserved in the DX models and the Pentium, and is only
    used in the 3/486 SX models to signal Coprocessor segment overrun. This
    will cause an Abort type exception on the SX.
(3) In the SX models this exception is called 'Coprocessor error'.
(4) Alignment check is only defined in 486 and Pentiums. Reserved on any
    other Intel processor.
(5) For Pentiums Exception 18 is used to signal what is called an 'Machine
    check exception'.

The other interrupts, (32-255) are user defined. They differ in use from
one OS to another.

For a list of MS-DOS interrupts, see 'Obtaining HELPPC' (Subject #6) or
Ralf Browns Interrupt List (Subject #11)

Contributor: Patrik Ohman, patrik@astrakan.hgs.se
Last changed: 10 Jan 95

Return to the Table Of Contents

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

Subject: 18. ASM Books Available

The format is Author, Title, Level, and short description

Ray Duncan
Advanced MSDOS Programming
Advanced
Both a tutorial and a reference for MS-DOS capabilities and services,
including reference sections on DOS function calls, IBM ROM BIOS, mouse
driver and LAM. expanded memory. Excellent quality example programs
throughout.

By Peter Norton and John Socha
Peter Norton's Assembly Language Book For the IBM PC
Novice
Good for an introduction to Assembly Language.  Plenty of programming
examples.  Older versions of this book used to have a sample disk.  As you
read the book, you slowly add on code to what eventually is Disk Patch -
the book's version of Norton's commercially available Disk Edit program.  
Great for complete beginners seeking novice rank.

Maljugin, Izrailevich, Sopin, and Lavin
The Revolutionary Guide to Assembly Language
Novice
This is one of the best introductory texts I've ever seen  There are so
many authors that the topic is broken down into specific categories:
video, BIOS, keyboard, etc..  Most intro texts force you to follow a set
plan of learning assembly, but in this book you can turn to a specific
topic almost immediately.  It's so-so as a reference book, however - a few
tables of interrupts in the back. 

Maljugin, Izrailevich, Sopin, and Lavin
Master Class Assembly Language
Advanced
Review: This is the sequel to The Revolutionary Guide To Assembly Language. 
Equally thick and massive, it covers many of the topics we see today -
hardware interfaces, sound cards, data compression, even protected mode
programming.  Brief review of assembly at the beginning, but moves very
quickly.  Read this if you're intermediate seeking expert status. 
Definitely not recommended for beginners.  If you are a beginner and you
think you like the topics covered in this book, buy the one before it too. 
Also comes with a disk of source code examples from the book (MASM highly
recommended, not TASM).

Alan Wyatt
Advanced Assembly Language
Advanced
This book's best feature is its comprehensive guide on device drivers. 
There are good chapters on controlling the mouse, file access, using
memory, etc.

Ralf Brown and Jim Kyle
PC Interrupts - 2nd Edition
Intermediate/Advanced
The definitive book on interrupt programming for PCs and compatibles. 
Based on the freeware Interrupt List by Ralf Brown

For an extensive book list without descriptions, point your web browser to
    http://alaska.net/~rrose/assembly.htm
Sites with more books but no reviews are:
        http://www.fys.ruu.nl/~faber/Amain.html
        http://www.cet.com/~jvahn/80xbook.html (short descriptions)

Contributors:  Antonio Alonso, Solomon Chang, Paul Gilbert, Dave Navarro,
Mike Schmit and James Vahn.
Last changed: 19 Dec 95

Return to the Table Of Contents

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

Subject: 19. ASM Code Available On The Internet

19.1  SIMTEL SITES

The SimTel has a directory devoted to assembly language. 

    ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl
or
    http://www.simtel.net/simtel.net/msdos/asmutl

19.2  80xxx Snippets

Fidonet's echo for 80xxx programming has a collection of code that is
maintained by Jim Vahn, jvahn@short.circuit.com.  The collection is
available via mail based archive server or Fidonet file requests to
1:346/15.

To get a list of files available via e-mail, send an empty message to
files@circuit.com.  The server will return a list of all files available
and instruction on how to retrieve them.

The assembly language snippets dated before Mar 93 are available in one zip
file at the above SimTel sites under the filename 80XXX393.ZIP.

The Snippets are now on the web.  In addition to downloading the snippets
there is an assembly language related book list.  The URL is:

    http://www.cet.com/~jvahn

19.3  X2FTP.OULU.FI

This ftp site, x2ftp.oulu.fi, has some asm source code not available at the
SIMTEL sites.  The following describes some directories and the type of
information that is available in them.

/pub/msdos/programming/pmode - protected mode utilities and some source
    code.
/pub/msdos/programming/source - some asm code
/pub/msdos/programming/prgsrc - some asm code

19.4  FTP.X86.ORG

This ftp site contains much of the code and information available from
Robert Collins' web site.

    ftp://ftp.x86.org/x86

19.5 OMEN.COM

Omen has assembly language source available from its web site.  The address
is:
    http://www.omen.com.au/Files/hdisk/asm.html

Much of the code is archived in the .arj format.  You will need the
appropriate expansion program.  One is available:

   ftp://ftp.simtel.net/pub/simtelnet/msdos/acers/arj242b.exe

19.6 JUMBO

JUMBO is the Official Web Shareware Site.  It has a directory devoted to
assembly language source code, libraries and utilities:

    http://www.jumbo.com/prog/dos/asmutil

19.7 THEREEF

I just found another site that carries this asm source code.  This site has
source code and information that I have not found elsewhere.

   http://www.iag.net/~philb/thereef/ftp_asm.htm

19.8 PC GAMES PROGRAMMER ENCYCLOPEDIA

This encyclopedia is a collection of files related to game programming. 
Many of these files contain programming examples.  Topics included are ASM
tutorial, VGA and SVGA programming information, graphic algorithms, graphic
file formats, soundcard and other PC hardware programming information. 
This encyclopedia is available online at the PC-GPE web page:
    
    http://www.qzx.com/pc-gpe/

19.9 PROGRAMMERS DISTRIBUTION NETWORK ASSEMBLY LANGUAGE FILES

These files appear to be a mirror of the assembly-related files distributed
on FidoNet by PDN.  There is one there that is a must if you want to write
asm winNT and win95 applications.  It is walk32_1.zip.  Walk32 is a
complete app and dll development kit with linker and includes files,
libraries, tools, and lots of samples.  MASM 6.x required.

    http://www.thepoint.net/~jkracht/pdnasm.htm

19.10  TENIE REMMEL'S ASSEMBLY SNIPPETS CODE COLLECTION         REVISED

The Assembly Snippets is a large collection of assembly language code
and other information.   Many files from the original 80XXX snippets,
the ASM0-Z collection, and the Aquila site are included.  All code is
99% guaranteed to compile under TASM.   This new release contains the
following items, among others:

  An object file disassembler       A 4971 byte Tetris game
  Several Conway LIFE programs      Assembly & Disassembly tables
  A demonstration of FakeMode       Several powerful editors
  A complete DOS extender           A Pentium optimization list
  A ModeX graphics library          Info for writing antivirus

You can download these rather large files from SimTel:

ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/asnip40a.zip  1.41 Megs
ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/asnip40b.zip  1.35 Megs
ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/asnip40c.zip  1.32 Megs

19.11 PROGRAMMING - ASSEMBLY/BASM/TASM

This site consist of 59 pages of assembly language related files.  Many
files I have not seen any where else.  The only problem is that there are
only five to eight files described per page.  The URL to the first page is:

    http://www.aquila.com/menu2/area02/dr1-1.htm

Contributor: Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 21 May 97

Return to the Table Of Contents

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

Subject: 20. How To Commit A File

The easiest solution is to open or create the file to be committed using
Int 21h function 6ch, extended open/create.  The BX register contains the
desired Open Mode.  One option that can be or'ed into this register is what
Microsoft calls, OPEN_FLAGS_COMMIT, that has the value of 4000h.  Using
this option caused DOS to commit the file after each write.  This function
has been available (documented) since DOS 4.0.

If you do not want to commit the file at each write but only when certain
conditions are met, use Int 21h function 68h, commit file.  The functions
has been available (documented) since DOS 3.3.

If you need to support versions of DOS before 3.3, the following technique
will flush the all stored data without closing and opening the file.  It is
the opening of the file that is time consuming.
    1.  Use 21h function 45h to create a duplicate file handle to the file
        to be flushed.
    2.  Close that duplicate file handle.

This technique will work all the way back to DOS 2.0.

Contributor: Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 30 Jan 95

Return to the Table Of Contents

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

Subject: 21. Using Extended Memory Manager

21.1  HOW TO USE XMS

XMS usage - short recipe:
1.  Verify have at least 286 (pushf; pop AX; test AX,AX; js error).
2.  Verify vector 2Fh set (DOS 3+ sets it during boot).
3.  AX=4300h, int 2Fh, verify AL=80h (means XMS installed).
4.  AX=4310h, int 2Fh, save ES:BX as dword XmsDriverAddr.
5.  AH=8, call [XmsDriverAddr] - returns ax=largest free XMS memory block
    size in kB (0 if error).
6.  AH=9, DX=required size in kB, call [XmsDriverAddr] - allocates memory
    (returns handle in DX - save it).
7.  AH=0Bh, DS:SI->structure {
        dword size (in bytes and must be even),
        word source_handle,
        dword source_offset,
        word destination_handle,
        dword destination_offset }
    (if any handle is 0, the "offset" is Real Mode segment:offset)
8.  AH=0Fh, BX=new size in kB, DX=handle, call [XmsDriverAddr] - changes
    memory block size (without losing previous data).
9.  AH=0Ah, DX=handle, call [XmsDriverAddr] - free handle and memory.

Initially, should process #1-#6, then can use #7 to put data in/get
data from XMS memory, or #8 to change XMS memory block size.  On exit
use #9 to free allocated memory and handle.

Hint: handle cannot be 0, since zero is used as "no handle allocated"
value.

Errors for XMS calls (except AH=7 - Query A20) are signaled by AX=0. Error
code returned in BL, few codes can check for are:
    80h - not implemented,
    81h - VDISK detected (and it leaves no memory for XMS),
    82h - A20 error (e.g. fail to enable address line A20),
    A0h - all allocated,
    A1h - all handles used,
    A2h - invalid handle,
    A3h/A4h - bad source handle/offset,
    A5h/A6h - bad destination handle/offset,
    A7h - bad length,
    A8h - overlap (of source and destination areas on copy),
    A9h - parity error (hardware error in memory),
    ABh - block is locked,
    00h - OK

For more info read INT 2Fh, AH=43h in Ralf Brown interrupt list.

21.2  WHAT IS THE 'LINEAR BLOCK ADDRESS' RETURNED BY LOCK MEM BLOCK?

When you lock mem block, XMS driver arranges memory governed by it in a way
the locked block forms one contiguous area in linear address space and
returns you starting address of the memory.  Linear address is base address
of segment + offset in segment, in Real Mode it is segment*16+offset, in
Protected Mode the base address is kept in LDT or GDT; note offset can be
32-bit on 386+.  If paging isn't enabled, linear address = physical
address.  You don't need the linear address unless you use 32-bit offsets
in Real Mode or you use Protected Mode (see previous answer for explanation
of how you can access XMS memory).

Contributor: Jerzy Tarasiuk, JT@zfja-gate.fuw.edu.pl
Last Changed: 30 Jan 95

Return to the Table Of Contents

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

Subject: 22. EXE2BIN Replacement

A utility, EXE2BIN, used to be included in DOS.  This utility was needed to
convert the output of the linker from .EXE to .COM format because the
linkers could not do this directly.  As linkers became more capable, the
need for this utility vanished, so EXE2BIN was dropped from DOS.  If you
still are using an older assembler and linker, you now have been left out
in the cold.  Well, not quite, as there are three shareware equivalent
programs.

22.1  EXECOM14.ZIP

EXECOM was written by Chris Dunford in C.  The .zip file contains the
executable, documentation and the .c source that Chris Dunford has released
into the public domain.  The current version is 1.04 with a 2 Mar 88 date.

22.2  BIN.ZIP

This replacement version was written by Bob Tevithick.  It is based upon
versions 1.00 of Chris Dunford's program.  The .zip file contains only the
executable and documentation.  No source is included.

22.3  X2B11.ZIP

X2B is written in 100% assembly language by Henry Nettles.  Again it is
based upon Chris Dunford's program.  The zip file contains the executable
and .asm source.  The documentation is in the source code.

22.4  AVAILABILITY

All these .zip files are available at any SimTel Mirror site.  They are
found:

    ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl

22.5 THE REAL THING, EXE2BIN.EXE

If you need the real thing, EXE2BIN.EXE is available on the DOS
Supplemental Diskettes.  This disks can be downloaded from Microsoft.

    ftp://ftp.microsoft.com/peropsys/msdos/public/supplmnt

    DOS62SP.EXE     for MS DOS 6.2
    DOS6SUPP.EXE    for MS DOS 6.0
    SUP621.EXE      for MS DOS 6.21
    SUP622.EXE      for MS DOS 6.22

Contributor: Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 8 Jan 96

Return to the Table Of Contents

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

Subject: 23. ASM Tutorials Available on the Internet

There are several assembly language tutorials available on the internet.

23.1  FROM SIMTEL MIRRORS

From the SimTel Mirrors, e.g., oak.oakland.edu, there are two tutorials
available in the simtel/msdos/asmutil directory.

    asmtutor.zip

    The tutorial is by Joshua Averbach.  It is old, as it is dated Jun
1988.  It is designed for the 8088 processor.

    primer2.zip

    This tutorial is designed specifically for the cheap assembler (CHASM)
also available in this directory.

23.2  GAVIN ESTEY'S TUTORIAL

    A new tutorial has been written by Gavin Estey.  He has provided his
tutorial in ascii text and in HTML format.  They are available:

HTML:
    http://www.strangecreations.com/strange/library/assembly/tutor/asm1.htm
Text:
    http://www.strangecreations.com/strange/library/assembly/asmtut.txt

23.3  VLA's ASSEMBLY LANGUAGE TUTORIAL

This tutorial is available directly or as part of the PC Games
Encyclopedia.  This file is available from:
    http://www.mds.mdh.se/~dat94avi/asmvla.zip
or as part of the PC Games Encyclopedia:        
    ftp://teeri.oulu.fi/pub/msdos/programming/gpe/pcgpe10.zip
or on-line at:
    http://www.qzx.com/pc-gpe/asm.tutorials.html

23.4  ASM Tutorial on University of Guadalajara Web Site

The on-line tutorial descibed below also is available as an ascii text.
    http://udqftp.cencar.mx/ingles/tutor/assem.zip

There now is an ASCII version of this tutorial.  Its URL is:
    http://udqftp.cencar.udg.mx/ingles/tutor/edition96/download.html

23.5  RANDALL HYDE'S ART OF ASSEMBLY LANGUAGE

    Randall Hyde has published on the Internet his textbook on machine
organization and assemly language programming developed for his class.  It
is called, "The Art of Assembly Language," and is available:

   http://webster.ucr.edu/Page_asm/ArtOfAsm.html

23.6  PATRICK STUDDARD'S ASSEMBLY CLASS NOTES

Patrick Studdard has a very extensive library of supplementary class notes
for assembly language.  These are available for all and not just those who
are taking the class.  They are available:

http://cage.cas.american.edu/~studdard/classes/fall1995/4028201/notes/index.html

23.7  TORE NILSSON'S ASSEMBLY TUTORIAL PAGE

VLA's Assembly and DMA programming tutorials, Asphyxia's VGA tutorials, and
some graphics and sound programming information.

    http://www.geocities.com/SiliconValley/2704/tutorial.html


23.8  WEB SITES

Assembly Language Tutorials
    http://udgftp.cencar.udg.mx/ingles/tutor/Assembler.html
        ASM Tutorial on University of Guadalajara Web Site
    http://www.cit.ac.nz/smac/csware.htm
        Version 2.6 of on-line 386 assembly languager course.  Self tests,
            assignments, course notes, and software are included.
    http://www.feldspar.com/~mbabcock/Programming/asmtut1.htm
        Mike Babcock's ASM Tutorial
    http://www.mds.mdh.se/~dat94avi/demoschool.htm
        Tutorial emphasises video and gaming techniques and C and assembly
            interface.
    http://webster.ucr.edu/Page_asm/ArtOfAsm.html
        Randall Hyde's Assembly Language Course Material - Art of Assembly
            Language
    http://www.qzx.com/pc-gpe/asm.tutorials.html
        VLA's Assembly Language Tutorials
    http://www.geocities.com/SiliconValley/2704/tutorial.html
        VLA's Assembly and DMA programming tutorials, Asphyxia's VGA
            tutorials, and some graphics and sound programming information.
    http://www.strangecreations.com/strange/library/assembly/tutor/asm1.htm
        Gavin's Guide to 80x86 Assembly
     http://www.xs4all.nl/~smit/docs.htm#asm
        Ferdi Smit's ASM Tutorial

Contributor: Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 28 Feb 97

Return to the Table Of Contents

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

Subject: 24. Shareware Assemblers

24.1  AVAILABILITY

All assemblers, unless otherwise noted, listed here are available from
SimTel in the SimTel/msdos/asmutil directory.  Specifically:

  ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl

24.2  A86

This assembler is a very capable assembler for 80286 and earlier
processors.  Registration will get you a version capable of handling 80386
processor.  For more details, see the A86 section of this FAQ.

24.3  CHASM, CHASM4.ZIP

This assembler was the first shareware assembler available.  CHASM was
written Mr. David Whitman.  The current version available is version 4 and
dated in 1983.  This version supports only 8088 processor, and the output
only is:
    .COM file (.EXE is not supported)
    BLOADable - format for interpreted BASIC to load and execute
    External procedure for TurboPascal - TurboPascal version not given

The version available on the internet is annoyware and crippleware.  For
$40 registration fee, you will get the complete version without the
annoying banner page.  This version supports macros, conditional assembly,
include files, operand expressions and structures.

I do not recommend this assembler because of it limited capability and it
is very out of date.

24.4  THE ARROWSOFT ASSEMBLER, VALARROW.ZIP

This assembler is the public domain version of the Professional Arrowsoft
Assembler by Arrowsoft Systems, Inc.  The version is 1.00d and is dated in
1986.  This assembler is a MASM 3.0 compatible assembler and supports up to
80286 processor.  Compared to the Professional version, the public domain
version has one major limitation.  The file input size is limited to 64K
bytes.

The file also includes a public domain linker, full screen editor and an
EXE2BIN clone program.

The above version 1.00d is available from SimTel.  Version 2.00c which has
only the assembler and documentation is available:
    http://sunsite.unc.edu/pub/micro/pc-stuff/freedos/microc/arrowasm.zip
and the linker separately:
    http://sunsite.unc.edu/pub/micro/pc-stuff/freedos/microc/vallink.zip
These are used in the freeDOS project.

24.5  WOLFWARE ASSEMBLER, WASM223.ZIP

This assembler was written by Mr. Eric Tauck.  The latest version is 2.23
and dates from 1991.  This assembler supports up to the 8028 processor.  It 
will assemble directly into a .COM file or .obj file.  It supports a
simplified syntax and program structure so programs written for this
assembler may not be compatible with other assemblers.  Several source
files for programs are included with the .zip file.

It is available from the author at:

    http://ourworld.compuserve.com/homepages/warp/

24.6 MAGIC ASSEMBLER, ASM110.ZIP

This assembler is very new.  The version is 1.10 and dates from March
1995.  This assembler was written by Mr. Bert Greevenbosch.  The output is
either a .COM file or a boot sector program.  The assembly commands are
standard except for the jump and call commands.  Again, the source code
will not be compatible with other assemblers.  Beware of version 1.04. 
That version had a bug that when executed without the print command, the
assembler terminated with a runtime error.  This is corrected in subsequent
versions.

Changes made in version 1.10 are:
    CALLF [] added, CALL [] corrected   Boot Indicator (55aa) added
    [BX][SI] now recognized as [BX+SI]  Calculations (*, /, -, +) added
    XCHG added                          Assembling Report added
    EQU bug corrected                   IN/OUT command improved

24.7 GEMA, GEMA.ZIP

This assembler revision is 2.6a with a date, 7 Jan 96.  It is different
from all other x86 assemblers I have seen.  This assembler is based upon
Motorola's 68k mnemonics and logical structure.  All instuctions, Pentium
Pro and known undocumented are supported.  GEMA was designed especially for
32-bit porcessing.  The assembler will take only one source code file and
will output an .COM or .EXE file.  No linker is required.  DESA.EXE, a beta
GEMA disassembler is available in the GEMA package. ASM2GEMA.EXE, a TASM to
GEMA translator is no longer availabLe as part of the GEMA package.  An
interactive real and protected-mode debugger is in progress.

This assembler is available from:
    ftp://ftp.nether.net/pub/gema/gema.zip  (symbolic link to latest
                                             version)

24.8 NASM 0.94, NASM.ZIP                                            REVISED

The birth of this assembler started out of a thread that started on
comp.lang.asm.x86.  When you download this assembler, you get the source
code in ANSI C.  The web page devoted to this assembler is:

    http://www.cryogen.com/Nasm

NASM is an 80x86 assembler designed for portability and modularity.  It
supports a range of object file formats including Linux a.out and ELF,
COFF, Microsoft 16-bit .obj and Win32.  It will also output plain binary
files. Its syntax is designed to be simple and easy to understand, similar
to Intel's but less complex. It supports Pentium, P6 and MMX opcodes. It
includes a disassembler as well.

This release contains the long-awaited macro processor! NASM can now
handle macros, both of the multi-line MASM type and the single-line
C type, and supports multi-level file inclusion, rather than the
single level that was supported previously. In addition, more bugs
have been fixed, notably problems with ELF output, the FDIV and FSUB
instructions, and wrong offset calculations in one very strange
case.

The assembler also is available from:

    ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/nasm094.zip
    ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/nasm094s.zip

(the latter version includes sources; the former is binaries-only).

It has been reported that nasm090.zip or nasm090s.zip from Simtel
mirrors contain a disabling bug.

24.9 GAS, GNU Assembler

This assembler with many object-file utilities will run on 386 systems
running the following operating systems: AIX 386BSD, NetBSD, BSDI/386,
Linux, SCO, Unixware, DOS/DJGPP.  The below file is a gzipped tar file. 
You will need gzip and tar programs to uncompress and extract the files. 
The assembler and utilities are part of the GNU binutils file.  This file,
a 3.86 Mbyte file, is available from:

    ftp://prep.ai.mit.edu/pub/gnu/binutils-2.6.tar.gz

24.10 REAL TOOLS 1.0 (BETA), RTOOLS.ZIP

This assembler is dated in Dec 93 and is a beta test.  The nice thing about
this assembler is that it comes with its own DOS-windowing IDE.  This
assembler was written by International Systems development.  The
instruction set supported is 486 including protected mode instructions, but
some holes do exist.  This assembler has a unique way of supporting macros. 
32-bit supported.  On line help and debugger are available with registered
product.

24.11 GENERAL ASSEMBLER, GASM01G.ZIP

This is a new assembler written by Jim Gage.  This version outputs .COM
files and can be used to write device drivers.  Another version supporting
up to the 486 instruction set and .obj output is in the works.  This
assembler is available:

    http://www.engr.uark.edu/~jrg/gasm/gasm01f.zip  

Contributor:  Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 19 Oct 96

Return to the Table Of Contents

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

Subject: 25. Undocumented OpCodes

25.1  WHAT AND WHERE

Robert Collins has make available an excellent article on Intel
Undocumented OpCodes.  Just set your web browser to:

    http://www.x86.org/secrets/OpCodes.html

25.2  EXTENDED FORMS OF AAM AND AAD INSTRUCTIONS

Mr. Collins describes extended forms these two instructions.  AAM is ASCII
Adjust after Multiplication, and ADD is ASCII Adjust before Division. 
These instructions are known as quick ways to divide and multiply by ten,
as these instructions normally assemble with 10 as the default operand. 
Using macros provided, any value from 0h to 0ffh can be substituted. 
These instructions are available on all x86 Intel processors.

25.3  SALC - SET AL ON CARRY

Mr. Collins describes this instruction a C programmers dream instruction
for interfacing to assembly language procedures.  This instruction will
set the AL register to 00h or 0ffh depending on whether the carry flag is
clear or set, respectively.  This instruction is available on all x86
Intel processors.

25.4  ICE RELATED OPCODES

Mr. Collins describes several instructions that appear whose existence
makes debugging run-time code easier on the ICE debugger.  There are:
    ICEBP   - ICE Break Point
    UMOV    - User Move Data
    LOADALL - Loads the Entire CPU State
    
Contributor:  Raymond Moon, raymoon@moonware.dgsys.com
Last changed: 4 Nov 95

Return to the Table Of Contents