История MASM

Тема в разделе "WASM.ARTICLES", создана пользователем Mikl___, 28 дек 2023.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.4
    MACRO-861981DOSM86.EXE
    MASM 1.0 IBM1981DOS12/07/1981 10:00pmMASM.EXE66k
    MASM 1.01981DOS02/05/1982 12:49pmM.EXE66k
    MASM 1.061982DOS02/08/1982MASM.EXE69k
    MASM 1.101982DOS02/01/1983 01:13pmMASM.EXE76k
    MASM 1.251983DOS08/25/1982MASM.EXE79k
    MASM 1.271984DOS11/27/1984 09:25amMASM.EXE79k
    MASM 2.0 IBM1984DOS07/18/1984 12:01pmMASM.EXE75k
    MASM 2.041982DOS03/02/1982MASM.EXE66k
    MASM 3.01984DOS11/21/1984 02:49pmMASM.EXE76k
    MASM 3.011984DOS11/21/1984 02:49pmMASM.EXE76k
    MASM 4.01985DOS10/16/1985 04:00amMASM.EXE84k
    MASM 4.011985DOS07/24/1987 12:00amMASM401.EXE100k
    MASM 5.01987DOS07/31/1987 12:00amMASM.EXE101k
    MASM/2 1.0 IBM1987OS/2, DOS09/03/1987 04:00pmMASM.EXE112k
    MASM 5.101988DOS, OS/202/01/1988 01:00pmMASM.EXE108k5.10
    MASM 5.10A1989DOS, OS/201/16/1989 11:10amMASM.EXE108k5.10
    MASM 5.10B1989DOS, OS/201/04/1992 12:52pmMASM5.EXE109k5.10
    QuickAssembler1990DOS
    MASM386 5.NT.021989WIN3211/01/1993 06:28amMASM386.EXE207k5.103.10.508.1
    MASM 6.01991DOS, OS/204/03/1991 02:59pmML.EXE239k6.00
    MASM 6.00A
    MASM 6.00B1992DOS, OS/203/18/1992 05:31pmML.EXE244k6.00
    MASM 6.11992DOS, WIN3211/16/1992 04:00pmML.EXE352k6.10
    MASM 6.1a1992DOS, WIN3203/12/1993 01:59pmML.EXE353k6.10
    MASM 6.111993DOS, WIN3209/24/1993 08:25amML.EXE380k6.11
    MASM 6.11a1994DOS, WIN3203/21/1994 12:22pmML.EXE374k6.11
    MASM 6.11c1994DOS, WIN3208/25/1994 06:30pmML.EXE373k6.11
    MASM 6.11d1995DOS, WIN3209/19/1995 01:18pmML.EXE379k6.11
    MASM 6.121997WIN3208/27/1997 03:49pmML.EXE358k6.126.12.7164
    MASM 6.131997WIN3212/05/1997 01:43pmML.EXE344k6.136.13.7299
    MASM 6.141997WIN3204/12/1999 03:05pmML.EXE364k6.146.14.8444
    MASM 6.152000WIN3203/16/2000 03:20pmml.exe376k6.156.15.8803
    MASM 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.1
    MASM 8.0WIN32/ WIN6404/21/2006 06:11pmml.exe342k8.008.00.50727.104 / VS 2005 8.0 EXPRESS, PRO & ACADEMIC
    MASM 9.0WIN32/ WIN6407/30/2008 12:05pmml.exe353k9.009.00.30729.01 / VS 2008 9.0 (any*) / Win32
    MASM 10.0WIN32/ WIN6403/19/2010 02:02pmml.exe38810.0010.00.30319.01 / Win32
    MASM 11.0WIN32/ WIN6407/26/2012 07:08pmml.exe424k11.0011.00.50727.1 / Win32
    MASM 12.0WIN32/ WIN6410/05/2013 02:38amml.exe429k12.0012.00.21005.1 из VS 2013 Express for Desktop / Win32
    MASM 14.0WIN32/ WIN6406/25/2015 11:34pmml.exe436k14.0014.00.23026.0 из VS 2015 Community 14.0.23107.0 D14REL / Win32
    MASM 14.12017WIN32/ WIN6407/21/2017 05:22pmml.exe438k14.1014.10.25019.0 из VS 2017 Community
    MASM 14.22019WIN64ml64.exe14.2014.27.29112/0 из VS 2019 Community
    MASM 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.0STRUC
    ASSUME.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.0EVEN
    DOSSEG5.0.386P5.06DF/FWORD5.0LABEL
    .DOSSEG6.0.3875.06DP/PWORD5.0ORG
    END.4866.08DQ/QWORD5.0ENDS
    ENDS.486P6.08SQWORD8.0
    EVENT.5866.118REAL86.0
    .EXIT6.0.586P6.118MMWORD8.0
    .FARDATA?5.0.6866.1210DT/TBYTE5.0
    .FARDATA5.0.686P6.1210REAL106.0
    GROUP.80862.0-9.016OWORD6.14
    LABEL.80872.0-9.016XMMWORD8.0
    .MODEL5.0.K3D6.1332YMMWORD10.0
    ORG.MMX6.1264ZMMWORD10.0
    SEGMENT.NO876.0-9.0
    .SEQ5.0.XMM6.14
    .STACK5.0
    .STARTUP5.0
    Макросы/ПроцедурыСтроковые операцииScope/Module
    Ключевое
    слово​
    ВерсияКлючевое
    слово​
    ВерсияКлючевое
    слово​
    Версия
    .ALLOCSTACK (x64)8.0CATSTR5.10ALIAS6.11
    ENDMINSTR5.10COMM5.0
    ENDPSIZESTR5.10COMMENT
    .ENDPROLOG (x64)8.0SUBSTR5.10EXTERN
    EXITMДирективы
    эквивалентности
    и присваивания​
    EXTERNDEF6.0
    .FPO5.10.NT,
    6.11A, 8.0​
    =EXTERN6.0
    GOTO6.0EQUINCLUDE
    INVOKE6.0TEXTEQU6.0INCLUDELIB6.0
    LOCALБлоки
    повторения​
    NAME⩽4.0
    ignored 5.0+​
    MACROENDMPUBLIC
    PROCFOR6.0Options/Echoing
    PROTO6.0FORC6.0ECHO6.0
    PURGEGOTO6.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.0
    USES5.10
    Условное
    ассемблирование
    Условное выполнениеУправление листингом
    Ключевое
    слово​
    ВерсияКлючевое
    слово​
    ВерсияКлючевое
    слово​
    Версия
    ELSE.BREAK6.0.CREF
    ELSEIF5.10.CONTINUE6.0.LALL
    ELSEIF15.10.ELSE6.0.LFCOND
    ELSEIF25.10.ELSEIF6.0.LIST
    ELSEIFB5.10.ENDW6.0.LISTALL6.0
    ELSEIFDEF5.10.IF6.0.LISTIFF6.0
    ELSEIFDIF5.10.REPEAT6.0.LISTMACRO6.0
    ELSEIFDIFI5.10.UNTIL6.0.LISTMACROALL6.0
    ELSEIFE5.10.UNTILCXZ6.0.NOCREF6.0
    ELSEIFIDN5.10.WHILE6.0.NOLIST6.0
    ELSEIFIDNI5.10Условные ошибки.NOLISTIF6.0
    ENDIF.ERR4.0.NOLISTMACRO6.0
    IF.ERR14.0PAGE
    IF1.ERR24.0.SALL
    IF2.ERRB4.0.SFCOND
    IFB.ERRDEF4.0SUBTITLE6.0
    IFDEF.ERRDIF4.0SUBTTL5.10
    IFDIF.ERRDIFI5.0.TFCOND
    IFDIFI5.0.ERRE4.0TITLE
    IFE.ERRIDN4.0.XALL
    IFIDN.ERRIDNI5.0.XCREF5.10
    IFIDNI5.0.ERRNB4.0.XLIST5.10
    IFNB.ERRNDEF4.0
    IFNDEF.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.10
    HIGHWORD6.0DWORD;
    LENGTHFLAT6.0[ ]
    LENGTHOF6.0IMAGEREL8.0CARRY?6.0
    LOWLROFFSET6.0DUP
    LOW328.0MEMORYOVERFLOW?6.0
    LOWWORD6.0OFFSETPARITY?6.0
    MASKPAGESIGN?6.0
    NEARPARAZERO?6.0
    OPATTR6.0PRIVATE6.0Relation
    PTRPUBLICEQ
    SHORTSECTIONREL8.0GE
    SIZESEGGT
    SIZEOF6.0STACKLE
    THISUSE16LT
    .TYPEUSE32NE
    TYPEWORD
    WIDTH
     
    Последнее редактирование: 10 мар 2024
    Vagners, Thetrik, Win32Api и ещё 1-му нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Арифметические
    операции​
    Управляющие
    операторы​
    Логические
    операции
    и сдвиги​
    *!AND
    +!=NOT
    .&OR
    /&&SHL
    MOD<SHR
    Макро<=XOR
    !==
    %>
    &>=
    ;;||
    < >

    Регистры, языковые соглашения, модели памяти


    РегистрыMMX-регистрыСегментные
    регистры​
    6432168H8LКлючевые
    слова​
    ВерсияКлючевые
    слова​
    Версия
    Ключевые словаMM06.12CS
    Регистры общего назначенияMM16.12DS
    RAXEAXAXAHALMM26.12ES
    RBXEBXBXBHBLMM36.12FS5.0
    RCXECXCXCHCLMM46.12GS5.0
    RDXEDXDXDHDLMM56.12SS
    RDIEDIDIDILMM66.12Управляющие
    регистры​
    RSIESISISILMM76.12CR05.0
    RBPEBPBPBPLFPU-регистрыCR25.0
    RSPESPSPSPLSTCR35.0
    R8R8DR8WR8BST1CR45.0
    . . .ST2Тестовые регистры
    R15R15DR15WR15BST3TR35.0
    Регистр командST4TR45.0
    RIPEIPIPST5TR55.0
    Регистр флаговST6TR65.0
    RFLAGSEFLAGSFLAGSST7TR75.0
     
    Последнее редактирование: 27 янв 2024
    Vagners, alex_dz, Marylin и ещё 1-му нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Языковые соглашениярегистрыМодели памяти
    Ключевые
    слова​
    ВерсияКлючевые
    слова​
    ВерсияКлючевые
    слова​
    Версия
    BASIC5.10SSE2-регистрыCOMPACT5.0
    C5.10XMM06.14FLAT6.0
    FORTRAN5.10. . .HUGE5.0
    PASCAL5.10XMM156.14LARGE5.0
    FASTCALLAVX/AVX2-регистрыMEDIUM5.0
    STDCALL6.00BYMM010.0SMALL5.0
    SYSCALL6.0. . .TINY6.0
    Отладочные регистрыYMM1510.0
    DR05.0AVX-512 регистры
    DR15.0ZMM0
    DR25.0. . .
    DR35.0ZMM31
    DR65.0
    DR75.0
     

    Вложения:

    Последнее редактирование: 27 янв 2024
    Vagners, alex_dz, TrashGen и ещё 1-му нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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 уровней».
     

    Вложения:

    Последнее редактирование: 27 янв 2024
    k3rnl и alex_dz нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.
     
    Последнее редактирование: 27 янв 2024
    k3rnl и alex_dz нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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 Диск
    [​IMG]
     

    Вложения:

    Последнее редактирование: 27 янв 2024
    k3rnl нравится это.
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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 и более поздние версии
     

    Вложения:

    Последнее редактирование: 27 янв 2024
    Win32Api нравится это.
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.
     

    Вложения:

    Последнее редактирование: 27 янв 2024
    k3rnl и Win32Api нравится это.
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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+.
     

    Вложения:

    Последнее редактирование: 27 янв 2024
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Я разжился в свое время двумя книжками IBM - первое издание MASM и второе,

    это фотки книжки от первого:
    IMG_20240104_142423.jpg IMG_20240104_142452.jpg IMG_20240104_142505.jpg IMG_20240104_142518.jpg
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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 и дополнительные исправления.
     

    Вложения:

    Последнее редактирование: 27 янв 2024
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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 исправлены
     
    Последнее редактирование: 10 фев 2024
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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
    00.jpg 01.jpg 02.jpg 03.jpg 04.jpg 05.jpg
    Статья: "Ассемблер — чертовски сложный язык" Обзор IBM MASM 2.0, Microsoft MASM 3.0 и Pasm86 Phoenix BIOS. "Журнал ПК" 29 октября 1985
     
    Последнее редактирование: 10 фев 2024
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.
     
    Последнее редактирование: 27 янв 2024
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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
     
    Последнее редактирование: 27 янв 2024
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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).
     
    Последнее редактирование: 27 янв 2024
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.
    [​IMG]
    [​IMG]
    [​IMG]
    Эрик Кохейн (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).
    [​IMG] [​IMG]
    Руководство по MASM 4.0 и образы дисков 360 КБ
    masm_ad_1985.jpg
    Винтажная реклама MASM из журнала Computer Language Выпуск 11 - июль 1985 (предположительно версия 4.0)
    Информационные бюллетени Microsoft Languages, опубликованные в журнале PC Tech Journal Фрагменты о MASM 4.0:
    masm_pctj_198601_masm4_written_in_c.jpg
    январь 1986
    masm_pctj_198605_masm4_good_for_cullinet.jpg
    май 1986
    masm_pctj_198705_masm4_abs_tip.jpg
    май 1987
     
    Последнее редактирование: 8 фев 2024
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    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.
     
    Последнее редактирование: 27 янв 2024
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780

    MASM 5.0 © 1981-1985, 1987

    НазваниеРазмер
    (байт)
    md5Дата
    MASM.EXE103175781113d15ee597108af0cde54bd1698d7/31/1987 12:00am
    Первая версия MASM, способная отображать справку из командной строки при запуске с параметром /H.
    [​IMG]
    Добавлена поддержка процессора 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 Root
    WHAT.ASMBA.ASMPAGER.ASM
    RUNME.BATCA.ASMSHOW.ASM
    SETUP.BATFA.ASMDEMO.BAT
    SETUP2.BATPA.ASMRUNME.BAT
    README.DOCPOWER2.ASME_AUTO.CV
    CREF.EXEBAMAIN.BASM_AUTO.CV
    ERROUT.EXECAMAIN.CQ_AUTO.CV
    EXEMOD.EXEFAMAIN.FORU_AUTO.CV
    LIB.EXEPAMAIN.PASW_AUTO.CV
    LINK.EXEMIXED.DOCCV.HLP
    MAKE.EXEMIXED.INCCV.EXE
    MASM.EXEEXEPACK.EXE
    SETENV.EXESHOW.EXE
    SHOW.EXEWHAT.EXE
    WHAT.EXEMACRO.DOC
    PACKING.LSTBIOS.INC
    \MIXEDDOS.INC
    MOUSE.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 обычно наиболее эффективна.
     
    Последнее редактирование: 27 янв 2024
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.780
    Если вы пишете ассемблерную программу для языка высокого уровня, модель памяти должна соответствовать модели памяти, используемой компилятором или интерпретатором. Если вы пишете отдельную программу на ассемблере, вы можете использовать любую модель. 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, сегменты имеют следующий порядок:
      1. Все имена сегментов, имеющие имя класса «CODE».
      2. Любые сегменты, которые не имеют имени класса «CODE» и не являются частью группы DGROUP.
      3. Сегменты, входящие в состав 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.
    Имена сегментов по умолчанию:
    Если вы используете упрощенные директивы сегмента сами по себе, вам не нужно знать имена, присвоенные каждому сегменту. Однако можно смешивать полные определения сегментов с упрощенными определениями сегментов. Поэтому некоторые программисты могут захотеть узнать фактические имена, присвоенные всем сегментам. В таблице ниже показаны имена сегментов по умолчанию, созданные каждой директивой.
    ModelDirectiveNameAlignCombineClassGroup
    Small.CODE_TEXTWORDPUBLIC'CODE'
    .DATA_DATAWORDPUBLIC'DATA'DGROUP
    .CONSTCONSTWORDPUBLIC'CONST'DGROUP
    .DATA?_BSSWORDPUBLIC'BSS'DGROUP
    .STACKSTACKPARASTACK'STACK'DGROUP
    Medium.CODEname_TEXTWORDPUBLIC'CODE'
    .DATA_DATAWORDPUBLIC'DATA'DGROUP
    .CONSTCONSTWORDPUBLIC'CONST'DGROUP
    .DATA?_BSSWORDPUBLIC'BSS'DGROUP
    .STACKSTACKPARASTACK'STACK'DGROUP
    Compact.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'DGROUP
    Large или 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:
    1. соберите с помощью MASM, чтобы получить OBJ-файл
      masm example.asm;
    2. линкуем OBJ-файл, чтобы создать фиктивный EXE-файл (игнорируйте предупреждение компоновщика «L4021: нет сегмента стека»)
      link example.obj;
    3. запустите 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.INC
      DOS.INCдля вызова обычных прерываний DOS
      BIOS.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>
     
    Последнее редактирование: 27 янв 2024