Почему вдруг сборка 8086 с использованием MASM?
Ну, отчасти потому, что я люблю изучать произвольное устаревшее системное программирование, а отчасти потому, что наткнулась на эту книгу Стивена Хольцнера под названием «C с использованием языка ассемблера» (1989). . Автор использовал Quick C и Microsoft Micro Assembler для демонстрации вариантов использования. Так вот, я экспериментирую с вещами.

Настройка
Чтобы начать работу с MASM, нам потребуется DOSBOX (эмулятор DOS, совместимый с IBM PC) и файлы ассемблера MASM 8086.

Я использую Mac, поэтому мои инструкции будут для MacOS. Однако эти шаги по большей части одинаковы и для других платформ, так как наш любимый инструмент, DOSBOX, доступен и для других ОС.

Скачать DOSBOX отсюда.
Скачать ассемблер 8086 отсюда.

Скопируйте DOSBOX в Applications из файла образа диска.
Затем создайте папку с именем «dosbox» в своем домашнем каталоге.
Извлеките файлы 8086.zip в ~/dosbox.

Теперь запустите DOSBOX. Вы должны увидеть подсказку z:\›
Введите «mount c ~/dosbox/8086»
Z:\> mount c ~/dosbox/8086
Затем введите «c:», чтобы сменить диск.
Z:\> C: C:\>

Теперь вы готовы идти. Вы можете использовать утилиту «edit» для создания и редактирования новых ассемблерных файлов.
Например: «edit hello.asm»
Когда вы закончите писать код (вы можете попробовать фрагмент кода ниже), вам нужно собрать и связать перед выполнением.

Введите «masm hello.asm»
(Продолжайте нажимать Enter, чтобы обойти подсказки и использовать значения по умолчанию для других имен файлов)
Затем «link hello»
(Снова нажмите Enter пару раз)
Затем введите «hello.exe» и нажмите Enter, чтобы запустить программу.

Теперь перейдем к коду сборки.

Программы MASM обычно содержат два сегмента: CODE и DATA. Сегмент CODE содержит коды операций. Сегмент DATA содержит переменные.

В этом коде мы собираемся определить переменную с именем MSG, в которой будет храниться строка для печати. DB (Define Byte) — это директива, которая используется для резервирования байтов ячеек памяти в доступной памяти. «$» в конце объявления переменной используется для обозначения завершения строки.

В сегменте кода следующие два оператора (строки 12, 13) используются для инициализации сегмента DATA:

MOV AX, DATA
MOV DS, AX

Эти два утверждения должны использоваться во всех кодах MASM.

Строки с 15 по 17 используются для вывода строки.
Чтобы вывести строку в ассемблере 8086, мы загружаем адрес строки, оканчивающейся символом '$', в DX, а затем вызываем прерывание с кодом функции 09h в AH. MS-DOS предоставляет множество служб прерывания через INT 21H. Код функции 09h — только один из них (т. е. для вывода строки).

Строки 20, 21 используются для выхода из программы. В MS-DOS на 8086 мы сохраняем код возврата для программы в регистре AL. Затем мы вызываем прерывание с кодом функции 4Ch в AH. В строке 20 мы прямо перемещаем 4C00h в AX, что означает нормальный выход.

Ресурсы

http://www.shsu.edu/~csc_tjm/fall2002/cs272/intro_to_asm.html
https://www.csc.depauw.edu/~bhoward/asmtut/asmtut12.html#topic11
http://alpbyrs.blogspot.com/2015/06/assembly-language-programming.html