# A86 (Software)

A86 ist ein Assembler für MS-DOS, der Code für die Intel x86-Familie von Mikroprozessoren generiert. Geschrieben von Eric Isaacson, wurde er erstmals im Juni 1986 als Shareware veröffentlicht. Der Assembler ist in einer einzigen 32K-Datei enthalten und kann direkt eine COM-Datei oder eine Objektdatei für die Verwendung mit einem Standard-Linker erzeugen. Er wird mit einem Debugger namens D86 geliefert.
Obwohl A86 die erwartete x86-Syntax unterstützt, erlaubt es in einigen Fällen eine einfachere Kurzform und erfordert nicht die Verwendung von Direktiven wie ASSUME, SEGMENT und PROC, auf die der Microsoft Macro Assembler und andere zeitgenössische Assembler angewiesen sind. Die Geschwindigkeit der Assemblierung ist ein Hauptverkaufsargument. Isaacson behauptete, dass A86 auf einem Pentium II oder besser 100.000 Zeilen Quellcode pro Sekunde assemblieren könne.
A86 und D86 sind auf 16-Bit-x86-Plattformen ausgerichtet. Isaacson fügte in den 1990er Jahren Unterstützung für 32-Bit hinzu, in Form von A386 und D386. Diese wurden nicht als Shareware verteilt, sondern den Benutzern zur Verfügung gestellt, die A86 registriert hatten. Die A86-Produktfamilie wurde nie auf Microsoft Windows portiert, aber es ist möglich, die von A386 erstellten Objektdateien mit einem Windows-Linker zu verwenden. Der Assembler unterstützt keinen 64-Bit-Code.

## A86-spezifische Eigenschaften

* Jedes Label, bestehend aus einem Buchstaben gefolgt von einer oder mehreren Ziffern, wird als lokal betrachtet und kann bei Bedarf neu definiert werden, wobei jede Definition die vorherige ersetzt. In der Anleitung wird empfohlen, L1 bis L9 für normalen Code und M1 bis M9 in Makros zu verwenden. Verzweigungen zu lokalen Labels gelten als rückwärtsgerichtet, aber eine Vorwärtsverzweigung kann durch Hinzufügen des Größer-als-Symbols vor der Labelreferenz angegeben werden (z. B. >L2).
* Zahlen, die mit einer Null beginnen, sind im Hexadezimalsystem, zum Beispiel 00FF, anstelle eines benutzerdefinierten Präfixes. Ein nachgestelltes „K“ zeigt Kibibytes an. 16K entspricht 16 * 1024 oder 16384.
* Auf derselben Quellzeile können mehrere Register gleichzeitig gepusht oder gepoppt werden. „push eax, edx, ebp“ generiert eine Anweisung für jeden der drei Operanden.
* Es gibt eine Abkürzung für die bedingte Ausführung einer einzelnen Anweisung. „if z mov ax, bx“ gibt zwei Anweisungen aus: eine bedingte Verzweigung gefolgt von der Zuweisung.
* Wenn „ret“ als Label für eine bedingte Verzweigung angegeben ist, zielt es automatisch auf eine Rückgabe-Anweisung innerhalb des 8-Bit-Verzweigungsbereichs ab (z. B. jz ret).
* Makros verwenden eine andere Syntax als zeitgenössische Assembler.

## Unterschiede A86/A386

A86 und A386 sind Assembler-Programme, die von Eric Isaacson entwickelt wurden und sich hauptsächlich auf die Erstellung von Maschinen- und Assemblersprache-Code für Intel x86-Mikroprozessoren konzentrieren. Der Hauptunterschied zwischen den beiden besteht in der unterstützten Prozessorarchitektur und den Funktionen:

### Prozessorunterstützung

* A86: A86 war die ursprüngliche Version und dient hauptsächlich dazu Programme für den Real Mode zu schreiben.
* A386: A386 ist die Weiterentwicklung von A86 und bietet Unterstützung für 32-Bit-x86-Prozessoren und dessen Protected Mode. Es kann Code für neuere Prozessoren, wie den Pentium III und den AMD Athlon, erstellen.

### Einsatzzweck

* A86: A86 ist für die Erstellung von 16 Bit Code für den Real Mode
* A386: A386 bietet Unterstützung für den 386 Prozessor und seinen Nachfolgern sowie der Programmierung im Protected Mode.

### Unterstützung für erweiterte Befehlssätze

* A86: A86 unterstützt hauptsächlich die Befehlssätze älterer x86-Prozessoren.
* A386: A386 unterstützt erweiterte Befehlssätze und kann Code für neuere Prozessoren mit erweiterten Funktionen generieren.

### Objektbibliotheken

* A86: A86 bietet eine eingebaute Quelldateibibliotheksfunktion, um auf Bibliotheksprozeduren zuzugreifen.
* A386: Die Verfügbarkeit von A386-Bibliotheken kann von der A86-Version abweichen.
Es ist wichtig zu beachten, dass der Unterschied zwischen A86 und A386 hauptsächlich in der Zielarchitektur und den unterstützten Prozessoren liegt. Die Wahl zwischen den beiden hängt von den spezifischen Anforderungen und der Zielplattform des Projekts ab.

## Code-Fingerprint

Der Assembler wurde entwickelt, um bestimmte Anweisungscodierungen zu verwenden, die funktional äquivalent sind, aber zusammen einen Fingerabdruck erstellen, der in der ausführbaren Datei eingebettet ist. Dies wird im rechtlichen Abschnitt der Anleitung erwähnt. Der Fingerabdruck ermöglicht es, festzustellen, ob der Code mit A86 assembliert wurde, und auch zwischen registrierten und nicht registrierten Versionen des Assemblers zu unterscheiden. Diese Analyse erfordert Zugriff auf den Quellcode.

## Heutige Verwendung

Die Verwendung von A86 und A386 ist heute eher begrenzt, da diese Assembler-Programme auf ältere x86-Prozessorarchitekturen ausgerichtet sind und nicht mehr auf dem neuesten Stand der Technik sind. Moderne Softwareentwicklung für x86-Prozessoren erfolgt normalerweise mit fortschrittlicheren Tools und Entwicklungsumgebungen. Gründe dafür sind:

### Veraltete Zielarchitektur

A86 und A386 sind hauptsächlich auf die Entwicklung von Code für 16-Bit- und 32-Bit-x86-Prozessoren ausgerichtet. Moderne Anwendungen und Betriebssysteme verwenden jedoch in der Regel 64-Bit-x86-Prozessoren, weshalb diese Assembler-Programme für aktuelle Projekte weniger relevant sind.

### Verfügbarkeit von Hochsprachen mit effizienten Compilern

Die meisten Entwickler verwenden heute Hochsprachen und deren Compiler, um Quellcode in Maschinencode zu übersetzen. Code, der in einer Hochsprache geschrieben wurde, ist in der Regel leichter zu warten und unter deutlich weniger Arbeitsaufwand geschrieben. Die Compiler erzeugen aufgrund der heutzutage hochkomplexen CPUs meist besseren Maschinencode, als sie ein Mensch in Assembler schreiben könnte.

### Verfügbarkeit von freien Assemblern

Heutzutage gibt es eine Vielzahl an freien Assemblern wie NASM oder FASM die ständig weiterentwickelt werden und somit auch moderne CPUs und ihre Befehlssätze unterstützen.

### Mangel an aktuellem Support

A86 und A386 wurden von einer Person geschrieben und werden nicht mehr weiterentwickelt.