A86 (software)


A86 is a commercial assembler for MS-DOS which generates code for the Intel x86 family of microprocessors. Written by Eric Isaacson, it was first made available as shareware in the 1980s. The assembler is contained in one 32K executable and can directly produce a COM file or an object file for use with a standard linker. It comes with a debugger, D86.
While supporting expected x86 syntax, A86 allows slightly simpler shorthand in some cases, and does not require directives, such as ASSUME and PROC, which Microsoft Macro Assembler and other contemporaries rely on. Speed of assembly is a primary selling point. Isaacson claimed that A86 could assemble 100,000 lines of source per second on a Pentium II or better.
A86 and D86 target 16-bit x86 platforms. Isaacson added 32-bit support in the mid 1990s in the form of A386 and D386. These were not distributed as shareware, but were provided to users who registered A86. The A86 family of products were never ported to Microsoft Windows, though it is possible to use the object files created by A386 with a Windows linker. The assembler cannot be used to create 64-bit code.

A86-specific features

Any label consisting of one letter followed by one or more digits is local and can be redefined as needed, with each definition replacing the prior. The manual recommends using through for normal code and through in macros. Branches to local labels are assumed to be backward, but a forward branch can be specified by prefixing the label reference with the greater than symbol.
Numbers starting with a zero are hexadecimal, such as, instead of using a custom prefix. A trailing "K" indicates kibibytes. is the same as 16*1024 or 16384.
Multiple registers can be pushed or popped on the same source line. generates one instruction for each of the three operands.
There's shorthand for conditionally executing a single instruction. outputs two instructions: a conditional branch followed by the move.
If is specified as the label for a conditional branch, it automatically targets a return instruction within the 8-bit branch range.
Macros use a different syntax than contemporaneous assemblers.

Code fingerprint

The assembler automatically embeds a "fingerprint" into the generated code through a particular choice of functionally equivalent instruction encodings. This is mentioned in the legal terms section of the manual. The fingerprint makes it possible to tell if code was assembled with A86 and also to distinguish between registered and unregistered versions of the assembler. This analysis requires access to the source code.