Microsoft Macro Assembler (MASM)[перевод] ЮРИДИЧЕСКИЙ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Все ссылки на продукты Microsoft, включая: Microsoft Macro Assembler (MASM), MS-DOS, Visual C++, Visual Basic, Visual Studio, Windows, Windows NT, Windows Software Development Kit (SDK) и связанные с ними продукты, логотипы и изображения являются торговыми марками, принадлежащими корпорации Microsoft и защищены авторскими правами. Microsoft MASM изначально представлял собой ассемблер (то есть компилятор языка ассемблера) для процессора Intel 8086, предназначенный для IBM PC и совместимых компьютеров. Этот процессор и его преемники были объединены в так архитектуру Intel x86, способную работать в 16-битных (286 и ниже) и 32-битных (386 и выше) режимах. Примерно в 2005 Microsoft выпустила 64-битную версию MASM, ориентированную на 64-битную спецификацию AMD (архитектура x64), которая представляет собой 64-битное расширение линейки процессоров x86. Microsoft публично выпустила этот ассемблер вместе с дебютными выпусками x64 Windows: XP и Server 2003. Хотя Microsoft публично выпустила ассемблер для процессоров ARM (ARMASM), по крайней мере, начиная с Visual Studio 2013, технически это не MASM. Основное внимание будет уделено версиям MASM x86 и x64. До того, как Microsoft Macro Assembler популяризировал аббревиатуру MASM, MASM означал Meta Assembler (инструмент генерации ассемблера, приложение которого в основном используется в мейнфреймах). До эпохи DOS существовало множество ассемблеров в стиле макросов, выпускавшихся различными компаниями, в первую очередь ориентированных на мэйнфреймы или на появившиеся наборы микросхем для персональных компьютеров или игровых систем. За это время кто-то изобрел понятие «макро», которое, по сути, представляет собой серию нажатий клавиш, присвоенных имени или последовательности клавиш в качестве конструкции, позволяющей сэкономить время. Поддержка макросов была популярна и использовалась во многих утилитах, от электронных таблиц до оболочек командной строки, а не только в языках программирования. Основные широко используемые языки программирования находились в стадии разработки, поэтому целые приложения обычно писались исключительно на языке ассемблера. Поскольку программирование на языке ассемблера — это всего лишь один маленький шаг по сравнению с программированием непосредственно на машинном языке (программирование в числовых кодах), для выполнения даже самых простых задач, таких как запись одного символа на дисплейный терминал, требуется множество отдельных инструкций. Вот почему за язык ассемблера утвердилась репутация "утомительного языка программирования". Использование макросов позволяло присвоить группе часто используемых инструкций имя и вставлять эти инструкции в любое место, где это имя появляется, в таком количестве мест, сколько необходимо для выполнения этой общей задачи. Microsoft Macro Assembler (MASM) появился в 1981, незадолго до выпуска Microsoft IBM PC-DOS, представлял собой ассемблер, использовавший синтаксис (нотацию) Intel. MASM стал самым популярным ассемблером, вероятно, благодаря успеху DOS и Windows.Истоки МАСМMASM был написан на языке Паскаль Марком Макдональдом (сотрудником Microsoft). Microsoft вела все свои разработки на компьютерах DEC, возможности макросов, заложенные в MASM, были смоделированы по образцу ассемблеров DEC. MASM был написан специально для 8086, авторы пытались обеспечить уровень совместимости с ассемблером Intel 8086. После завершения работы над DOS 1.0 Тим Патерсон из SCP (Seattle Computer Products) перевел DOS с ассемблера SCP на MASM. Ассемблер 8086, который переписывал Тим Патерсон, изначально был для микропроцессора Z80, который работал под управлением CP/M. MASM распространялся вместе с платой процессора SCP 8086 как ASM86. Тим Патерсон написал переводчик, который конвертировал исходный код для Z80 в неэффективный, но работоспособный исходный код 8086 (Intel продвигала идею с помощью опубликованной таблицы перевода). Он назывался TRANS86. Когда DOS заработал, Тим Патерсон применил транслятор к ASM86, чтобы создать версии 8086, работающие под DOS. Ассемблер SCP 8086 использовался для сборки ранних версий DOS (86-DOS, MS-DOS 1.x), основная переработка DOS 2.0, проведенная Microsoft, включала изменение системы сборки для использования собственного ассемблера Microsoft, MASM. Дополнительную информацию об ассемблере 8086 Тима (ASM) можно найти в статье о раннем исходном коде Microsoft MS-DOS Музея компьютерной истории.Эволюция MASMНачиная с MASM 1.0 в 1981 (что соответствует выпуску MS-DOS 1.0), MASM почти 13 лет просуществовал как отдельный продукт Microsoft. Этот статус был утерян с версией MASM 6.11 в 1993, когда Microsoft заявила, что MASM больше не доступен в качестве самостоятельного продукта. С ростом популярности новых и разнообразных доступных языков программирования спрос на людей, желающих писать на чистом ассемблере, снизился, поэтому Microsoft понизила MASM до инструмента системного уровня C/C++. Microsoft выпустит исправления для новых версий MASM (в первую очередь для внесения изменений в будущие наборы микросхем Intel) до версии 6.14 в 1999. В 2000 Microsoft выпустила MASM 6.15 как дополнение к Visual. C++ 6.0. Начиная с версии 6.15, MASM входит в состав каждого выпуска Visual C++ через Microsoft Visual Studio вместе с остальным набором инструментов C/C++. Начиная с MASM версии 6.15 Microsoft перестала публиковать в документации официальный список изменений. Версия 6.15 оказалась одной из самых стабильных и широко используемой. В этой версии стабилизировались все функции версии 6.xx с укрепившейся архитектурой доминирующей платформы Win32 (Windows NT и Windows 9x). Возможности версии 6.xx отличали MASM от Turbo Assembler компании Borland, который был лидером рынка синтаксиса MASM 5.xx. Список изменений быстро расширился до всех известных версий MASM. Названиегод созданияОСГлавная программаBuild VersionДатаНазваниеРазмер (байт)MACRO-801979CPM12/09/1981M80.COM20k3.4MACRO-861981DOSM86.EXEMASM 1.0 IBM1981DOS12/07/1981 10:00pmMASM.EXE66kMASM 1.01981DOS02/05/1982 12:49pmM.EXE66kMASM 1.061982DOS02/08/1982MASM.EXE69kMASM 1.101982DOS02/01/1983 01:13pmMASM.EXE76kMASM 1.251983DOS08/25/1982MASM.EXE79kMASM 1.271984DOS11/27/1984 09:25amMASM.EXE79kMASM 2.0 IBM1984DOS07/18/1984 12:01pmMASM.EXE75kMASM 2.041982DOS03/02/1982MASM.EXE66kMASM 3.01984DOS11/21/1984 02:49pmMASM.EXE76kMASM 3.011984DOS11/21/1984 02:49pmMASM.EXE76kMASM 4.01985DOS10/16/1985 04:00amMASM.EXE84kMASM 4.011985DOS07/24/1987 12:00amMASM401.EXE100kMASM 5.01987DOS07/31/1987 12:00amMASM.EXE101kMASM/2 1.0 IBM1987OS/2, DOS09/03/1987 04:00pmMASM.EXE112kMASM 5.101988DOS, OS/202/01/1988 01:00pmMASM.EXE108k5.10MASM 5.10A1989DOS, OS/201/16/1989 11:10amMASM.EXE108k5.10MASM 5.10B1989DOS, OS/201/04/1992 12:52pmMASM5.EXE109k5.10QuickAssembler1990DOSMASM386 5.NT.021989WIN3211/01/1993 06:28amMASM386.EXE207k5.103.10.508.1MASM 6.01991DOS, OS/204/03/1991 02:59pmML.EXE239k6.00MASM 6.00AMASM 6.00B1992DOS, OS/203/18/1992 05:31pmML.EXE244k6.00MASM 6.11992DOS, WIN3211/16/1992 04:00pmML.EXE352k6.10MASM 6.1a1992DOS, WIN3203/12/1993 01:59pmML.EXE353k6.10MASM 6.111993DOS, WIN3209/24/1993 08:25amML.EXE380k6.11MASM 6.11a1994DOS, WIN3203/21/1994 12:22pmML.EXE374k6.11MASM 6.11c1994DOS, WIN3208/25/1994 06:30pmML.EXE373k6.11MASM 6.11d1995DOS, WIN3209/19/1995 01:18pmML.EXE379k6.11MASM 6.121997WIN3208/27/1997 03:49pmML.EXE358k6.126.12.7164MASM 6.131997WIN3212/05/1997 01:43pmML.EXE344k6.136.13.7299MASM 6.141997WIN3204/12/1999 03:05pmML.EXE364k6.146.14.8444MASM 6.152000WIN3203/16/2000 03:20pmml.exe376k6.156.15.8803MASM 7.0WIN3201/05/2002 03:36amml.exe404k7.007.00.9466 / VS.NET 2002 7.0 (any*)MASM 7.1WIN3207/11/2006 06:15pmml.exe404k7.107.10.6030 / VS.NET 2003 PRO 7.1MASM 8.0WIN32/ WIN6404/21/2006 06:11pmml.exe342k8.008.00.50727.104 / VS 2005 8.0 EXPRESS, PRO & ACADEMICMASM 9.0WIN32/ WIN6407/30/2008 12:05pmml.exe353k9.009.00.30729.01 / VS 2008 9.0 (any*) / Win32MASM 10.0WIN32/ WIN6403/19/2010 02:02pmml.exe38810.0010.00.30319.01 / Win32MASM 11.0WIN32/ WIN6407/26/2012 07:08pmml.exe424k11.0011.00.50727.1 / Win32MASM 12.0WIN32/ WIN6410/05/2013 02:38amml.exe429k12.0012.00.21005.1 из VS 2013 Express for Desktop / Win32MASM 14.0WIN32/ WIN6406/25/2015 11:34pmml.exe436k14.0014.00.23026.0 из VS 2015 Community 14.0.23107.0 D14REL / Win32MASM 14.12017WIN32/ WIN6407/21/2017 05:22pmml.exe438k14.1014.10.25019.0 из VS 2017 CommunityMASM 14.22019WIN64ml64.exe14.2014.27.29112/0 из VS 2019 CommunityMASM 14.32021WIN64ml64.exe14.3014.30.30401.0 из VS 2022 CommunityКлючевые словаДирективы Типы/Распределение Процессор Сегмент Макросы/Процедуры Область применения/Модуль Опции/Эхо Строка Выражения/Присваивание Блоки повторения Условная сборка Управляющие операторы Условная ошибка Контроль листинга Символы Сегмент Среда Макрофункции Прочее Операторы Тип Сегмент Прочее Арифметика Поток управления Реляционный Логика и сдвиги Макросы Языки, модели и регистры Соглашения о вызовах Модели памяти Регистры Зарезервированные и незарезервированные операнды Зарезервированные операнды Незарезервированные операнды (многие из них используются с директивой OPTION) Директивы СегментацияПроцессорТипы данныхРаспределениеКлючевое словоВерсияКлючевое словоВерсияРазмер (Байт)Ключевое словоВерсияКлючевое словоВерсияALIGN5.0.1862.0-9.01BYTE/DB5.0RECORD.ALPHA5.0.2865.0-9.01SBYTE6.0STRUCASSUME.286C2.0-9.02DW/WORD5.0STRUCT6.0.CODE5.0.286P3.0-9.02SWORD6.0TYPEDEF6.0.CONST5.0.2872.0-9.04DD/DWORD5.0UNION6.0.DATA5.0.3865.04SDWORD6.0ALIGN.DATA?5.0.386C5.04REAL46.0EVENDOSSEG5.0.386P5.06DF/FWORD5.0LABEL.DOSSEG6.0.3875.06DP/PWORD5.0ORGEND.4866.08DQ/QWORD5.0ENDSENDS.486P6.08SQWORD8.0EVENT.5866.118REAL86.0.EXIT6.0.586P6.118MMWORD8.0.FARDATA?5.0.6866.1210DT/TBYTE5.0.FARDATA5.0.686P6.1210REAL106.0GROUP.80862.0-9.016OWORD6.14LABEL.80872.0-9.016XMMWORD8.0.MODEL5.0.K3D6.1332YMMWORD10.0ORG.MMX6.1264ZMMWORD10.0SEGMENT.NO876.0-9.0.SEQ5.0.XMM6.14.STACK5.0.STARTUP5.0Макросы/ПроцедурыСтроковые операцииScope/ModuleКлючевое словоВерсияКлючевое словоВерсияКлючевое словоВерсия.ALLOCSTACK (x64)8.0CATSTR5.10ALIAS6.11ENDMINSTR5.10COMM5.0ENDPSIZESTR5.10COMMENT.ENDPROLOG (x64)8.0SUBSTR5.10EXTERNEXITMДирективы эквивалентности и присваиванияEXTERNDEF6.0.FPO5.10.NT, 6.11A, 8.0=EXTERN6.0GOTO6.0EQUINCLUDEINVOKE6.0TEXTEQU6.0INCLUDELIB6.0LOCALБлоки повторенияNAME⩽4.0 ignored 5.0+MACROENDMPUBLICPROCFOR6.0Options/EchoingPROTO6.0FORC6.0ECHO6.0PURGEGOTO6.0.MSFLOAT5.0.PUSHFRAME (x64)8.0IRP.PUSHFREG (x64)8.0IRPC.SAFESEH7.1REPEAT6.0.SAVEREG (x64)8.0REPT.SAVEMM128 (x64)8.0WHILE6.0.SETFRAME (x64)8.0USES5.10Условное ассемблированиеУсловное выполнениеУправление листингомКлючевое словоВерсияКлючевое словоВерсияКлючевое словоВерсияELSE.BREAK6.0.CREFELSEIF5.10.CONTINUE6.0.LALLELSEIF15.10.ELSE6.0.LFCONDELSEIF25.10.ELSEIF6.0.LISTELSEIFB5.10.ENDW6.0.LISTALL6.0ELSEIFDEF5.10.IF6.0.LISTIFF6.0ELSEIFDIF5.10.REPEAT6.0.LISTMACRO6.0ELSEIFDIFI5.10.UNTIL6.0.LISTMACROALL6.0ELSEIFE5.10.UNTILCXZ6.0.NOCREF6.0ELSEIFIDN5.10.WHILE6.0.NOLIST6.0ELSEIFIDNI5.10Условные ошибки.NOLISTIF6.0ENDIF.ERR4.0.NOLISTMACRO6.0IF.ERR14.0PAGEIF1.ERR24.0.SALLIF2.ERRB4.0.SFCONDIFB.ERRDEF4.0SUBTITLE6.0IFDEF.ERRDIF4.0SUBTTL5.10IFDIF.ERRDIFI5.0.TFCONDIFDIFI5.0.ERRE4.0TITLEIFE.ERRIDN4.0.XALLIFIDN.ERRIDNI5.0.XCREF5.10IFIDNI5.0.ERRNB4.0.XLIST5.10IFNB.ERRNDEF4.0IFNDEF.ERRNZ4.0СимволыSegmentMacro FunctionsEnvironmentКлючевое словоВерсияКлючевое словоВерсияКлючевое словоВерсия@Сode5.0@CatStr6.0@Cpu5.10@CodeSize5.0@InStr6.0@Date6.0@CurSeg5.0@SizeStr6.0@Environ6.0@data5.0@SubStr6.0@FileCur6.0@DataSize5.0Miscellaneous@FileName6.0@fardata?5.0$@Interface6.0@fardata5.0?@Line6.0@Model6.0@@5.10@Time6.0@stack6.0@b5.10@Version5.10@WordSize5.10@f5.10Операторы TypeSegmentMiscellaneousКлючевое словоВерсияКлючевое словоВерсияКлючевое словоВерсия.:' 'ABSADDR6.0" "FARAT( )HIGHBYTE:HIGH328.0COMMON::5.10HIGHWORD6.0DWORD;LENGTHFLAT6.0[ ]LENGTHOF6.0IMAGEREL8.0CARRY?6.0LOWLROFFSET6.0DUPLOW328.0MEMORYOVERFLOW?6.0LOWWORD6.0OFFSETPARITY?6.0MASKPAGESIGN?6.0NEARPARAZERO?6.0OPATTR6.0PRIVATE6.0RelationPTRPUBLICEQSHORTSECTIONREL8.0GESIZESEGGTSIZEOF6.0STACKLETHISUSE16LT.TYPEUSE32NETYPEWORDWIDTH
Арифметические операцииУправляющие операторыЛогические операции и сдвиги*!AND+!=NOT.&OR/&&SHLMOD<SHRМакро<=XOR!==%>&>=;;||< >Регистры, языковые соглашения, модели памяти РегистрыMMX-регистрыСегментные регистры6432168H8LКлючевые словаВерсияКлючевые словаВерсияКлючевые словаMM06.12CSРегистры общего назначенияMM16.12DSRAXEAXAXAHALMM26.12ESRBXEBXBXBHBLMM36.12FS5.0RCXECXCXCHCLMM46.12GS5.0RDXEDXDXDHDLMM56.12SSRDIEDIDI―DILMM66.12Управляющие регистрыRSIESISI―SILMM76.12CR05.0RBPEBPBP―BPLFPU-регистрыCR25.0RSPESPSP―SPLSTCR35.0R8R8DR8W―R8BST1CR45.0. . .ST2Тестовые регистрыR15R15DR15W―R15BST3TR35.0Регистр командST4TR45.0RIPEIPIPST5TR55.0Регистр флаговST6TR65.0RFLAGSEFLAGSFLAGSST7TR75.0
Языковые соглашениярегистрыМодели памятиКлючевые словаВерсияКлючевые словаВерсияКлючевые словаВерсияBASIC5.10SSE2-регистрыCOMPACT5.0C5.10XMM06.14FLAT6.0FORTRAN5.10. . .HUGE5.0PASCAL5.10XMM156.14LARGE5.0FASTCALLAVX/AVX2-регистрыMEDIUM5.0STDCALL6.00BYMM010.0SMALL5.0SYSCALL6.0. . .TINY6.0Отладочные регистрыYMM1510.0DR05.0AVX-512 регистрыDR15.0ZMM0DR25.0. . .DR35.0ZMM31DR65.0DR75.0
MACRO-80 © 1979 НазваниеРазмер (байт)md5ДатаM80.COM20096cb37415442c76354003024e3a7cdeff312/9/1981build 3.4(time of day from file stamp unknown)M80.COM1920019c63f05a7541b95ff28249e6c913448build 3.4(file date unknown)Исходный ассемблерный продукт Microsoft предназначался для микропроцессоров Intel 8080, работавших под управлением операционной системы CP/M, предшествующей DOS. Тим Патерсон (создатель DOS) уверял, что MASM не произошел от MACRO-80, упоминание о MACRO-80 сделано в исторических целях, поскольку, это был первый коммерческий ассемблер фирмы Microsoft. По данным EMSPS, прейскурантная цена ассемблера составляла 200 долларов. В Википедии описывается 8-битный микропроцессор 8080 2 МГц, выпущенный в апреле 1974: «8080 иногда называют «первым по-настоящему пригодным для использования микропроцессором», хотя раньше микропроцессоры использовались в калькуляторах, кассовых аппаратах, компьютерных терминалах, промышленных роботах и других приложениях. Архитектура 8080 сильно повлияла на архитектуру процессора Intel 8086, которая породила Семейство процессоров x86». Следующий фрагмент взят из Руководства TRS-80: Введение в ассемблер Macro-80: «MACRO-80 — это перемещаемый ассемблер макросов для микрокомпьютерных систем 8080 и Z80. Он ассемблирует код 8080 или Z80 в любой системе разработки 8080 или Z80, работающей под управлением операционной системы CP/M, ISIS-II, TRSDOS или TEKDOS. MACRO-80 Пакет включает в себя ассемблер MACRO-80, линкер LINK и программу создания перекрестных ссылок CRED-80. Версии CP/M включают в себя менеджер библиотек LIB-80. MACRO-80 размещается в 14 КБ памяти и имеет скорость сборки более 1000 строк в минуту. MACRO-80 включает в себя почти все функции ассемблера для «большого компьютера», не жертвуя при этом скоростью или объемом памяти. Ассемблер поддерживает полный набор стандартных макросов Intel, включая IRP, IRPC, REPEAT, локальные переменные и EXITM. Вложенность макросов ограничена объемом памяти. Код собирается в перемещаемые модули, которыми можно управлять с помощью гибкого загрузчика компоновки. Возможности условной сборки расширены за счет расширенного набора условных псевдоопераций, которые включают проверку прохода сборки, определение символа и параметры макросов. Условные обозначения могут иметь вложенность до 255 уровней».
MACRO-86 © 1981Следующий двухпроходный ассемблер Microsoft предназначался для 8086, 16-разрядного микропроцессора, выпущенного Intel в 1978. Это был первый микропроцессор из серии, которая позже станет известна как архитектура x86. Это был первый ассемблер фирмы Microsoft для архитектуры 8086. Ассемблер Microsoft (и основная линейка продуктов) до сих пор придерживается этой архитектуры. Более поздние версии ассемблера будут переименованы в «Microsoft MACRO Assembler». В руководстве говорится: «MACRO-86 поддерживает большинство директив, содержащихся в ассемблере макросов Microsoft MACRO-80. Макросы и условные выражения соответствуют стандарту Intel 8080». МАКРО-86 распространялся на одном диске вместе с 4 файлами: M86.EXE, LINK.EXE, LIB.EXE и CREF.EXE.Системные требования MACRO-86 - 96K bytes of memory minimum: ____64K bytes for code and static data ____32K bytes for run space MS-LINK - 54K bytes of memory minimum: ____44K bytes for code ____10K bytes for run space MS-LIB - 38K bytes of memory minimum: ____28K bytes for code ____10K bytes for run space MS-CREF - 24K bytes of memory minimum: ____14K bytes for code ____10K bytes for run space 1 disk drive ____1 disk drive if and only if output is sent to the ____same physical diskette from which the input was ____taken. None of the utility programs in this ____package allow time to swap diskettes during ____operation on a one-drive configuration. Therefore, ____two disk drives is a more practical configuration.
MASM 1.0 IBM © 1981Это OEM-версия MASM под брендом IBM, разработанная Microsoft специально для IBM PC и выполняющая только инструкции микропроцессора 8086. Эта версия идентифицируется как созданная с помощью «IBM PC Pascal». Эта версия MASM поддерживает ESC и устаревший синтаксис, который использовался для указания кодов операций с плавающей запятой. В командной строке отображается «Ассемблер MACRO IBM Personal Computer», а не «Ассемблер MACRO Microsoft», отображаемый версией Microsoft. В MASM.EXE по смещению 0E50Dh (=58637) находится строка определяющая дату:8/24/81 Ver Версии MASM от IBM также распространяли небольшой сопутствующий ассемблер под названием ASM.EXE. В этом ассемблере отсутствовали некоторые функции, присутствующие в MASM.EXE (например, возможность использования макросов), поэтому он мог работать на компьютерах с объемом памяти всего 64 КБ. Исходный дистрибутив содержит следующий список каталогов из 14 файлов на 5-дюймовой дискете емкостью 160 КБ: 09/24/1981 10:00 PM_____137 $$EDASM.BAT 09/24/1981 10:00 PM_____140 $$EDMASM.BAT 10/28/1981 10:00 PM_____622 $ASML.BAT 10/28/1981 10:00 PM_____614 $EDASM.BAT 10/28/1981 10:00 PM_____614 $EDMASM.BAT 09/24/1981 10:00 PM______23 $LINK.ARF 10/28/1981 10:00 PM_____615 $MASML.BAT 12/07/1981 10:00 PM__52,736 ASM.EXE 10/04/1981 10:00 PM__13,824 CREF.EXE 11/08/1981 10:00 PM___6,580 EXMP1M.ASM 11/08/1981 10:00 PM___5,621 EXMP1S.ASM 09/15/1981 10:00 PM___2,015 EXMP2M.ASM 09/15/1981 10:00 PM___1,861 EXMP2S.ASM 12/07/1981 10:00 PM__67,584 MASM.EXE ПРИМЕЧАНИЕ. Как и MASM 1.0 от Microsoft, DOSBox зависает при запуске исполняемого файла, хотя, он работает нормально при запуске в командном окне под XP или в среде MS-DOS 6.22, моделируемой VirtualBox. В 2017 проблема была решена, проблема была связана с ошибкой подписи, возникшей в стартовом коде компилятора Pascal. Уменьшение объема памяти или исправление одного байта (замена JNG на JNA) решает проблему. MASM IBM 1.0 Диск
MASM 1.0 © 1981 НазваниеРазмер (байт)md5ДатаMASM.EXE675840c68bde13bf46f813b41fc5b19ed56d812/7/1981 10:00pmЭта версия поддерживает те же функции, что и версия под брендом IBM. Также, как и версия IBM, идентифицирует эту версию как созданную с использованием «IBM PC Pascal». Список каталогов дистрибутива 160k выглядит следующим образом: _Volume in drive A has no label Directory of A:\ M______EXE 67840 02-05-82 12:49p LINK___EXE 41216 02-04-82 1:47p ____2 file(s) 109056 bytes Total files listed: ____2 file(s) 109056 bytes ________50688 bytes free[/COLOR] Когда эта версия запускается из командной строки без параметров, имя, которое MASM сообщает на консоль, — «The Microsoft MACRO Assembler». Это имя встречается во всех версиях серии 1.xx. В последующих версиях артикль «The» удален, в результате чего появился «Microsoft MACRO Assembler». Это внутреннее имя снова немного изменится в версии 4.0 на «Microsoft (R) Macro Assembler», которое останется во всех будущих версиях. В исполняемый файл со странным названием (M.EXE, единственная известная версия MASM с таким коротким именем) по смещению 0ED83h (=60803) встроена идентичная строка даты, которая встречается в MASM под маркой IBM:8/24/81 Ver Указанные даты файлов отличаются почти на 6 месяцев. Также, как и в версии IBM, эта строка даты не отображается в командной строке, когда MASM запускается без параметров. Два отдельных дистрибутива обычного (не OEM IBM) Microsoft MASM 1.0, имеют идентичное содержимое файлов, но разные временные метки. Временные метки идентичны, за исключением разницы в два часа (возможно, из-за разницы во времени); метки времени между версиями LINK.EXE также отличались на два часа. Это можно рассматривать как указание официальной даты выпуска, поскольку у двух архивов был один и тот же день. Основной дистрибутив (по списку каталогов): __02/05/1982 12:49 PM 67,840 M.EXE __02/04/1982 01:47 PM 41,216 LINK.EXE Альтернативное распространение: __02/05/1982 10:49 AM 67,840 M.EXE __02/04/1982 11:47 AM 41,216 LINK.EXE Хотя эта версия MASM работает под XP, она зависает при запуске под DOSBox, как и версия под маркой IBM. По имеющимся данным, эта версия была совместима с IBM PC-DOS 1.0. СИСТЕМНЫЕ ТРЕБОВАНИЯ: IBM PC-DOS 1.0 и более поздние версии
MASM 1.06 © 1981, 1982 НазваниеРазмер (байт)md5ДатаMASM.EXE707849446dcc509686be2772bf9c852a5df5b2/8/1982(from date embedded within executable)Это возможно внутренний или неофициальный релиз. Как и предыдущие версии 1.x, эта версия идентифицируется как созданная с использованием «IBM PC Pascal». Она находится между версиями 1.0 и 1.1, имеет поддержку чисел с плавающей запятой, но еще не поддерживает дескрипторы файлов DOS 2+. Как и MASM 1.0, поддерживает ключи /D /O /X. Ассемблер идет в комплекте с тем же LINK.EXE, что и в версии 1.10.
MASM 1.10 © 1981, 1982 НазваниеРазмер (байт)md5ДатаMASM.EXE77440a9f9df1d0afd30c46f8facffffc72c642/1/1983 1:13pm(file from MS-DOS source code)Это была первая версия, поддерживающая коды операций 8087. Как и все предыдущие версии 1.x, эту версию идентифицируют как созданную с использованием «IBM PC Pascal». Дескрипторы файлов также поддерживались при работе в DOS 2.0 или выше (на тот момент Microsoft добавила поддержку дескрипторов файлов в находившуюся в разработке DOS 2.0). Архив содержит MASM 1.10 (находится как v20object/MASM.EXE), который использовался для компиляции исходного кода MS-DOS 2.0 (в каталоге v20source). Версия 2.0 MS-DOS (подлежала компиляции версия MASM 1.10) была первой версией DOS, поддерживавшей подкаталоги, жесткие диски, драйверы устройств, TSR (резидентные программы), перенаправление файлов и дискеты емкостью 360 КБ. СПИСОК ИЗМЕНЕНИЙ: Поддержка кодов операций сопроцессора 8087 через переключатель /R. Поддержка дескрипторов файлов DOS 2.0+.
Я разжился в свое время двумя книжками IBM - первое издание MASM и второе, это фотки книжки от первого:
MASM 1.25 © 1981, 1982, 1983 НазваниеРазмер (байт)md5ДатаMASM.EXE808562d7c908056d8e9ce4de37ca2df416aa48/25/1982(from date embedded within executable)Начиная с этой версии «IBM PC Pascal» больше не использовался для сборки MASM. Только в версии 4.0 подписи MASM EXE снова изменяются как исходные из Microsoft C. В командной строке отображаются пробелы вокруг запятой между именем и версией. В этих версиях присутствует строка об авторских правах, чего нет ни в одной другой версии. На эту версию ссылается Microsoft в KB24953 и Q24962. Внутри исполняемого файла по смещению 10BC7h (=68551) находится строка: __8/25/82 Ver Для этой версии MASM это была единственная точная информация о дате. СПИСОК ИЗМЕНЕНИЙ: Поддержка эмуляции чисел с плавающей запятой (через ключ /E), в результате чего результирующий OBJ-файл будет иметь внешнюю ссылку на FIDRQQ и дополнительные исправления.
MASM 1.27 © 1981, 1984 НазваниеРазмер (байт)md5ДатаMASM.EXE812806a036d58988a65dbcae927005f5a26cf11/27/1984 9:25am(from ACT/ Apricot BETA Programmer's Toolkit)Об этой версии было мало общедоступной информации, пока она не появилась в архиве ACT/Apricot на диске с надписью: BETA TEST 17/12/84 MASTER COPY PROGRAMMER'S TOOL KIT FOR MSDOS 3.06 Это был загрузочный диск Apricot/Xi RAM BIOS, включающий версии MS-DOS утилит MASM, LINK, LIB, CREF, EXE2BIN и DEBUG. На этом диске был файл README.DOC. Это была первая версия MASM, распространявшаяся с документом README. В README включена информация о списке изменений для LINK 2.44 и LIB 2.20. В командной строке отображаются пробелы вокруг запятой между именем и версией. СПИСОК ИЗМЕНЕНИЙ: IFB и IFNB исправлены Распознает память размером более 512 Кбайт fsubr, fdiv и fdivr исправлены
MASM 2.0 IBM © 1981, 1983, 1984 НазваниеРазмер (байт)md5ДатаMASM.EXE765443bd07c55ce4161e0a644f0e8f870e8e37/18/1984 12:01pmПоследняя версия только для DOS, выпущенная Microsoft под брендом IBM. Будущие версии MASM будут предназначены только для Microsoft, за исключением версии IBM 1.0 «Assembler/2», которая 3 года спустя была переименованной в MASM 4.0 с поддержкой OS/2. Согласно статье в журнале PC Magazine, к этой версии прилагалось руководство, которое было одним из лучших справочников по набору инструкций. Это была надежная версия, которая была «лучшим выбором в этой области» из-за дополнительной стабильности исправлений ошибок, двухтомного руководства, которое считалось одним из лучших справочников по наборам команд в то время, и включения LIB. инструмент. В этой версии исправлены некоторые проблемы с инструкциями псевдоопераций SHR и SHL и улучшена проверка типов. IBM SALUT, написанная Скоттом Т. Джонсом, обозначала утилиты структурированного языка ассемблера; по сути, это позволило включать структурированные операторы управления потоком данных в программы на языке ассемблера, выводящие файлы .ASM. Microsoft, должно быть, осознала это, поскольку SALUT больше никогда не появлялся ни в каких выпусках Microsoft MASM, хотя MASM 1.0 от IBM для OS/2 (3 года спустя) включал последнюю известную версию. MASM 3.0 был выпущен через 4 месяца после этого выпуска (в зависимости от даты файла). СПИСОК ИЗМЕНЕНИЙ: Поддержка инструкций 186, 286 и 287 (директивы .186, .286c и .287) Анализ двоичного файла показал 286 инструкций защищенного режима в таблицах инструкций, но их фактически невозможно использовать, поскольку нет директивы .286p (отсутствует до версии 3.0). Исправлены инструкции псевдо-операций SHR и SHL. Добавлена утилита LIB Добавлена утилита IBM SALUT Статья: "Ассемблер — чертовски сложный язык" Обзор IBM MASM 2.0, Microsoft MASM 3.0 и Pasm86 Phoenix BIOS. "Журнал ПК" 29 октября 1985
MASM 2.04 © 1982 НазваниеРазмер (байт)md5ДатаMASM.EXE679688e97eff1ceb2a0120188b8d855e125cf3/2/1982(from date embedded within executable)Версия входит в серию MASM версии 2, у этой версии есть год авторских прав и дата файла, что соответствует временному интервалу 1.0. Эту версию идентифицируют как созданную с использованием «IBM PC Pascal». Эта версия MASM получила название 2.04 для того, чтобы соответствовать общему пакету служебного программного обеспечения, технически она не входит в серию MASM 2.x. Это переименованная версия MASM 1.0, ее функции предшествуют тем, которые присутствовали в MASM 1.10.
MASM 3.0 © 1981, 1983, 1984 НазваниеРазмер (байт)md5ДатаMASM.EXE773623ba4307324e6595fe2dcf621b21f0b1511/21/1984 2:49pmВ README.DOC этой версии MASM указано, что это «значительно улучшенная версия пакета Microsoft Macro Assembler Package v 1.27». Это указывает на то, что после версии 1.27 нумерация версий Microsoft перешла сразу на 3.0 и что MASM 2.0, не принадлежащий IBM, никогда не существовал. Список каталогов дистрибутива 360k выглядит следующим образом: Volume in drive A has no label Directory of A:\ MASM EXE 77362 11-21-84 2:49p SYMDEB EXE 27136 12-07-84 1:39p MAPSYM EXE 17290 11-09-84 4:22p CREF EXE 10544 11-21-84 2:51p LINK EXE 41114 11-14-84 2:48p LIB EXE 24138 10-31-84 4:57p MAKE EXE 18675 08-13-84 1:24a README DOC 4085 12-07-84 2:30p 8 file(s) 220344 bytes Total files listed: 8 file(s) 220344 bytes 138240 bytes free Это вторая версия MASM, распространяемая с README.DOC (1.27 была первой). Существует два разных дистрибутива MASM 3.0, оба с точной датой ноября 1984 (соответствующей авторским правам), временная метка файла является исходной выпущенной версией. В командной строке Microsoft отказалась от ранее названного «The Microsoft MACRO Assembler» в пользу более краткого «Microsoft MACRO Assembler» версий 3.xx. В статье журнала PC Magazine за октябрь 1985 написано, что руководство Microsoft было «катастрофой» для этой версии по сравнению с руководством IBM MASM 2.0. Сообщается, что в этой версии каждая инструкция документировалась ровно одной строкой текста. Руководство IBM MASM 2.0 представляло собой двухтомный справочник и было отмечено как «просто лучший справочный источник» для инструкций 8086/8088. В руководстве Microsoft более глубокое обсуждение инструмента LIB, выходящее за рамки синтаксиса командной строки. Включение инструмента SYMDEB названо «жемчужиной» этого выпуска, MASM от Microsoft единственное местом, где его можно было получить. SYMDEB хорош для отладки программ, написанных с помощью компиляторов других языков Microsoft, таких как C, FORTRAN и Pascal. СПИСОК ИЗМЕНЕНИЙ: Поддержка набора инструкций Intel 80286 защищенного режима (через директиву .286p) Знакомство с утилитами MAKE, SYMDEB и MAPSYM
MASM 3.01 © 1981, 1983, 1984 НазваниеРазмер (байт)md5ДатаMASM.EXE773623ba4307324e6595fe2dcf621b21f0b1511/21/1984 2:49pmФактический бинарный файл MASM.EXE идентичен версии 3.0 с датой 21.11.1984 (идентичные хэши файлов). Версия 3.01 ― «техническое обновление» версии 3.0, содержит изменения в MAPSYM и SYMDEB. Список каталогов дистрибутивного диска 360k выглядит следующим образом: Volume in drive A has no label Directory of A:\ MASM EXE 77362 11-21-84 2:49p LINK EXE 41114 11-14-84 2:48p SYMDEB EXE 36538 06-07-85 4:26p MAPSYM EXE 51904 06-21-85 10:21a CREF EXE 10544 11-21-84 2:51p LIB EXE 24138 10-31-84 4:57p MAKE EXE 18675 08-13-84 1:24a README DOC 22986 06-21-85 10:03a 8 file(s) 283261 bytes Total files listed: 8 file(s) 283261 bytes 74752 bytes free СПИСОК ИЗМЕНЕНИЙ: Изменения в утилитах SYMDEB и MAPSYM (описаны в README.DOC).
MASM 4.0 © 1985 НазваниеРазмер (байт)md5ДатаMASM.EXE8556651dc11f7a303f3d25809e5e9f36d05eb10/16/1985 4:00amСписок каталогов дистрибутивного диска 360k выглядит следующим образом: Volume in drive A has no label Directory of A:\ MASM EXE 85566 10-16-85 4:00a LINK EXE 43988 10-16-85 4:00a SYMDEB EXE 37021 10-16-85 4:00a MAPSYM EXE 18026 10-16-85 4:00a CREF EXE 15028 10-16-85 4:00a LIB EXE 28716 10-16-85 4:00a MAKE EXE 24300 10-16-85 4:00a EXEPACK EXE 10848 10-16-85 4:00a EXEMOD EXE 11034 10-16-85 4:00a COUNT ASM 5965 10-16-85 4:00a README DOC 7630 10-16-85 4:00a <--View Readme 11 file(s) 288122 bytes Total files listed: 11 file(s) 288122 bytes 69632 bytes free Эта версия MASM не включала программу установки, ее предполагалось копировать на рабочую дискету (или жесткий диск) и запускать как есть. Это последняя версия MASM, которая поставлялась с руководствами в виде папки с тремя кольцами. Руководства версии 5.0 и выше выпускались в виде буклетов в мягком переплете. Это последняя версия MASM, в которой не было возможности отображать собственные параметры командной строки. Информация в разделе «Новые возможности» Руководства пользователя версии 4.0, открывается аннотацией: Версия 4.0 Microsoft Macro Assembler (MASM) оптимизирована для повышения производительности. Теперь код ассемблируется в два-три раза быстрее, чем в предыдущих версиях. Буферы ввода/вывода и текст макросов удалены из пространства символов, это позволяет собирать исходные файлы большего размера. Это первая версия MASM, написанная на Microsoft C. Предыдущие версии до 1.10 имели подписи «IBM PC Pascal». Бинарный анализ этой версии также показывает связи с библиотеками C-Runtime. В этой версии MASM изменено имя, указанное в командной строке. Название изменилось с: Microsoft MACRO Assembler в версии 3.0 на: Microsoft (R) Macro Assembler Microsoft сохранила новое имя для всех будущих версий. СИСТЕМНЫЕ ТРЕБОВАНИЯ: Компьютер с одним из микропроцессоров семейства 8086/80186/80286. Версия 2.0 или более поздняя операционная система MS-DOS® или PC-DOS (в руководстве также говорится: «Поскольку эти две операционные системы по сути одинаковы, в этом руководстве используется термин MS-DOS для обозначения обоих вариантов») Память 128 КБ (команде Shell (!) SYMDEB может потребоваться больше памяти) Рекомендуется два флоппи-дисковода или один жесткий диск. Текстовый редактор, способный создавать файлы формата ASCII без управляющих кодов. СПИСОК ИЗМЕНЕНИЙ: Новые директивы условных ошибок: Эти директивы позволяют вам проверять параметры, границы и другие значения времени сборки и генерировать ошибку, если предопределенные условия не соответствуют действительности. Перечисление изменений формата файла: Формат файлов списков, создаваемых MASM, изменился несколькими способами. Добавлено несколько новых кодов выхода. Новые возможности для MASM: Были добавлены следующие параметры командной строки: ОпцииОписание/BnumberУстанавливает файловый буфер любого размера от 1 КБ до 63 КБ, чтобы минимизировать доступ к диску./Cсоздает файл перекрестных ссылок./Lсоздает листинг сборки./Dsymbolопределяет символ (для условных директив) из командной строки или из подсказок при запуске MASM./Ipathустанавливает путь, по которому ассемблер будет искать файлы, указанные в директиве INCLUDE./Nподавляет таблицу символов в листинге./Pпроверяет наличие нечистого кода, который может вызвать проблемы в защищенном режиме 80286./T подавляет все сообщения, если ошибок не обнаружено./VВыводит на экран дополнительную статистику после сборки./Zотображает на экране исходные строки, содержащие ошибки (без опции отображается только сообщение об ошибке). Предыдущие версии MASM всегда отображали как исходную строку, так и сообщение об ошибке. Параметр командной строки /O (Восьмеричная система счисления) был удален, поскольку он больше не поддерживается. Изменения компоновщика: У LINK есть две новые опции: опция /EXEPACK позволяет упаковывать исполняемые файлы во время компоновки, а опция /HELP позволяет просмотреть список опций LINK. Кроме того, LINK был оптимизирован для ускорения связывания. Новые возможности для SYMDEB: Были добавлены следующие параметры командной строки: ОпцииОписание/KВключает клавишу SCROLL LOCK или BREAK в качестве интерактивной клавиши точки останова./Nвключает немаскируемые системы прерываний для компьютеров сторонних производителей/Sвключает переключение между экраном SYMDEB и экраном программы./"команды"выполняет указанные команды при запуске.Недокументированные параметры SYMDEB (версии 3.0 и 4.0) ОпцииОписание/Dкомпьютер несовместим с IBM/Fигнорировать SYM-файл/Rоставаться резидентом при выходе SYMDEB Изменения CREF: CREF теперь использует все доступное пространство памяти, позволяя программе обрабатывать файлы перекрестных ссылок большего размера. Изменения MAKE: В утилиту MAKE добавлены две новые возможности и несколько опций. MAKE теперь поддерживает определения макросов и правила вывода. Введение двух новых утилит: EXEPACK – позволяет упаковывать исполняемые файлы. EXEMOD — позволяет изменять заголовок файла MS-DOS файлов .EXE. ОФИЦИАЛЬНЫЕ ИСПРАВЛЕНИЯЧерез пару месяцев после выпуска MASM 4.0 Microsoft опубликовала утилиту, позволяющую перенаправить устройство стандартной ошибки для использования с MASM.EXE. Это позволило отправить вывод на экран целиком (ошибки и все такое) на другое устройство отображения, например принтер. Согласно документу README (MASM4FIX.DOC/file_date=20.11.1986), Microsoft выпустила инструкции по ручному исправлению для решения некоторых проблем, с которыми MASM столкнулся с файлами INCLUDE. Документ также содержит патч, устраняющий неспособность MASM перенаправлять ошибки, отправленные на CRT.НЕОФИЦИАЛЬНЫЕ ИСПРАВЛЕНИЯВ этой версии исправлена давняя и печально известная ошибка «PUSH непосредственное значение». Согласно странице 326 журнала PC Magazine от 12 апреля 1988 в статье под названием «Бюджетное программирование OS/2», Чарльз Петцольд рекомендовал не использовать версии MASM до 4.0 из-за ошибки PUSH непосредственное значение, включая IBM версия 2.0. Текст статьи: «Макросемблеры IBM версии 2.0 и Microsoft версии 3.0 поддерживают инструкции микропроцессора 80286 и поэтому выглядели многообещающе, но оба содержат ошибку, которая влияет на генерацию кода ― это инструкция PUSH непосредственное значение. Вот в чем ошибка: инструкция PUSH непосредственное значение имеет две формы. Обычно байт машинного кода 68h за ним следуют два байта, обозначающие значение слова, которое должно быть помещено в стек. Однако если непосредственное значение находится между 0FF80h (-128) и 7Fh (127), тогда ассемблер может вместо этого сгенерировать байт машинного кода. 6Ah, за которым следует только один байт. 80286 расширяет знак этого байта, чтобы создать слово перед нажатием слово в стеке. В некоторых случаях версии 2.0 и 3.0 макроассемблера генерируют машинный код 68h, за которой следует только один байт данных.» Статья Чарльза Петцольда «Бюджетное программирование для OS/2», журнал PC Magazine, 12 апреля 1988, стр. 325-327. Эрик Кохейн (Eric Cohane) составил документ (MASM.DOC) от 31 января 1986, цель которого ― «накопление комментариев, относящихся к документации Microsoft Macro Assembler версии 4.0, которые кажутся запутанными, вводящими в заблуждение или которые трудно согласовать с опытом работы с Microsoft Macro Assembler версии 4.0». Роджер Шлафли (Roger Schlafly) из фирмы Borland создал список ошибок (MASM400.BUG / file_date=11.05.1986). Руководство по MASM 4.0 и образы дисков 360 КБ Винтажная реклама MASM из журнала Computer Language Выпуск 11 - июль 1985 (предположительно версия 4.0) Информационные бюллетени Microsoft Languages, опубликованные в журнале PC Tech Journal Фрагменты о MASM 4.0: январь 1986 май 1986 май 1987
MASM 4.01 © 1985НазваниеРазмер (байт)md5ДатаMASM401.EXE1021201361f99163ec397dbaaa8e36335b8ca27/24/1987 12:00amЭта малоизвестная версия появилась в каталоге «TOOLS» комплекта адаптации OEM Microsoft MS-DOS 3.3 (OAK). В README OAK было следующее описание: «masm401.exe ― специальный masm, используемый для сборки IO.SYS». Эта версия была на 16К больше версии 4.0.
MASM 5.0 © 1981-1985, 1987НазваниеРазмер (байт)md5ДатаMASM.EXE103175781113d15ee597108af0cde54bd1698d7/31/1987 12:00amПервая версия MASM, способная отображать справку из командной строки при запуске с параметром /H. Добавлена поддержка процессора 80386, выпущенного в октябре 1985 Первая версия MASM, которая распространялась вместе с переплетенными печатным руководством. Комплект из двух 5-дюймовых дискет содержал файл PACKING.LST (показан ниже), иллюстрирующий предустановленное содержимое дисков: Вместе с макроассемблером поставляется следующая документация: Macro Assembler Programmer's Guide (Руководство программиста макроассемблера) Macro Assembler Reference (Справочник по макроассемблеру) CodeView and Utilities Guide (Руководство по CodeView и утилитам) Mixed-Language Programming Guide CodeView Keyboard Templates Old-style keyboard New-style keyboard Следующие файлы поставляются с макроассемблером: Disk 1 RootDisk 1 \MIXEDDisk 2 RootWHAT.ASMBA.ASMPAGER.ASMRUNME.BATCA.ASMSHOW.ASMSETUP.BATFA.ASMDEMO.BATSETUP2.BATPA.ASMRUNME.BATREADME.DOCPOWER2.ASME_AUTO.CVCREF.EXEBAMAIN.BASM_AUTO.CVERROUT.EXECAMAIN.CQ_AUTO.CVEXEMOD.EXEFAMAIN.FORU_AUTO.CVLIB.EXEPAMAIN.PASW_AUTO.CVLINK.EXEMIXED.DOCCV.HLPMAKE.EXEMIXED.INCCV.EXEMASM.EXEEXEPACK.EXESETENV.EXESHOW.EXESHOW.EXEWHAT.EXEWHAT.EXEMACRO.DOCPACKING.LSTBIOS.INC\MIXEDDOS.INCMOUSE.SYSВсе 45 файлов на обоих дисках имели дату полуночи 31 июля 1987. README.DOC был источником некоторых новых функций. На странице «Введение» в Руководстве программиста версии 5.0: Добро пожаловать в Microsoft® Macro Assembler (MASM). Этот пакет предоставляет все инструменты, необходимые для создания программ на языке ассемблера. Макроассемблер предоставляет синтаксис логического программирования, подходящий для сегментированной архитектуры микропроцессоров 8086, 8088, 80186, 80188, 80286 и 80386 (семейство x86), а также математических сопроцессоров 8087, 80287 и 80387 (семейство x87). Ассемблер создает перемещаемые объектные модули из исходных файлов на языке ассемблера. Объектные модули можно связать с помощью LINK, Microsoft Overlay Linker, для создания исполняемых программ для операционной системы MS-DOS®. Объектные модули, созданные с помощью MASM, совместимы со многими объектными модулями языков высокого уровня, в том числе созданными с помощью компиляторов Microsoft BASIC, C, FORTRAN и Pascal. MASM имеет множество стандартных функций, упрощающих разработку программ: Он имеет полный набор макро-директив. Он позволяет условную сборку частей исходного файла. Он поддерживает широкий спектр операторов для создания сложных выражений времени сборки. Он выполняет строгую проверку синтаксиса всех инструкций, включая строгую типизацию операндов памяти. Большая часть информации ниже была взята из раздела «Новые возможности» «Введения» и «Приложения A: Новые возможности» из «Руководства программиста версии 5.0». СИСТЕМНЫЕ ТРЕБОВАНИЯ: Компьютер с одним из процессоров семейства 8086 (ПК или PS/2 и совместимые) MS-DOS или IBM® PC-DOS версии 2.0 или новее (в руководстве указано, что эти дистрибутивы DOS «по сути одинаковы») 192 КБ памяти / отладчику CodeView требуется не менее 320 КБ, рекомендуется минимум 256 КБ памяти и жесткий диск. СПИСОК ИЗМЕНЕНИЙ: Поддержка процессора Intel 386: Поддерживаются все инструкции и режимы адресации процессора 80386 и сопроцессора 80387. Процессор 80386 представляет собой расширенную версию других процессоров семейства 8086. Большинство новых функций представляют собой 32-битные расширения 16-битных функций. Если разобраться в особенностях 16-битных процессоров семейства 8086, то использовать 32-битные расширения не составит труда. Новые 32-битные регистры используются почти так же, как и 16-битные. Некоторые особенности процессора 386 существенно отличаются. Области особой важности включают директиву .386 для инициализации 386, типы сегментов USE32 и USE16 для установки размера сегментного слова и режимы косвенной адресации. Процессор 386 и сопроцессор 387 содержат новые инструкции, перечисленные ниже: названиемнемоникаПобитное сканирование вперед (Bit Scan Forward)BSFПобитное сканирование назад (Bit Scan Reverse)BSRпроверка битов (Bit Test) BTПроверка бита с инверсией (Bit Test and Complement) BTCПроверка бита с его сбросом (Bit Test and Reset)BTRПроверка бита с его установкой (Bit Test and Set)BTSПересылка со знаковым расширением (Move with Sign Extend) MOVSXПересылка с расширением нулем (Move with Zero Extend) MOVZXУстановка байта по условию (Set Byte on Condition) SET условиеСдвиг содержимого двух регистров влево SHLDСдвиг содержимого двух регистров вправо SHRDПересылка из/в специальный регистр (Move to/from Special Registers) MOVВычисление синуса FSINВычисление косинуса FCOSВычисление синуса и косинуса FSINCOSВычисление частичного остатка FPREM1Неупорядоченное сравнение (Unordered Compare Real) FUCOMНеупорядоченное сравнение с выталкиванием (Unordered Compare Real and Pop) FUCOMPНеупорядоченное сравнение с двойным выталкиванием (Unordered Compare Real and Pop Twice) FUCOMPP Новые директивы сегментов позволяют упростить определения сегментов (поддержка новой модели памяти): Новая система определения сегментов доступна в MASM версии 5.0. Эти необязательные директивы реализуют соглашения о сегментах, используемые в языках высокого уровня Microsoft. В упрощенных директивах сегментов используются соглашения об именах Microsoft. Если вы готовы принять эти соглашения, сегменты можно будет определять более легко и последовательно. Однако эта функция является необязательной. Вы по-прежнему можете использовать старую систему, если вам нужен более прямой контроль над сегментами или если вам нужно обеспечить совместимость с существующим кодом. При использовании упрощенных директив сегмента операторы ASSUME и GROUP, соответствующие соглашениям Microsoft, генерируются автоматически. ПРИМЕЧАНИЕ. Директивы упрощенного сегмента нельзя использовать для программ, написанных в COM-формате. Вы должны специально определить один сегмент, необходимый для этого формата. Новая директива DOSSEG позволяет указать порядок сегментов DOS в исходном файле. Эта директива эквивалентна параметру /DOSSEG компоновщика. [bytepointer.com edit] В официальном списке изменений прямо не упоминается то, что в версии 5.0 появились директивы .MODEL и .CODE, две важные директивы, встречающиеся почти во всех современных файлах исходного кода ассемблера. Информация о модели памяти и упрощенной директиве сегмента, приведенная ниже, была скопирована из руководства 5.0 из различных частей разделов 5.1.1. до 5.1.7: Модели памяти. Чтобы использовать упрощенные директивы сегментов, вы должны объявить модель памяти для своей программы. Модель памяти определяет размер данных и кода по умолчанию, используемый в программе. Языки высокого уровня Microsoft требуют, чтобы каждая программа имела размер по умолчанию (или модель памяти). Любая процедура на языке ассемблера, вызываемая из программы на языке высокого уровня, должна иметь ту же модель памяти, что и вызывающая программа. Директива .MODEL используется для инициализации модели памяти. Эту директиву следует использовать в начале исходного кода перед любой другой директивой сегмента. Если одна из других директив упрощенного сегмента (например, .CODE или .DATA) указана перед директивой .MODEL, генерируется ошибка. Синтаксис .MODEL модель памяти Модель памяти может быть Tiny, Small, Compact, Medium, Large или Huge. Сегменты определяются одинаково для Large и Huge моделей, но значение @datasize различно. Ниже описаны наиболее распространенные модели памяти: Модель памятиКоличество и размер сегментовТип указателяОписаниекодаданныхдля кодаДля данныхTinyодин, ⩽64KbnearnearВсе данные и код умещаются в одном сегменте. Программы для tiny моделей должны быть написаны в COM-формате. Некоторые компиляторы других компаний поддерживают tiny модель как опцию.Smallодин, ⩽64Kbодин, ⩽64KbnearnearВсе данные помещаются в один сегмент размером 64 КБ, а весь код — в сегмент 64 КБ. Это наиболее распространенная модель программ на ассемблере. C — единственный язык Microsoft, поддерживающий эту модель.Mediumнесколько, ⩽64Kbодин, ⩽64KbfarnearВсе данные помещаются в один сегмент размером 64 КБ, но размер кода может превышать 64 КБ. Самые последние версии языков Microsoft поддерживают эту модель.Compactодин, ⩽64Kbнесколько, ⩽64KbnearfarВсе помещается в один сегмент размером 64 КБ, но общий объем данных может превышать 64 КБ (хотя ни один массив не может превышать 64 КБ). C — единственный язык Microsoft, поддерживающий эту модель.Largeнесколько, ⩽64Kbнесколько, ⩽64KbfarfarРазмер как кода, так и данных может превышать 64 КБ (хотя размер массива не может превышать 64 КБ). Все языки Microsoft поддерживают эту модель.Hugeнесколько, >64Kbнесколько, >64KbhugehugeРазмер кода и данных может превышать 64 КБ. Кроме того, массивы данных могут иметь размер более 64 КБ. Самые последние версии языков Microsoft поддерживают эту модель. Сегменты одинаковы для Large и Huge моделей.Tchugeнесколько, ⩽64Kbнесколько, ⩽64KbfarfarТакже как для модели large, но с иным использованием сегментных регистровFlatне ограниченоне ограниченоflatflatСоответствует варианту модели small, но с использованием 32-разрядной адресацииMicrosoft упоминает tiny модель. Некоторые компиляторы других компаний так же поддерживают tiny-модель. Программы на ассемблере могут иметь любую модель памяти. SMALL модель подходит для большинства программ, написанных на языке ассемблера. Так как доступ к ближайшим данным или коду быстрее, поэтому модель памяти SMALL обычно наиболее эффективна.
Если вы пишете ассемблерную программу для языка высокого уровня, модель памяти должна соответствовать модели памяти, используемой компилятором или интерпретатором. Если вы пишете отдельную программу на ассемблере, вы можете использовать любую модель. Small модель — лучший выбор для большинства программ на ассемблере. Пример 1 DOSSEG .MODEL small Этот оператор определяет сегменты по умолчанию для программ SMALL моделей и создает операторы ASSUME и GROUP, используемые программами малых моделей. Сегменты автоматически упорядочиваются в соответствии с соглашением Microsoft. Примеры операторов могут использоваться в начале основного (или единственного) модуля программы на ассемблере. Пример 2 .MODEL LARGE Этот оператор определяет сегменты по умолчанию для программ LARGE моделей и создает операторы ASSUME и GROUP, используемые программами больших моделей. Он не упорядочивает сегменты автоматически в соответствии с соглашением Microsoft. Оператор-пример может использоваться в начале ассемблерного модуля, который будет вызываться из программы большой модели на C, BASIC, FORTRAN или Pascal. Если вы используете директиву .386 перед директивой .MODEL, определения сегментов определяют 32-битные сегменты. Если вы хотите включить процессор 80386 с 16-битными сегментами, вам следует указать директиву .386 после директивы .MODEL. Указание порядка сегментов DOS: Директива DOSSEG указывает, что сегменты должны быть упорядочены в соответствии с соглашением о порядке сегментов DOS. Это соглашение используется компиляторами языка высокого уровня Microsoft. Синтаксис DOSSEG Использование директивы DOSSEG позволяет поддерживать согласованный порядок логических сегментов без фактического определения сегментов в этом порядке в исходном файле. Без этой директивы окончательный порядок сегментов исполняемого файла зависит от множества факторов, таких как порядок сегментов, имя класса и порядок связывания. Поскольку порядок сегментов не имеет решающего значения для правильного функционирования большинства ассемблерных программ, вы можете просто использовать директиву DOSSEG и игнорировать весь вопрос порядка сегментов. ПРИМЕЧАНИЕ. Использование директивы DOSSEG (или параметра компоновщика /DOSSEG) имеет два побочных эффекта. Компоновщик генерирует символы, называемые _end и _edata. Не следует использовать эти имена в программах, содержащих директиву DOSSEG. Также компоновщик увеличивает смещение первого байта сегмента кода на 16 байт в маленьких и компактных моделях. Это необходимо для правильного выравнивания исполняемых файлов, созданных с помощью компиляторов Microsoft. Если вы хотите использовать соглашение о порядке сегментов DOS в программах на ассемблере, вам следует использовать аргумент DOSSEG в основном модуле. Модулям, вызываемым из главного модуля, не обязательно использовать директиву DOSSEG. Вам не нужно использовать директиву DOSSEG для модулей, вызываемых из языков высокого уровня Microsoft, поскольку компилятор уже определяет порядок сегментов DOS. Согласно соглашению о порядке сегментов DOS, сегменты имеют следующий порядок: Все имена сегментов, имеющие имя класса «CODE». Любые сегменты, которые не имеют имени класса «CODE» и не являются частью группы DGROUP. Сегменты, входящие в состав DGROUP, расположены в следующем порядке: Любые сегменты класса BEGDATA (имя этого класса зарезервировано для использования Microsoft). Любые сегменты, не относящиеся к классу BEGDATA, BSS или STACK. Сегменты класса BSS Сегменты класса STACK Использование директивы DOSSEG имеет тот же эффект, что и использование параметра компоновщика /DOSSEG. Директива работает путем записи в запись комментария объектного файла. Название этой записи в Intel — COMMENT. Если компоновщик обнаруживает в этой записи определенную последовательность байтов, он автоматически расставляет сегменты в порядке DOS. Новые предопределенные равенства: @curseg: это имя содержит имя текущего сегмента. Это значение может быть удобно для операторов ASSUME, переопределений сегментов или других случаев, когда вам необходимо получить доступ к текущему сегменту. Его также можно использовать для завершения сегмента, как показано ниже: @curseg ENDS ; End current segment .286 ; Must be outside segment .CODE ; Restart segment @filename: Это значение представляет базовое имя текущего исходного файла. Если текущий исходный файл — Task.asm — @filename=Task. Это значение можно использовать в любом имени, которое вы хотите изменить, если имя файла изменится. Его можно использовать в качестве имени процедуры: @filename PROC . . . @filename ENDP @codesize и @datasize: Если используется директива .MODEL, значение @codesize равно 0 для SMALL и COMPACT моделей или 1 для MEDIUM, LARGE и HUGE моделей. Значение @datasize равно 0 для SMALL и MEDIUM моделей, 1 для COMPACT и LARGE моделей и 2 для HUGE моделей. Эти значения можно использовать в операторах условной сборки: IF @datasize les bx,pointer ; Load far pointer mov ax,es:WORD PTR [bx] ELSE mov bx,WORD PTR pointer ; Load near pointer mov ax,WORD PTR [bx] ENDIF @сode, @data и так далее: Для каждой из директив основного сегмента существует соответствующий эквивалент с тем же именем, за исключением того, что эквивалент начинается со знака (@), а директива начинается с точки. Например, эквивалент @сode представляет имя сегмента, определенное директивой .CODE. @fardata представляет имя сегмента .FARDATA, а @fardata? представляет собой .FARDATA? имя сегмента. Эквивалент @data представляет имя группы, общее для всех ближайших сегментов данных. Его можно использовать для доступа к сегментам, созданным сегментами .DATA, .DATA?, .CONST и .STACK. Эти равенства можно использовать в операторах ASSUME, а в любое другое время к сегменту необходимо обращаться по имени, например: ASSUME es:@fardata ; Assume ES to far data ; (.MODEL handles DS) mov ax,@data ; Initialize near to DS mov ds,ax mov ax,@fardata ; Initialize far to ES mov es,ax ПРИМЕЧАНИЕ. Хотя предопределенные эквиваленты являются частью упрощенной системы сегментов, эквиваленты @curseg и @filename также доступны при использовании полных определений сегментов. Определение упрощенных сегментов: Директивы .CODE, .DATA, .DATA?, .FARDATA, .FARDATA?, .CONST и .STACK указывают начало сегмента. Они также завершают любое определение открытого сегмента, использованное ранее в исходном коде. синтаксис .STACK [size] Stack segment .CODE [name] Code segment .DATA Initialized near-data segment .DATA? Uninitialized near-data segment .FARDATA [name] Initialized far-data segment .FARDATA? [name] Uninitialized far-data segment .CONST Constant-data segment Для сегментов, которые принимают необязательное имя, используется имя по умолчанию, если оно не указано. Каждая новая директива сегмента завершает предыдущий сегмент. Директива END закрывает последний открытый сегмент исходного файла. Аргумент размера директивы .STACK — это количество байтов, которые необходимо объявить в стеке. Если размер не указан, сегмент определяется размером по умолчанию в один килобайт. Ассемблерные программы в EXE-формате должны определять стек для основного (или единственного) модуля. Стеки определяются компилятором или интерпретатором для модулей, связанных с основным модулем языка высокого уровня. Код следует размещать в сегменте, инициализированном директивой .CODE, независимо от модели памяти. Обычно в исходном модуле определен только один сегмент кода. Если вы помещаете несколько сегментов кода в один исходный файл, вам необходимо указать имя, чтобы различать сегменты. Имя можно указать только для моделей, допускающих использование нескольких сегментов кода (средних и больших). Имя будет игнорироваться, если оно указано для маленьких или компактных моделей. Неинициализированные данные — это любая переменная, объявленная с использованием неопределенного символа (?) и оператора DUP. При объявлении данных для модулей, которые будут использоваться с языком высокого уровня Microsoft, вы должны следовать соглашению об использовании .DATA или .FARDATA для инициализированных данных и .DATA? или .FARDATA? для неинициализированных данных. Для программ на ассемблере, используя расширение .DATA? и .FARDATA? директивы не являются обязательными. Вы можете поместить неинициализированные данные в любой сегмент данных. Постоянные данные — это данные, которые должны быть объявлены в сегменте данных, но не подлежат изменению во время выполнения. Использование этого сегмента не является обязательным для программ на ассемблере. Если вы пишете ассемблерные программы, которые будут вызываться из языка высокого уровня, вы можете использовать директиву .CONST для объявления строк, действительных чисел и других константных данных, которые должны быть выделены как данные. Данные в сегментах, определенных с помощью .STACK, .CONST, .DATA или .DATA? Директивы помещаются в группу под названием DGROUP. Данные в сегментах, определенных с помощью .FARDATA или .FARDATA? директивы не помещаются ни в одну группу. При инициализации регистра DS для доступа к данным в сегменте, связанном с группой, значение DGROUP должно быть загружено в DS. Пример 1 DOSSEG .MODEL SMALL .STACK 100h .DATA ivariable DB 5 iarray DW 50 DUP (5) string DB "This is a string" uarray DW 50 DUP (?) EXTRN xvariable:WORD .CODE start: mov ax,DGROUP mov ds,ax EXTRN xprocedure:NEAR call xprocedure . . . END start В этом коде используются упрощенные директивы сегментов для небольшой автономной программы на ассемблере. Обратите внимание, что инициализированные данные, неинициализированные данные и строковая константа определены в одном и том же сегменте данных. Пример 1. Эквивалент программы (без использования упрощенных сегментных директив) EXTRN xvariable:WORD EXTRN xprocedure:NEAR DGROUP GROUP _DATA,_BSS ASSUME cs:_TEXT,ds:lol:GROUP,ss:lol:GROUP _TEXT SEGMENT WORD PUBLIC 'CODE' start: mov ax,DGROUP mov ds,ax . . . _TEXT ENDS _DATA SEGMENT WORD PUBLIC 'DATA' ivariable DB 5 iarray DW 50 DUP (5) string DB "This is a string" uarray DW 50 DUP (?) _DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 100h DUP (?) STACK ENDS END start Этот пример эквивалентен примеру 1 с использованием упрощенных сегментных директив. Порядок сегментов в этой версии должен быть другим, чтобы достичь порядка сегментов, заданного с помощью директивы DOSSEG в первом примере. В этом примере внешние переменные объявляются в начале исходного кода. С помощью упрощенных директив сегмента их можно объявить в том сегменте, в котором они используются. Пример 2 .MODEL LARGE .FARDATA? fuarray DW 10 DUP (?) ; Far uninitialized data .CONST string DB "This is a string" ; String constant .DATA niarray DB 100 DUP (5) ; Near initialized data .FARDATA EXTR xvariable:FAR fiarray DW 100 DUP (10) ; Far initialized data .CODE TASK EXTR xprocedure:PROC task PROC . . . ret task ENDP END В этом примере используются упрощенные директивы сегмента для создания модуля, который может быть вызван из LARGE модели программы на языке высокого уровня. Разные типы данных помещаются в разные сегменты в соответствии с соглашениями компилятора. Пример 2. Эквивалент (без использования упрощенных директив сегмента) DGROUP GROUP _DATA,CONST,STACK ASSUME cs:TASK_TEXT,ds:FAR_DATA,ss:STACK EXTRN xprocedure:FAR EXTR xvariable:FAR FAR_BSS SEGMENT PARA 'FAR_DATA' fuarray DW 10 DUP (?) ; Far uninitialized data FAR_BSS ENDS CONST SEGMENT WORD PUBLIC 'CONST' string DB "This is a string" ; String constant CONST ENDS _DATA SEGMENT WORD PUBLIC 'DATA' niarray DB 100 DUP (5) ; Near initialized data _DATA ENDS FAR_DATA SEGMENT WORD 'FAR_DATA' fiarray DW 100 DUP (10) FAR_DATA ENDS TASK_TEXT SEGMENT WORD PUBLIC 'CODE;<-- doc bug - manual forgot closing single-quote on 'CODE' task PROC FAR . . . ret task ENDP TASK_TEXT ENDS END Этот пример эквивалентен примеру 2 с использованием упрощенных директив сегмента. Обратите внимание, что порядок сегментов одинаков в обеих версиях. Показанный здесь порядок сегментов записывается в объектный файл, но в исполняемом файле он другой. Порядок сегментов, указанный компилятором (порядок сегментов DOS), переопределяет порядок сегментов в объектном файле модуля. Упрощенные настройки сегментации по умолчанию: Когда вы используете упрощенные директивы сегмента, значения по умолчанию в определенных ситуациях отличаются от тех, которые были бы, если бы вы дали полные определения сегмента. Изменяемые значения по умолчанию перечислены ниже: Если вы даете полные определения сегментов, размер по умолчанию для директивы PROC всегда равен NEAR. Если вы используете директиву .MODEL, директива PROC связана с указанной моделью памяти: NEAR для маленьких и компактных моделей и FAR для средних, больших и огромных моделей. Если вы даете полные определения сегмента, адрес сегмента, используемый в качестве базы при вычислении смещения с помощью оператора OFFSET, является сегментом данных (сегментом, связанным с регистром DS). При использовании упрощенных директив сегмента базовым адресом является сегмент DGROUP для сегментов, связанных с группой. Сюда входят сегменты, объявленные с помощью директив .DATA, .DATA? и .STACK, но не сегменты, объявленные с помощью .CODE, .FARDATA и FARDATA? директивы. Например, предположим, что переменная test1 была объявлена в сегменте, определенном директивой .DATA, а переменная test2 была объявлена в сегменте, определенном директивой .FARDATA. mov ax, OFFSET test1 загружает адрес test1 относительно DGROUP. mov ax, OFFSET test2 загружает адрес test2 относительно сегмента, определенного директивой .FARDATA. Имена сегментов по умолчанию: Если вы используете упрощенные директивы сегмента сами по себе, вам не нужно знать имена, присвоенные каждому сегменту. Однако можно смешивать полные определения сегментов с упрощенными определениями сегментов. Поэтому некоторые программисты могут захотеть узнать фактические имена, присвоенные всем сегментам. В таблице ниже показаны имена сегментов по умолчанию, созданные каждой директивой. ModelDirectiveNameAlignCombineClassGroupSmall.CODE_TEXTWORDPUBLIC'CODE'.DATA_DATAWORDPUBLIC'DATA'DGROUP.CONSTCONSTWORDPUBLIC'CONST'DGROUP.DATA?_BSSWORDPUBLIC'BSS'DGROUP.STACKSTACKPARASTACK'STACK'DGROUPMedium.CODEname_TEXTWORDPUBLIC'CODE'.DATA_DATAWORDPUBLIC'DATA'DGROUP.CONSTCONSTWORDPUBLIC'CONST'DGROUP.DATA?_BSSWORDPUBLIC'BSS'DGROUP.STACKSTACKPARASTACK'STACK'DGROUPCompact.CODE_TEXTWORDPUBLIC'CODE'.FARDATAFAR_DATAPARAprivate'FAR_DATA'.FARDATA?FAR_BSSPARAprivate'FAR_BSS'.DATA_DATAWORDPUBLIC'DATA'DGROUP.CONSTCONSTWORDPUBLIC'CONST'DGROUP.DATA?_BSSWORDPUBLIC'BSS'DGROUP.STACKSTACKPARASTACK'STACK'DGROUPLarge или huge.CODEname_TEXTWORDPUBLIC'CODE'.FARDATAFAR_DATAPARAprivate'FAR_DATA'.FARDATA?FAR_BSSPARAprivate'FAR_BSS'.DATA_DATAWORDPUBLIC'DATA'DGROUP.CONSTCONSTWORDPUBLIC'CONST'DGROUP.DATA?_BSSWORDPUBLIC'BSS'DGROUP.STACKSTACKPARASTACK'STACK'DGROUPИмя, используемое как часть имен сегментов far кода, является именем файла модуля. Имя по умолчанию, связанное с директивой .CODE, можно переопределить в MEDIUM и LARGE моделях. Имена по умолчанию для директив .FARDATA и .FARDATA? всегда можно переопределить. Таблица сегментов и групп в конце списков всегда показывает фактические имена сегментов. Однако операторы группы и предположения, созданные директивой .MODEL, не отображаются в файловых списках. Для программы, которая использует все возможные сегменты, будут сгенерированы групповые операторы, эквивалентные следующему: DGROUP GROUP _DATA,CONST,_BSS,STACK Для SMALL и COMPACT моделей будет создано следующее: ___ASSUME cs:_TEXT,ds: DGROUP,ss: DGROUP Для MEDIUM, LARGE и HUGE моделей будет создано следующее: ___ASSUME cs:name_TEXT,ds: DGROUP,ss: DGROUP Только для 80386: Если используется директива .386, выравнивание по умолчанию для всех сегментов является DWORD. Пример исходного кода для создания EXE-файла и COM-файла: В руководстве по версии 5.0 есть пример исходного файла для создания EXE-файла с использованием упрощенных директив сегментации и пример исходного файла для создания эквивалентного COM-файла. (упрощенные директивы сегмента не использовались). Исходный файл для создания EXE-файла: TITLE hello DOSSEG ; Use Microsoft segment conventions .MODEL SMALL ; conventions and small model .STACK 100h ; Allocate 256-byte stack .DATA message DB "Hello, world.",13,10 ; Message to be written lmessage EQU $ - message ; Length of message .CODE start: mov ax,@DATA ; Load segment location mov ds,ax ; into DS register mov bx,1 ; Load 1 - file handle for ; standard output mov cx,lmessage ; Load length of message mov dx,OFFSET message ; Load address of message mov ah,40h ; Load number for DOS Write function int 21h ; Call DOS mov ax,4C00h ; Load DOS Exit function (4Ch) ; in AH and 0 errorlevel in AL int 21h ; Call DOS END start Исходный код, который можно использовать для создания той же программы, но в COM-формате: TITLE hello _TEXT SEGMENT ; Define code segment ASSUME cs:_TEXT,ds:_TEXT,ss:_TEXT ORG 100h ; Set location counter to 256 start: jmp begin ; Jump over data message DB "Hello, world.",13,10 ; Message to be written lmessage EQU $ - message ; Length of message begin: mov bx,1 ; Load 1 - file handle for ; standard output mov cx,lmessage ; Load length of message mov dx,OFFSET message ; Load address of message mov ah,40h ; Load number for DOS Write function int 21h ; Call DOS mov ax,4C00h ; Load DOS Exit function (4Ch) ; in AH and 0 errorlevel in AL int 21h ; Call DOS _TEXT ENDS END start Чтобы создать COM-файл, придется выполнить следующие шаги в MASM 5.0: соберите с помощью MASM, чтобы получить OBJ-файл masm example.asm; линкуем OBJ-файл, чтобы создать фиктивный EXE-файл (игнорируйте предупреждение компоновщика «L4021: нет сегмента стека») link example.obj; запустите EXE2BIN из вашего дистрибутива DOS, передав фиктивное имя EXE-файла и указав имя выходного COM-файла. exe2bin example.exe example.com Перейдите к улучшенной поддержке файлов COM и обновленному примеру для версии 6.0. Поддержка COM-файлов в версии 6.0 устранила необходимость запуска EXE2BIN, поскольку компоновщик создаст COM-файл напрямую. MASM также добавил поддержку крошечной модели, позволяющей использовать упрощенные директивы сегмента; это значительно упростило описанную выше путаницу с исходным кодом COM. Подразумевается, что информация для отладки COM-файлов поддерживалась в версии 6.0, хотя CodeView не поддерживал отладку COM до 1994, когда был выпущен следующий патч: cv41patch.exe. Улучшение производительности: Производительность MASM была улучшена двумя способами: более быстрая сборка и увеличение пространства символов. Версия ассемблера 5.0 значительно быстрее работает с большинством исходных файлов. Улучшение зависит от относительного объема кода и данных в исходном файле, а также от сложности используемых выражений. Пространство символов теперь ограничено только объемом системной памяти, доступной вашему компьютеру. Расширенная обработка ошибок: Сообщения были переформулированы/уточнены, улучшены или реорганизованы. Сообщения делятся на три уровня: серьезные ошибки, серьезные предупреждения и консультативные предупреждения. Уровень предупреждения можно изменить с помощью параметра /W. Ошибки проверки типов теперь являются серьезными предупреждениями, а не серьезными ошибками. При сборке сообщения выводятся на стандартное устройство вывода (по умолчанию — экран). Их можно перенаправить в файл или устройство. В версии 4.0 они отправлялись на устройство стандартной ошибки. Новые опции: Были добавлены следующие параметры командной строки: ОпцииОписание/W[0|1|2]Устанавливает уровень предупреждения, чтобы определить, какой тип сообщений будет отображаться. Эти три типа — серьезные ошибки, серьезные предупреждения и рекомендательные предупреждения./ZI и /ZDотправляет отладочную информацию для символьных отладчиков в объектный файл. Параметр /ZD выводит информацию о номере строки, тогда как параметр /ZI выводит как номер строки, так и информацию о типе./Hотображает командную строку и параметры MASM./Dsym[=val]позволяет определить символ из командной строки. Это усовершенствование текущего варианта./LAпараметр /LA был добавлен для указания полного списка всех символов, макросов и ложных условий. Это эквивалентно использованию директив .LIST, .LFCOND, .LALL и .CREF в исходном файле. Этот параметр отменяет любые конфликтующие директивы в исходном файле. ПРИМЕЧАНИЕ. Официально задокументированная в версии 5.1 новая функция по сравнению с версией 5.0, но это ошибка документации. Эта функция присутствует в версии 5.0, но описана только в README.DOC.Кроме того, добавлены новые директивы .ALPHA и .SEQ. Директивы имеют тот же эффект, что и параметры /A и /S. Переменные среды: MASM теперь поддерживает две переменные среды: MASM для указания параметров по умолчанию и INCLUDE для указания путей поиска для включаемых файлов. Строковые равенства: Строковые равенства были улучшены для упрощения использования. Заключив аргумент директивы EQU в угловые скобки, вы можете гарантировать, что аргумент оценивается как строковое выражение, а не как выражение. Оператор выражения (%) теперь можно использовать с аргументами макроса, которые являются текстовыми макросами, а также с аргументами, которые являются выражениями. Инструкции RETF и RETN: Теперь доступны инструкции RETF (возврат из FAR-процедуры) и RETN (возврат из NEAR-процедуры). Эти инструкции позволяют вам определять процедуры без директив PROC и ENDP. Общие переменные: MASM теперь позволяет вам объявлять общие переменные. Эти неинициализированные глобальные элементы данных можно использовать во включаемых файлах. Они совместимы с переменными, объявленными во включаемых файлах C. Подключаемые файлы библиотек: Директива INCLUDELIB позволяет вам указать в исходном файле сборки любые библиотеки, которые вы хотите связать с вашими программными модулями. Гибкое определение структур: Определения структур теперь могут включать операторы условной сборки, что обеспечивает более гибкие структуры. Новые файлы макросов: Файлы макросов были добавлены в пакет Macro Assembler. Предоставляются следующие файлы: MIXED.INCдля определения ассемблерных процедур, которые можно вызывать из языков высокого уровняMIXED.DOCдокументация по макросам в MIXED.INCDOS.INCдля вызова обычных прерываний DOSBIOS.INCдля вызова общих прерываний BIOS, используемых на IBM и IBM-совместимых компьютерахMACRO.DOCописание, синтаксис и ссылки на использование макросов в DOS.INC и BIOS.INC. Улучшения LINK: LINK имеет несколько новых функций. Эти улучшения кратко изложены ниже: Переменная среды LINK определяет параметры компоновщика по умолчанию. Переменная среды TMP указывает каталог, в котором LINK может создавать временные файлы, если ему не хватает памяти. Параметр /CODEVIEW помещает отладочную информацию в исполняемые файлы для отладчика CodeView. Параметр /INFORMATION отображает каждый шаг процесса связывания, включая анализ командной строки, этап 1 и т. д. Путь и имя каждого модуля отображаются по мере того, как модули связаны. Параметр /BATCH отключает интерфейс подсказок компоновщика, чтобы файлы make или пакетные файлы не останавливались из-за ошибок LINK. Параметр /QUICKLIB создает пользовательскую библиотеку для языка Microsoft Quick (например, QuickBASIC). Параметры /FARCALLTRANSLATION и /PACKCODE включают две оптимизации, которые могут ускорить код в определенных ситуациях. Следующее новое сообщение LINK предупреждает о действиях, которые является разрешенными в реальном режиме и неразрешенными в защищенном режиме: __warning L4003: intersegment self-relative fixup at <position>