Введение
Ассемблер и отладчик для MS DOS. A86 – это ассемблер для MS DOS, генерирующий код для семейства микропроцессоров Intel x86. Написанный Эриком Айзексоном, он впервые был выпущен как shareware в июне 1986 года. Ассемблер помещается в один исполняемый файл размером 32 КБ и может напрямую создавать COM-файл или объектный файл для использования со стандартным компоновщиком (линкером). В комплекте с ним поставляется отладчик D86. Поддерживая ожидаемый синтаксис x86, A86 в некоторых случаях допускает более простой сокращенный код и не требует директив, таких как ASSUME, SEGMENT и PROC, от которых зависят Microsoft Macro Assembler и другие аналогичные программы того времени. Высокая скорость ассемблирования является его основным преимуществом. Айзексон утверждал, что A86 способен собирать 100 000 строк исходного кода в секунду на процессоре Pentium II или лучше. A86 и D86 предназначены для 16-битных x86 платформ. В середине 1990-х годов Айзексон добавил поддержку 32-битных платформ в виде A386 и D386. Ассемблер не поддерживает 64-битный код.
A86 is an 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 June 1986. 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 simpler shorthand in some cases and does not require directives, such as ASSUME, SEGMENT, 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. The assembler does not support 64 bit code.
Особенности A86
Любая метка, состоящая из одной буквы, за которой следует одна или несколько цифр, является локальной и может быть переопределена по мере необходимости, при этом каждое определение заменяет предыдущее. В руководстве рекомендуется использовать `a`–`z` для обычного кода и `A`–`Z` в макросах. Предполагается, что переходы к локальным меткам осуществляются назад, но переход вперед можно указать, добавив символ «>» перед ссылкой на метку (например, `>метка`). Числа, начинающиеся с нуля, интерпретируются как шестнадцатеричные, например, `0123`, вместо использования префикса, такого как "0x" или "$". Суффикс "K" указывает на кибибайты. `16K` эквивалентно 16*1024 или 16384. Несколько регистров можно поместить в стек или извлечь из стека на одной строке исходного кода. `инструкция операнд1, операнд2, операнд3` генерирует одну инструкцию для каждого из трех операндов. Существует сокращенная форма для условного выполнения одной инструкции. `инструкция` выводит две инструкции: условный переход, за которым следует перемещение. Если `return` указана в качестве метки для условного перехода, она автоматически перенаправляется на инструкцию возврата в пределах 8-битного диапазона перехода (например, `>return`). Макросы используют синтаксис, отличный от синтаксиса современных ассемблеров.
Код отпечатка пальца
Ассемблер был разработан для использования определенных кодировок инструкций, функционально эквивалентных друг другу, но вместе формирующих уникальный идентификатор, внедряемый в исполняемый файл. Это упоминается в разделе "Правовые условия" руководства. Этот идентификатор позволяет определить, был ли код скомпилирован с помощью A86, а также различать зарегистрированные и незарегистрированные версии ассемблера. Для проведения такого анализа требуется доступ к исходному коду.