Введение
Ассемблер для микропроцессоров Intel
Microsoft Macro Assembler (MASM) – это x86-ассемблер, использующий синтаксис Intel для MS-DOS и Microsoft Windows. Начиная с версии MASM 8.0, существует две версии ассемблера: одна для исходного кода 16- и 32-битных программ, а другая (ML64) – только для 64-битного исходного кода. MASM поддерживается компанией Microsoft, но с версии 6.12 он не продается как отдельный продукт, а поставляется вместе с различными SDK и C-компиляторами Microsoft. Последние версии MASM входят в состав Microsoft Visual Studio. Среди известных приложений, скомпилированных с использованием MASM, – RollerCoaster Tycoon, который на 99% был написан на языке ассемблера и собран с помощью MASM.
История
Самые ранние версии MASM датируются 1981 годом. Они продавались как универсальный "Microsoft Macro Assembler" для всех машин x86 или как OEM-версия, предназначенная специально для IBM PC. К версии 4.0 выпуск для IBM был прекращен. До версии 3.0 MASM поставлялся вместе с небольшим дополнительным ассемблером ASM.EXE. Он предназначался для ПК с оперативной памятью всего 64 КБ и не обладал некоторыми функциями полноценного MASM, такими как возможность использования макросов кода. Версии MS-DOS до 4.x включали утилиту LINK от Microsoft, предназначенную для преобразования промежуточных OBJ-файлов, генерируемых MASM и другими компиляторами; однако, поскольку пользователям, не занимающимся программированием, эта утилита была не нужна, она была перенесена в состав пакетов компиляторов. Версия 4.0, выпущенная в октябре 1985 года, добавила поддержку инструкций 286. Версия 5.0, выпущенная в августе 1987 года, поддерживала инструкции 386, а также сокращенные мнемонические обозначения для сегментных дескрипторов (.code, .data и т.д.), но все еще могла генерировать только исполняемые файлы для реального режима. До версии 5.0 MASM был доступен только как приложение для MS-DOS. Версии 5.1 и 6.0 были доступны как для MS-DOS, так и для OS/2. Версия 6.0, выпущенная в 1991 году, добавила передачу параметров с помощью "invoke" и некоторые другие конструкции высокого уровня, в дополнение к уже существующим структурам данных высокого уровня. И 6.0, и 6.0B могли работать на процессоре 8086, но могли генерировать 32-битный код для 386 в плоской модели памяти. В 1992 году вышла версия 6.1, добавившая поддержку формата COFF, используемого Windows NT, и прекратившая поддержку OS/2. Версия 6.1 была собрана как бимодальный исполняемый файл до завершения разработки Win32 API и несовместима с Windows NT из-за отсутствия экспортируемых функций. В 1993 году была добавлена полная поддержка 32-битных приложений в защищенном режиме и набора инструкций Pentium. Двоичный файл MASM 6.11 (1993) поставлялся как "бимодальный" (win32, т.е. PE) DOS-расширенный исполняемый файл (с использованием расширителя Phar Lap TNT DOS). Однако setup.exe является исполняемым файлом MZ, поэтому не будет работать в 64-битных версиях Windows, а бимодальный ml.exe сжат, и decomp.exe является исполняемым файлом NE, поэтому также не будет работать в 64-битных версиях Windows (если вы надеялись вручную извлечь необходимые ml.exe и ml.err). Таким образом, для его установки требуется доступ к 32-битной Windows (или MS-DOS). Версия 6.11 – последняя версия MASM, работающая под MS-DOS. Существовала серия исправлений, доступных до версии 6.11d, требующих 32-битной Windows для запуска, но исправленный ml.exe все еще содержит расширитель Phar Lap DOS и может работать под MS-DOS. Версии 6.12–6.14 были реализованы в виде патчей для версии 6.11. Эти патчи были самораспаковывающимися исполняемыми файлами PK (т.е. MSDOS) и не будут работать в 64-битных версиях Windows. Даже если их извлечь другим способом, patch.exe является исполняемым файлом NE и не сможет запуститься в 64-битной Windows для обновления ml.exe. Если запустить на 32-битной Windows (или более ранней версии), патч удалит расширитель Phar Lap DOS из ml.exe, что приведет к невозможности запуска на MS-DOS. Удаление Phar Lap уменьшает размер MZ-части исполняемого файла, что облегчает видимость сигнатуры "PE", в отличие от ситуации с 6.11, где сигнатура PE находилась далеко в файле. К концу 1997 года MASM полностью поддерживала Windows 95 и включала некоторые инструкции, специфичные для AMD. В 1999 году Intel выпустила макросы для инструкций SIMD и MMX, которые вскоре после этого были реализованы в MASM. С выпуском версии 6.15 в 2000 году Microsoft прекратила поддержку MASM как отдельного продукта, включив его в состав инструментария Visual Studio. Хотя он оставался совместимым с Windows 98, текущие версии Visual Studio не поддерживали его. Формат (PE/COFF). PE/COFF совместим с современными компиляторами Microsoft C, а объектные модули, созданные MASM или C-компилятором, могут регулярно смешиваться и связываться в бинарные файлы Win32 и Win64.
Сборщики, совместимые с MASM
Некоторые другие ассемблеры могут собирать большую часть кода, написанного для MASM, за исключением более сложных макросов. Turbo Assembler (TASM), разработанный Borland, а затем принадлежавший Embarcadero, последний раз обновлялся в 2002 году, но до сих пор поставляется с C++Builder и RAD Studio. JWasm Macro Assembler, распространяемый по лицензии Sybase Open Watcom EULA. Последнее обновление – 2014 год. Макроассемблер Pelle – компонент среды разработки Pelles C. UASM – бесплатный ассемблер, совместимый с MASM и основанный на JWasm. ASMC – бесплатный ассемблер, совместимый с MASM и основанный на JWasm.
Поддержка смешанного языка программирования
В документации к версии 5.1 1987 года поддерживались языки "Microsoft BASIC, C, FORTRAN, Pascal".