A86is anassemblerforMS-DOSwhich generates 16-bit code for theIntelx86family ofmicroprocessors.Written by Eric Isaacson, it released assharewarein June 1986. The assembler is contained in one 32K executable and can directly produce aCOM fileor anobject filefor use with a standardlinker.It comes with adebugger,D86.[1][2]Speed of assembly is a primary selling point, and Isaacson claimed that A86 could assemble 100,000 lines of source per second on aPentium IIor better.[3]Isaacson added32-bitsupport in the mid 1990s in the form ofA386andD386.[1][2]These were not distributed as shareware, but were provided to users who registered A86.
Developer(s) | Eric Isaacson |
---|---|
Stable release | 4.05
/ 14 January 2000 |
Operating system | MS-DOS |
Platform | x86 |
Type | Assembler |
License | Proprietary |
Website | eji |
While supporting expected x86 syntax, A86 and A386 do not requiredirectives,such asASSUME
,SEGMENT
,andPROC
,whichMicrosoft Macro Assemblerand other contemporaries rely on. A86 and A386 have a custom syntax for macros and local labels which is incompatible with other assemblers. There are also a variety of syntactical tweaks allowing more concise source code.
The A86 family of products was never ported toMicrosoft Windows,but it is possible to use theobject filescreated by A386 with a Windows linker.[4]The assembler does not support64-bitcode.
A86-specific features
editAny 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 usingL1
throughL9
for normal code andM1
throughM9
inmacros.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 (e.g.,>L2
).
Numbers starting with a zero arehexadecimal,such as00FF
,instead of using a prefix such as "0x" or "$". A trailing "K" indicateskibibytes.[5]16K
is the same as 16*1024 or 16384.
Multiple registers can be pushed or popped on the same source line.push eax, edx, ebp
generates one instruction for each of the threeoperands.
There's shorthand for conditionally executing a single instruction.if z mov ax,bx
outputs two instructions: a conditional branch followed by the move.
Ifret
is specified as the label for a conditional branch, it automatically targets a return instruction within the 8-bit branch range (e.g.,jz ret
).
Macros use a different syntax than contemporaneous assemblers.
Code fingerprint
editThe assembler was designed to use particular instruction encodings which are functionally equivalent, but together create a fingerprint that's embedded in theexecutable file.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 thesource code.[6]
References
edit- ^abIsaacson, Eric (2008)."A86/A386 assembler and D86/D386 debugger".Archivedfrom the original on 2 July 2008.Retrieved2008-07-02.
- ^abRandall Hyde."Which Assembler is the Best?".Archived fromthe originalon 15 May 2008.Retrieved2008-05-18.
- ^Isaacson, Eric (2006)."A86/A386 and D86/D386 features".
- ^Isaacson, Eric (2006)."A386 and Win32 Programming".
- ^Hague, James (July 20, 2008)."Kilobyte Constants, a Simple and Beautiful Idea that Hasn't Caught On".Programming in the 21st Century.
- ^El-Khalil, Rakan; Keromyti, Angelos D. (2004)."Hydan: Hiding Information in Program Binaries"(PDF).In Lopez, Javier; Qing, Sihan; Okamoto, Eiji (eds.).Information and communications security: 6th International Conference, ICICS 2004, Malaga, Spain, October 27–29, 2004: Proceedings.Lecture Notes in Computer Science. Vol. 3269.Springer.p. 190.ISBN3-540-23563-9.